Flutter GitHub OAuth认证插件github_oauth的使用

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

Flutter GitHub OAuth认证插件github_oauth的使用

github_oauth 是一个Flutter包,它简化了将GitHub OAuth身份验证集成到您的应用程序中的过程。通过这个包,您可以提供无缝的GitHub登录体验,处理令牌交换,并安全地验证用户。

功能

  • 完整的OAuth2流程:处理从用户登录到令牌检索的整个GitHub OAuth过程。
  • 可自定义的UI:自定义登录页面标题和WebView配置,以匹配您应用的品牌。
  • WebView集成:提供原生WebView,确保平滑的登录体验。
  • 安全的令牌处理:安全地检索和管理GitHub访问令牌。
  • 全面的错误处理:在OAuth过程中管理错误。

安装

pubspec.yaml 文件中添加 github_oauth

dependencies:
  github_oauth: latest_version

然后运行 flutter pub get 来安装该包。

使用

1. 设置GitHub OAuth应用

要使用GitHub OAuth,您需要在GitHub上设置一个OAuth应用。请按照以下步骤操作:

  1. 进入GitHub开发者设置。
  2. 注册一个新的OAuth应用。
  3. 设置您的应用重定向URI(例如 yourapp://callback)。
2. 配置GitHubSignIn

导入包并使用您的GitHub OAuth凭证初始化 GitHubSignIn。建议使用 dotenv 包来管理敏感信息:

import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:github_oauth/github_oauth.dart';

final gitHubSignIn = GitHubSignIn(
  clientId: dotenv.env['GITHUB_CLIENT_ID']!,
  clientSecret: dotenv.env['GITHUB_CLIENT_SECRET']!,
  redirectUrl: dotenv.env['GITHUB_REDIRECT_URL']!,
);
3. 使用GitHub登录

调用 signIn 方法以触发OAuth流程:

void _signInWithGitHub(BuildContext context) async {
  final result = await gitHubSignIn.signIn(context);

  if (result.status == GitHubSignInResultStatus.ok) {
    // 成功登录
    print("Access Token: ${result.token}");
    print("User Profile: ${result.userProfile}");
  } else {
    // 处理错误
    print("登录失败: ${result.errorMessage}");
  }
}
4. 自定义WebView

您可以通过向 GitHubSignInPage 传递额外参数来自定义登录过程中使用的WebView:

GitHubSignInPage(
  url: 'authorization-url',
  redirectUrl: 'redirect-url',
  title: '使用GitHub登录',
  userAgent: 'Custom User Agent',
  clearCache: true,
);

示例

以下是一个完整的示例,展示了如何使用 github_oauth 包:

import 'package:flutter/material.dart';
import 'package:github_oauth/github_oauth.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

void main() async {
  await dotenv.load(); // 加载环境变量
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SignInPage(),
    );
  }
}

class SignInPage extends StatelessWidget {
  final GitHubSignIn githubSignIn = GitHubSignIn(
    clientId: dotenv.env['GITHUB_CLIENT_ID']!,
    clientSecret: dotenv.env['GITHUB_CLIENT_SECRET']!,
    redirectUrl: dotenv.env['GITHUB_REDIRECT_URL']!,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('GitHub OAuth示例')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            final result = await githubSignIn.signIn(context);

            if (result.status == GitHubSignInResultStatus.ok) {
              // 成功登录
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('Token: ${result.token}')),
              );
            } else {
              // 错误处理
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('错误: ${result.errorMessage}')),
              );
            }
          },
          child: const Text('使用GitHub登录'),
        ),
      ),
    );
  }
}

错误处理

GitHubSignInResult 包含状态和错误消息,可以帮助您处理各种场景:

if (result.status == GitHubSignInResultStatus.ok) {
  // 成功登录
} else if (result.status == GitHubSignInResultStatus.cancelled) {
  // 用户取消了登录过程
} else {
  // 登录失败
  print('错误: ${result.errorMessage}');
}

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

1 回复

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


当然,以下是如何在Flutter应用中使用github_oauth插件进行GitHub OAuth认证的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了github_oauth依赖:

dependencies:
  flutter:
    sdk: flutter
  github_oauth: ^0.4.0  # 请检查最新版本号

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

接下来,你需要配置GitHub OAuth应用。在GitHub的设置中创建一个新的OAuth应用,获取CLIENT_IDCLIENT_SECRET

下面是一个完整的Flutter应用示例,演示如何使用github_oauth插件进行OAuth认证:

import 'package:flutter/material.dart';
import 'package:github_oauth/github_oauth.dart';
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GitHub OAuth Example'),
        ),
        body: Center(
          child: GitHubOAuthButton(),
        ),
      ),
    );
  }
}

class GitHubOAuthButton extends StatefulWidget {
  @override
  _GitHubOAuthButtonState createState() => _GitHubOAuthButtonState();
}

class _GitHubOAuthButtonState extends State<GitHubOAuthButton> {
  String _accessToken;
  String _userName;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        // 替换为你的CLIENT_ID和CLIENT_SECRET
        final clientId = 'YOUR_CLIENT_ID';
        final clientSecret = 'YOUR_CLIENT_SECRET';

        // 创建GitHubOAuth实例
        final githubOAuth = GitHubOAuth(
          clientId: clientId,
          clientSecret: clientSecret,
          redirectUri: Uri.parse('YOUR_REDIRECT_URI'), // 你的回调URI
        );

        try {
          // 发起OAuth认证
          final result = await githubOAuth.authorize();

          // 获取access token
          setState(() {
            _accessToken = result.accessToken;
            print('Access Token: $_accessToken');
          });

          // 使用access token获取用户信息
          final userResponse = await http.get(
            Uri.parse('https://api.github.com/user'),
            headers: <String, String>{
              'Authorization': 'Bearer $_accessToken',
            },
          );

          if (userResponse.statusCode == 200) {
            final userData = jsonDecode(userResponse.body);
            setState(() {
              _userName = userData['login'];
              print('User Name: $_userName');
            });
          } else {
            print('Failed to fetch user data');
          }
        } catch (e) {
          print('Error: $e');
        }
      },
      child: Text('Login with GitHub'),
    );
  }
}

注意事项:

  1. 替换占位符:确保将YOUR_CLIENT_IDYOUR_CLIENT_SECRETYOUR_REDIRECT_URI替换为你从GitHub OAuth应用设置中获取的实际值。
  2. 回调URIredirectUri应该与你在GitHub OAuth应用设置中配置的回调URI匹配。通常,你可以使用urn:ietf:wg:oauth:2.0:oob进行测试,但在生产环境中应使用有效的URI。
  3. 错误处理:示例代码中没有详细的错误处理,实际项目中应该添加适当的错误处理逻辑。
  4. 依赖版本:确保使用的是github_oauth插件的最新稳定版本。

这个示例展示了如何使用github_oauth插件在Flutter应用中实现GitHub OAuth认证,并获取用户的基本信息。你可以根据需要进行扩展和修改。

回到顶部