简体   繁体   English

如何使用 Firebase_Auth 和 Flutter 登录 Twitter

[英]How to Sign In with Twitter using Firebase_Auth with Flutter

How should one program a Sign In with Twitter feature using firebase_auth and Flutter?应该如何使用firebase_auth和 Flutter编写使用 Twitter 登录功能的程序?

I see a few examples using flutter_twitter_login or flutter_twitter , however they use a now Deprecated API and folks complain about Apple Store Rejection .我看到一些使用flutter_twitter_loginflutter_twitter 的示例,但是它们使用了现已弃用的 API ,人们抱怨Apple Store Rejection

Firebase Auth offers a TwitterAuthProvider , but the following code remains incomplete: Firebase Auth提供了TwitterAuthProvider ,但以下代码仍然不完整:

final AuthCredential credential = TwitterAuthProvider.getCredential(
  authToken: twitterAccessToken,
  authTokenSecret: twitterAccessTokenSecret,
);
final AuthResult result = await auth.signInWithCredential(credential);

I was able to solve this using 3 resources:我能够使用 3 个资源解决这个问题:

  1. The Flutter Facebook Sign In (with Firebase) in 2020 article 2020 年Flutter Facebook 登录(使用 Firebase)文章
  2. The Log in with Twitter guide 使用 Twitter 登录指南
  3. The Dart OAuth1 library Dart OAuth1

Ultimately, I was able to completely remove the flutter_twitter package, yet still support Sign in with Twitter .最终,我能够完全删除flutter_twitter包,但仍然支持使用 Twitter 登录

Similar to the CustomWebView outlined in the Facebook solution, I created a TwitterLoginScreen like:与 Facebook 解决方案中概述的CustomWebView类似,我创建了一个TwitterLoginScreen如:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import 'package:oauth1/oauth1.dart';

/// Twitter Login Screen.
/// See [Log in with Twitter](https://developer.twitter.com/en/docs/basics/authentication/guides/log-in-with-twitter).
class TwitterLoginScreen extends StatefulWidget {
  final twitterPlatform = Platform(
    'https://api.twitter.com/oauth/request_token', // temporary credentials request
    'https://api.twitter.com/oauth/authorize', // resource owner authorization
    'https://api.twitter.com/oauth/access_token', // token credentials request
    SignatureMethods.hmacSha1, // signature method
  );

  final ClientCredentials clientCredentials;
  final String oauthCallbackHandler;

  TwitterLoginScreen({
    @required final String consumerKey,
    @required final String consumerSecret,
    @required this.oauthCallbackHandler,
  }) : clientCredentials = ClientCredentials(consumerKey, consumerSecret);

  @override
  _TwitterLoginScreenState createState() => _TwitterLoginScreenState();
}

class _TwitterLoginScreenState extends State<TwitterLoginScreen> {
  final flutterWebviewPlugin = FlutterWebviewPlugin();

  Authorization _oauth;

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

    // Initialize Twitter OAuth
    _oauth = Authorization(widget.clientCredentials, widget.twitterPlatform);

    flutterWebviewPlugin.onUrlChanged.listen((url) {
      // Look for Step 2 callback so that we can move to Step 3.
      if (url.startsWith(widget.oauthCallbackHandler)) {
        final queryParameters = Uri.parse(url).queryParameters;
        final oauthToken = queryParameters['oauth_token'];
        final oauthVerifier = queryParameters['oauth_verifier'];
        if (null != oauthToken && null != oauthVerifier) {
          _twitterLogInFinish(oauthToken, oauthVerifier);
        }
      }
    });

