1
votes

Comment se connecter avec Twitter en utilisant Firebase_Auth avec Flutter

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);


4 commentaires

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ète flutter_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.


3 Réponses :


0
votes

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);


2 commentaires

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



1
votes

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.


4 commentaires

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é!



3
votes

J'ai pu résoudre ce problème en utilisant 3 ressources:

  1. La Flutter Facebook Sign In ( avec Firebase) dans l'article de 2020
  2. Le Connectez-vous avec Twitter a> guide
  3. La bibliothèque Dart OAuth1

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 .


4 commentaires

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 )