Comment programmer une fonctionnalité Se connecter avec Twitter à l'aide de firebase_auth et Flutter?
Je vois quelques exemples utilisant flutter_twitter_login ou flutter_twitter , mais ils utilisent désormais un API obsolète et les gens se plaignent de Rejet de l'Apple Store .
Firebase Auth propose un TwitterAuthProvider , mais le code suivant reste incomplet:
final AuthCredential credential = TwitterAuthProvider.getCredential( authToken: twitterAccessToken, authTokenSecret: twitterAccessTokenSecret, ); final AuthResult result = await auth.signInWithCredential(credential);
3 Réponses :
Ils ont partagé un échantillon commun dans la page d'accueil elle-même, seul le "fournisseur de connexion" change, le reste est le même pour tous (google, fb et twitter). le résultat a une propriété utilisateur qui renverra les détails de l'utilisateur, vérifiez avec le code ci-dessous
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);
Ce code ne fournit aucune interface pour capturer les informations d'identification du nom d'utilisateur / mot de passe Twitter et s'authentifie à la place en tant qu'application. Que manque-t-il pour cela?
twitter / fb / google nom d'utilisateur / mots de passe ne sont jamais exposés par firebase, vous pouvez utiliser l'api pour valider l'utilisateur en tant qu'utilisateur twitter, puis utiliser les informations de son profil comme le nom d'affichage / email / mobile (s'il est partagé) dans votre application
Pour vous connecter avec Twitter, procédez comme suit:
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; }
Utilisez twitterlogin
et transmettez la clé client et la clé secrète client, puis utilisez la méthode getCredential ()
et signInWithCredential
pour vous connecter.
Cela repose sur TwitterKit, qui est obsolète. N'y a-t-il pas une stratégie plus pérenne?
actuellement, c'est le seul moyen, cela fonctionnera sur Android mais ios oui cela ne fonctionnera pas car il est obsolète comme vous l'avez dit
Pour mémoire, OUI, j'ai essayé la stratégie proposée TwitterLogin
et j'ai réussi à la faire fonctionner à la fois pour Android et iOS. Je suis toujours préoccupé par le fait que cette stratégie utilise une API obsolète , mais il ne semble pas y avoir de meilleure solution prise en charge . (Je n'ai pas encore reçu de commentaires sur la soumission au Store; je peux encore rencontrer des problèmes.)
D'accord, si vous rencontrez des problèmes avec la partie ios, s'il n'y a pas de plugin, vous devez en créer un pour iOS. Veuillez également voter pour ma réponse car elle vous a aidé!
J'ai pu résoudre ce problème en utilisant 3 ressources:
En fin de compte, j'ai pu supprimer complètement le package flutter_twitter , tout en prenant toujours en charge Connectez-vous avec Twitter .
Semblable à CustomWebView
décrit dans la solution Facebook, j'ai créé un TwitterLoginScreen
comme:
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", ); } }
Ensuite, le résultat AuthCredential
de cet écran peut être transmis à FirebaseAuth.signInWithCredential .
J'ai utilisé votre solution, mais je suis confronté à quelques problèmes: 1. flutterWebviewPlugin.launch (authorisationPage); lance une erreur, j'ai donc dû utiliser .reload () 2. cela prend presque 2-3 minutes pour que l'URL de rappel soit appelée. avez-vous affronté cela? comment l'avez-vous résolu?
Je n'ai pas rencontré le problème que vous avez décrit. Je recommande de vérifier deux fois vos entrées de configuration telles que consumerKey
, consumerSecret
et oauthCallbackHandler
.
quelle est la version de chaque plugin que vous utilisez?
Comment avez-vous obtenu le oauthCallbackHandler? Ce n'est pas l'url de rappel que Firebase auth fournit sur leur page de configuration, n'est-ce pas? ( myapp.firebaseapp.com/__/auth/handler )
Apparemment, "Apple cessera d'accepter les soumissions d'applications qui utilisent l'API UIWebView." Cela a également un impact sur la stratégie de connexion Facebook. Cependant, il existe apparemment un moyen d'utiliser Oauth + WebView + Server Code. J'aimerais voir un exemple étoffé de Flutter + Firebase Auth. J'ai trouvé ceci pour référence: github.com/EmmanuelAmodu/Flutter-nodejs-facebook-auth
Cet article montre comment on peut s'authentifier avec Facebook en utilisant
flutter_webview_plugin
et non le obsolèteflutter_facebook_login
Je recherche essentiellement les conseils équivalents pour Twitter.quelle est la version des plugins que vous utilisez ou avez utilisé?
Les derniers packages; ils n'ont pas changé depuis un moment.