    _twitterLogInStart();
  }

  @override
  void dispose() {
    flutterWebviewPlugin.dispose();
    super.dispose();
  }

  Future<void> _twitterLogInStart() async {
    assert(null != _oauth);
    // Step 1 - Request Token
    final requestTokenResponse =
        await _oauth.requestTemporaryCredentials(widget.oauthCallbackHandler);
    // Step 2 - Redirect to Authorization Page
    final authorizationPage = _oauth.getResourceOwnerAuthorizationURI(
        requestTokenResponse.credentials.token);
    flutterWebviewPlugin.launch(authorizationPage);
  }

  Future<void> _twitterLogInFinish(
      String oauthToken, String oauthVerifier) async {
    // Step 3 - Request Access Token
    final tokenCredentialsResponse = await _oauth.requestTokenCredentials(
        Credentials(oauthToken, ''), oauthVerifier);

    final result = TwitterAuthProvider.getCredential(
      authToken: tokenCredentialsResponse.credentials.token,
      authTokenSecret: tokenCredentialsResponse.credentials.tokenSecret,
    );

    Navigator.pop(context, result);
  }

  @override
  Widget build(BuildContext context) {
    return WebviewScaffold(
      appBar: AppBar(title: Text("Twitter Login")),
      url: "https://twitter.com",
    );
  }
}

Then, the AuthCredential result from this screen can be passed to FirebaseAuth.signInWithCredential .然后,可以AuthCredential屏幕的AuthCredential结果传递给FirebaseAuth.signInWithCredential

To sign in with Twitter do the following:要使用 Twitter 登录,请执行以下操作:

 Future<FirebaseUser> loginWithTwitter() async {
  var twitterLogin = new TwitterLogin(
    consumerKey: 'key',
    consumerSecret: 'secretkey',
  );

  final TwitterLoginResult result = await twitterLogin.authorize();

switch (result.status) {
  case TwitterLoginStatus.loggedIn:
    var session=result.session;
    final AuthCredential credential= TwitterAuthProvider.getCredential(
      authToken: session.token,
      authTokenSecret: session.secret
    );
    FirebaseUser firebaseUser=(await firebaseAuth.signInWithCredential(credential)).user;
    print("twitter sign in"+firebaseUser.toString());
    break;
  case TwitterLoginStatus.cancelledByUser:
    break;
  case TwitterLoginStatus.error:
    break;
}

Use twitterlogin and pass the consumer key and consumer secret key, then use the method getCredential() and signInWithCredential to log in.使用twitterlogin ,传递consumer key和consumer secret key,然后使用getCredential()signInWithCredential方法登录。

They have shared a common sample in the home page itself, only the 'sign in provider' changes, rest is same for all (google, fb and twitter).他们在主页本身共享了一个通用示例,只有“登录提供商”发生了变化,其他所有人(google、fb 和 twitter)都是一样的。 the result has a user property which will return the user details, check with the below code结果有一个用户属性,它将返回用户详细信息,请查看以下代码

final AuthCredential credential = TwitterAuthProvider.getCredential(
  authToken: twitterAccessToken,
  authTokenSecret: twitterAccessTokenSecret,
);
final AuthResult result = await auth.signInWithCredential(credential);
final FirebaseUser user = result.user;
print("signed in " + user.displayName);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Flutter&Firebase-与firebase_auth一起使用firebase_storage - Flutter & Firebase - using firebase_storage along with firebase_auth 如何解决flutter中的内部错误以使用firebase_auth - How to solve Internal error in flutter to use firebase_auth Flutter:firebase_auth 好像不行,怎么授权? - Flutter: firebase_auth seems not to work, how do I authorize? 如何使用 firebase_auth 包修复 flutter 应用程序中的 FirebaseAuth.instance.currentUser()? 它总是返回 null - How to fix FirebaseAuth.instance.currentUser() in flutter app using firebase_auth package? It is always returning null Flutter - firebase_auth updateProfile 方法不起作用 - Flutter - firebase_auth updateProfile method is not working Flutter firebase_auth signInWithCredential 不适用于 android - Flutter firebase_auth signInWithCredential is not working on android Dart Flutter 顺序 firebase_auth 错误 - Dart Flutter sequential firebase_auth errors 未处理的异常:[firebase_auth/unknown] null:使用颤振/firebase 进行电话身份验证时出错 - Unhandled Exception: [firebase_auth/unknown] null: Error in Phone Authentication using flutter/firebase Firebase_auth 无法在 flutter [firebase_auth: ^0.16.1] 上构建发布 apk - Firebase_auth cannot build release apk on flutter [firebase_auth: ^0.16.1] 如何从 firebase_auth 测试“signInWithEmailAndPassword” - How to test "signInWithEmailAndPassword" from firebase_auth
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM