Flutter OAuth与OIDC认证插件firebase_ui_oauth_oidc的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter OAuth与OIDC认证插件firebase_ui_oauth_oidc的使用

安装

添加依赖:

flutter pub add firebase_ui_auth
flutter pub add firebase_ui_oauth_oidc

flutter pub global activate flutterfire_cli
flutterfire configure

在Firebase控制台中启用OIDC提供程序。

使用

以下是一个完整的示例,展示了如何使用firebase_ui_oauth_oidc插件进行OAuth与OIDC认证。

示例1

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_ui_auth/firebase_ui_auth.dart';
import 'package:firebase_ui_oauth_oidc/firebase_ui_oauth_oidc.dart';
import 'package:flutter/material.dart';

import 'example_button_style.dart';
import 'firebase_options.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  FirebaseUIAuth.configureProviders([
    OidcProvider(providerId: 'oidc.example', style: const ExampleButtonStyle()),
  ]);

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SignInScreen(
        actions: [
          AuthStateChangeAction<SignedIn>((context, state) {
            // 在此处处理用户登录后的操作
          }),
        ],
      ),
    );
  }
}

示例2

你也可以使用OAuthProviderButton来实现同样的功能。

import 'package:firebase_ui_auth/firebase_ui_auth.dart';
import 'package:firebase_ui_oauth_oidc/firebase_ui_oauth_oidc.dart';
import 'package:flutter/material.dart';

import 'example_button_style.dart';

class MyScreen extends StatelessWidget {
  const MyScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return AuthStateListener<OAuthController>(
      listener: (oldState, newState, controller) {
        if (newState is SignedIn) {
          // 用户登录后跳转到其他屏幕
          return true;
        }
        return false;
      },
      child: OAuthProviderButton(
        provider: OidcProvider(
          providerId: 'oidc.example',
          style: const ExampleButtonStyle(),
        ),
      ),
    );
  }
}

示例3

此外,还有一个独立版本的OidcSignInButton

import 'package:firebase_ui_oauth_oidc/firebase_ui_oauth_oidc.dart';
import 'package:flutter/material.dart';

import 'example_button_style.dart';

class MyScreen extends StatelessWidget {
  const MyScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return OidcSignInButton(
      providerId: 'oidc.example',
      style: const ExampleButtonStyle(),
      loadingIndicator: const CircularProgressIndicator(),
      onSignedIn: (credential) {
        // 在此处处理用户登录后的操作
      },
    );
  }
}

样式

创建一个自定义样式用于OIDC按钮。

import 'package:firebase_ui_oauth_oidc/firebase_ui_oauth_oidc.dart';
import 'package:flutter/material.dart';

const _backgroundColor = ThemedColor(Colors.black, Colors.white);
const _color = ThemedColor(Colors.white, Colors.black);

const _dartIconSvgLight = '''
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="188 251.8 110.5 110.5" enable-background="new 188 251.8 415.8 110.5" xml:space="preserve" width="110.5" height="110.5">
<path d="m217.7,281.7-7.1,-7.1v51.2l0.1,2.4c0,1.1 0.2,2.4 0.6,3.7l56.2,19.8 14,-6.2v0z" id="path2" style="fill:#00c4b3" />
<path d="m211.3,331.9v0c0,0 0,0 0,0 0,0 0,0 0,0zm70.2,13.6-14,6.2-56.1,-19.8c1.1,4.1 3.4,8.7 6,11.3l18.3,18.2 40.8,0.1z" id="path4" style="fill:#22d3c5" />
<path d="m210.8,274.6-21.8,33c-1.8,1.9-0.9,5.9 2,8.9l12.6,12.7 7.9,2.8c-0.3,-1.3-0.6,-2.6-0.6,-3.7l-0.1,-2.4z" id="path6" style="fill:#0075c9" />
<path d="m267.9,275.2c-1.3,-0.3-2.6,-0.5-3.7,-0.6l-2.5,-0.1h-51.1l70.9,70.9v0l6.2,-14z" id="path8" style="fill:#0075c9" />
<path d="m267.8,275.2c0.1,0 0.1,0 0,0v0c0.1,0 0.1,0 0,0zm11.4,6c-2.6,-2.6-7.1,-5-11.3,-6l19.8,56.2-6.2,14v0l15.2,-4.9v-41.7z" id="path10" style="fill:#00a8e1" />
<path d="m265.1,267.4-12.7,-12.6c-2.9,-2.9-6.9,-3.8-8.9,-2l-33,21.8h51.1l2.5,0.1c1.1,0 2.4,0.2 3.7,0.6z" id="path12" style="fill:#00c4b3" />
</svg>
''';

