[英]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_login或flutter_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 个资源解决这个问题:
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.