首页 > 解决方案 > Flutter web Firebase 身份验证 URL 重定向

问题描述

我有一个关于 Flutter 导航与 Firebase Auth 结合的问题。在我的代码中,有一个 AuthenticationWrapper 来检查用户是否登录。如果用户登录,则导航到主页,当用户未登录时,导航到登录页面。

问题是当我更改网页的 URL 时

来自:http://localhost/

到:http://localhost/home。

它无需登录即可进入主页。我想要的是重定向到登录页面。

我怎样才能做到这一点?我很想听听您对这个问题的意见。提前致谢!

主要飞镖:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:rsm/Screens/screen2.dart';
import 'package:rsm/Screens/sign_in_page.dart';
import 'package:rsm/Screens/home_page.dart';
import 'package:rsm/Auth/authentication_service.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter/widgets.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          Provider<AuthenticationService>(
            create: (_) => AuthenticationService(FirebaseAuth.instance),
          ),
          StreamProvider(
            create: (context) =>
                context.read<AuthenticationService>().authStateChanges,
            initialData: null,
          ),
        ],
        child: MaterialApp(
          title: 'name',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          routes: {
            // When navigating to the "/" route, build the FirstScreen widget.
            '/signin': (context) => SignInPage(),
            // When navigating to the "/second" route, build the SecondScreen widget.
            '/home': (context) => HomePage(),
            '/screen2': (context) => Screen2(),
          },
          home: AuthenticationWrapper(),
        ));
  }
}

class AuthenticationWrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final firebaseUser = context.watch<User?>();
    if (firebaseUser != null) {
      //print(firebaseUser);
      // Page after loggin in
      return HomePage();
    }
    // Sign in page
    return SignInPage();
  }
}

AuthenticationService.dart:

import 'package:firebase_auth/firebase_auth.dart';

class AuthenticationService {
  final FirebaseAuth _firebaseAuth;

  AuthenticationService(this._firebaseAuth);

  Stream<User?> get authStateChanges => _firebaseAuth.idTokenChanges();

  Future<void> signOut() async {
    await _firebaseAuth.signOut();
  }

  Future<String?> signIn(
      {required String email, required String password}) async {
    try {
      await _firebaseAuth.signInWithEmailAndPassword(
          email: email, password: password);
      return "Signed in";
    } on FirebaseAuthException catch (e) {
      return e.message;
    }
  }

  Future<String?> signUp(
      {required String email, required String password}) async {
    try {
      await _firebaseAuth.createUserWithEmailAndPassword(
          email: email, password: password);
      return "Signed up";
    } on FirebaseAuthException catch (e) {
      return e.message;
    }
  }

  Future<void> sendPasswordResetMail(String email) async {
    await _firebaseAuth.sendPasswordResetEmail(email: email);
    return null;
  }
}

标签: firebaseflutterdartfirebase-authenticationflutter-web

解决方案


推荐阅读