Flutter社交媒体认证插件facebook_auth的使用

Flutter社交媒体认证插件facebook_auth的使用

配置

假设你的Facebook应用ID为1234567890,客户端令牌为abcde12345,应用名称为My App

Android

官方文档:https://developers.facebook.com/docs/facebook-login/android/

android/app/src/main/res/values/strings.xml文件中定义以下字符串资源:

<string name="facebook_app_id">1234567890</string>
<string name="fb_login_protocol_scheme">fb1234567890</string>
<string name="facebook_client_token">abcde12345</string>

AndroidManifest.xml文件中添加以下内容:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:label="myapp"
        android:icon="@mipmap/ic_launcher">
        <!-- Facebook应用ID和令牌 -->
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
        <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
        <!-- Facebook Chrome Custom Tabs -->
        <activity android:name="com.facebook.FacebookActivity"
                  android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
                  android:label="${applicationLabel}" />
        <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>
        <!-- Facebook Chrome Custom Tabs结束 -->
    </application>
</manifest>
iOS

官方文档:https://developers.facebook.com/docs/facebook-login/ios/

Info.plist文件中添加以下内容:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb1234567890</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>1234567890</string>
<key>FacebookClientToken</key>
<string>abcde12345</string>
<key>FacebookDisplayName</key>
<string>My App</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
</array>

使用

  1. 将插件添加到pubspec.yaml文件中:
dependencies:
  facebook_auth: ^x.y.z

运行flutter pub get命令以获取依赖项。

  1. 在Dart代码中导入插件:
import 'package:facebook_auth/facebook_auth.dart';
  1. 进行用户认证:
FacebookAuth().login(['public_profile', 'email']);

此函数返回一个包含以下信息的Future对象:

{
  'token': String,
  'userId': String,
  'expires': int, // 时间戳(自1970年1月1日以来的毫秒数)
  'applicationId': String,
  'lastRefresh': int, // 时间戳(自1970年1月1日以来的毫秒数)
  'isExpired': Boolean,
  'grantedPermissions': List<String>,
  'declinedPermissions': List<String>,
  'dataAccessExpirationTime': int // 时间戳(自1970年1月1日以来的毫秒数)
}
  1. 登出用户:
FacebookAuth().logout();
  1. 处理可能的错误:
try {
  return {'idToken': await FacebookAuth().login(permissions)};
} on PlatformException catch (e) {
  if (e.code == 'USER_CANCELLED') {
    throw AppError('用户已取消');
  }
  rethrow;
}

SDK版本

Android
implementation 'com.facebook.android:facebook-login:16.0.1'
// implementation 'com.facebook.android:facebook-login:latest.release'
iOS
s.dependency 'FBSDKCoreKit', '~> 16.1'
s.dependency 'FBSDKLoginKit', '~> 16.1'
s.dependency 'FBSDKShareKit', '~> 16.1'

完整示例Demo

以下是完整的示例代码,展示了如何使用facebook_auth插件进行用户认证和登出操作。

import 'dart:async';

import 'package:facebook_auth/facebook_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  Map<String, dynamic>? _userData;

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      // 登出当前用户
      await FacebookAuth().logout();
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果小部件从树中移除,则忽略回复
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  // 用户认证
  Future<void> login() async {
    final result = await FacebookAuth().login(['public_profile', 'email']);
    if (result.status == LoginStatus.success) {
      final userData = await FacebookAuth.instance.getUserData();
      setState(() {
        _userData = userData;
      });
    }
  }

  // 用户登出
  Future<void> logout() async {
    await FacebookAuth().logout();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Facebook Auth Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: login,
                child: const Text('登录'),
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                onPressed: logout,
                child: const Text('登出'),
              ),
              const SizedBox(height: 20),
              if (_userData != null)
                Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text('User ID: ${_userData!['userId']}'),
                    Text('Token: ${_userData!['token']}'),
                    Text('Expires: ${_userData!['expires']}'),
                    Text('Application ID: ${_userData!['applicationId']}'),
                    Text('Last Refresh: ${_userData!['lastRefresh']}'),
                    Text('Is Expired: ${_userData!['isExpired']}'),
                    Text('Granted Permissions: ${_userData!['grantedPermissions'].join(', ')}'),
                    Text('Declined Permissions: ${_userData!['declinedPermissions'].join(', ')}'),
                    Text('Data Access Expiration Time: ${_userData!['dataAccessExpirationTime']}'),
                  ],
                ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter社交媒体认证插件facebook_auth的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用facebook_auth插件来实现Facebook社交媒体认证的代码示例。这个示例将涵盖基本的认证流程,包括初始化插件、请求权限、获取用户信息等步骤。

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

dependencies:
  flutter:
    sdk: flutter
  facebook_auth: ^3.5.0  # 请检查最新版本号

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

接下来,你需要配置Facebook开发者平台。创建一个Facebook应用,获取App ID和App Secret,并在Facebook开发者平台上配置你的应用包名和重定向URI。

配置Android

android/app/src/main/AndroidManifest.xml中添加以下配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- Add the following lines inside the <application> tag -->
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id"/>
    <activity
        android:name="com.facebook.FacebookActivity"
        android:configChanges=
            "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:label="@string/app_name" />
    <activity
        android:name="com.facebook.CustomTabActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="@string/fb_login_protocol_scheme" />
        </intent-filter>
    </activity>
</manifest>

android/app/src/main/res/values/strings.xml中添加Facebook App ID:

<resources>
    <string name="facebook_app_id">YOUR_FACEBOOK_APP_ID</string>
    <string name="fb_login_protocol_scheme">fbYOUR_FACEBOOK_APP_ID</string>
</resources>

配置iOS

ios/Runner/Info.plist中添加以下配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fbYOUR_FACEBOOK_APP_ID</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>YOUR_FACEBOOK_APP_ID</string>
<key>FacebookDisplayName</key>
<string>YourAppName</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

Flutter代码实现

在你的Flutter代码中,使用facebook_auth插件进行认证:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _userInfo = '';

  @override
  void initState() {
    super.initState();
    _loginWithFacebook();
  }

  Future<void> _loginWithFacebook() async {
    try {
      final AccessToken accessToken = await FacebookAuth.instance.login();
      if (accessToken != null) {
        final FacebookAuthCredential credential =
            FacebookAuthCredential(accessToken.token);

        // 在这里你可以使用credential进行进一步的认证流程,比如与Firebase集成
        // 例如:FirebaseAuth.instance.signInWithCredential(credential);

        // 获取用户信息(可选)
        final GraphResponse graphResponse = await FacebookAuth.instance
            .api('/me?fields=id,name,email', accessToken.token);

        setState(() {
          _userInfo = graphResponse.data.toString();
        });
      }
    } catch (e) {
      print(e);
      // 处理错误
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Facebook Auth Demo'),
        ),
        body: Center(
          child: Text(_userInfo.isEmpty ? 'Logging in...' : _userInfo),
        ),
      ),
    );
  }
}

这个示例展示了如何使用facebook_auth插件进行Facebook认证,并获取用户的基本信息。请注意,实际应用中你需要处理更多的错误情况,并根据你的应用需求调整用户信息的获取和使用方式。此外,确保你的应用遵循Facebook平台政策,并在Facebook开发者平台上正确配置你的应用。

回到顶部