// 实际上这里使用的是深色版本的SVG图标
const _dartIconSvgDark = _dartIconSvgLight;

const _dartIconSrc = ThemedIconSrc(_dartIconSvgLight, _dartIconSvgDark);

class ExampleButtonStyle extends OidcProviderButtonStyle {
  const ExampleButtonStyle();

  [@override](/user/override)
  ThemedColor get backgroundColor => _backgroundColor;

  [@override](/user/override)
  ThemedColor get color => _color;

  [@override](/user/override)
  ThemedIconSrc get iconSrc => _dartIconSrc;

  [@override](/user/override)
  double get iconPadding => 6;

  [@override](/user/override)
  String get label => 'Sign in with pub.dev';
}

更多关于Flutter OAuth与OIDC认证插件firebase_ui_oauth_oidc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter OAuth与OIDC认证插件firebase_ui_oauth_oidc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter项目中使用firebase_ui_oauth_oidc插件来实现OAuth与OIDC认证,以下是一个基本的使用示例。这个示例将展示如何配置和使用该插件进行认证。

首先,确保你的Flutter项目已经添加了firebase_ui_oauth_oidc依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.10.0  # 确保你使用的是兼容的版本
  firebase_auth: ^3.3.3  # 确保你使用的是兼容的版本
  firebase_ui_oauth_oidc: ^0.2.0  # 使用最新版本,版本号可能会更新

然后运行flutter pub get来安装依赖。

接下来,你需要在你的Firebase项目中配置OAuth和OIDC提供者。这通常涉及在Firebase控制台中设置授权提供者,并获取客户端ID和客户端密钥。

在你的Flutter应用中,你可以按照以下步骤进行配置和使用:

  1. 初始化Firebase

在你的应用入口文件(通常是main.dart)中初始化Firebase。

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_ui_oauth_oidc/firebase_ui_oauth_oidc.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
  1. 配置OAuth/OIDC提供者

你需要配置OAuthProviderConfig对象,这个对象包含了认证所需的详细信息,如提供者ID、客户端ID、客户端密钥、授权端点和令牌端点等。

final OAuthProviderConfig oidcConfig = OAuthProviderConfig(
  providerId: 'google.com',  // 替换为你的提供者ID,例如 'google.com' 或 'microsoft.com'
  clientId: 'YOUR_CLIENT_ID',  // 替换为你的客户端ID
  clientSecret: 'YOUR_CLIENT_SECRET',  // 如果需要的话,替换为你的客户端密钥(有些提供者不需要)
  scopes: ['openid', 'email', 'profile'],  // 你请求的权限范围
  authorizationEndpoint: 'https://accounts.google.com/o/oauth2/auth',  // 替换为你的授权端点
  tokenEndpoint: 'https://oauth2.googleapis.com/token',  // 替换为你的令牌端点
  redirectUri: Uri.parse('YOUR_REDIRECT_URI'),  // 替换为你的重定向URI
);
  1. 使用Firebase UI OAuth/OIDC插件进行认证

你可以使用FirebaseAuth.instance.signInWithPopup方法来启动认证流程。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Firebase UI OAuth/OIDC Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                UserCredential result = await FirebaseAuth.instance.signInWithPopup(
                  webPopupRedirectResolver: OAuthProvider(providerId: oidcConfig.providerId).credential(
                    idToken: null,
                    accessToken: null,
                    additionalParameters: {
                      'redirect_uri': oidcConfig.redirectUri.toString(),
                      'client_id': oidcConfig.clientId,
                      'scope': oidcConfig.scopes.join(' '),
                      'response_type': 'code',
                      'authorization_endpoint': oidcConfig.authorizationEndpoint,
                    },
                  ),
                );
                User? user = result.user;
                if (user != null) {
                  print('User signed in: ${user.uid}');
                }
              } catch (e) {
                print('Error signing in: $e');
              }
            },
            child: Text('Sign in with OAuth/OIDC'),
          ),
        ),
      ),
    );
  }
}

注意

  • 上面的代码示例是为了展示如何配置和使用firebase_ui_oauth_oidc插件。在实际应用中,你可能需要根据你的提供者调整一些配置参数。
  • 对于某些提供者(如Google),你可能不需要提供clientSecret,因为它们是公开的客户端。
  • 确保你的重定向URI在Firebase控制台和提供者控制台中都已正确配置。
  • firebase_ui_oauth_oidc插件的具体使用方法和API可能会随着版本的更新而变化,请参考最新的官方文档和示例代码。

这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改。

回到顶部