/twitter_oauth

Primary LanguageDartMIT LicenseMIT

twitter_oauth

Twitter Sign-in Library

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:twitter_oauth/twitter_oauth.dart';
import 'package:webview_flutter/webview_flutter.dart';

class TwitterOauthPage extends StatefulWidget {
  const TwitterOauthPage({Key key}) : super(key: key);

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

class _TwitterOauthPageState extends State<TwitterOauthPage> {
  TwitterOauth _twitterOauth;

  @override
  void initState() {
    super.initState();
    _twitterOauth = TwitterOauth(
      'XXXXXXXXXX',
      'XXXXXXXXXXXXXXXXXXX',
      'https://XXXXXXXX.firebaseapp.com/__/auth/handler',
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Sign In With Twitter'),
      ),
      body: Center(
        child: RaisedButton(
          child: const Text('Sign In With Twitter.'),
          onPressed: () async {
            final String authorizeUri =   
              await _twitterOauth.getAuthorizeUri();
            Navigator.of(context).pushReplacement<Widget, Widget>(
              MaterialPageRoute<Widget>(
                builder: (BuildContext context) {
                  return TwitterWebView(
                    uri: authorizeUri,
                  );
                },
              ),
            );
          },
        ),
      ),
    );
  }
}

class TwitterWebView extends StatefulWidget {
  const TwitterWebView({Key key, this.uri}) : super(key: key);
  final String uri;
  @override
  _TwitterWebViewState createState() => _TwitterWebViewState();
}

class _TwitterWebViewState extends State<TwitterWebView> {
  TwitterOauth _twitterOauth;

  @override
  void initState() {
    super.initState();
    _twitterOauth = TwitterOauth(
      'XXXXXXXXXX',
      'XXXXXXXXXXXXXXXXXXX',
      'https://XXXXXXXX.firebaseapp.com/__/auth/handler',
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: WebView(
        initialUrl: widget.uri,
        javascriptMode: JavascriptMode.unrestricted,
        navigationDelegate: (NavigationRequest request) {
          if (request.url.startsWith('callbackUri')) {
            final String query = request.url.split('?').last;
            if (query.contains('denied')) {
              /// Cancel
            } else {
              final Map<String, String> res = Uri.splitQueryString(query);
              twitterSignin(res).then((String uid) {
                /// Navigato to Main Page
              });
            }
          }
          return NavigationDecision.navigate;
        },
      ),
    );
  }

  Future<String> twitterSignin(Map<String, String> token) async {
    final Map<String, String> oauthToken =
        await _twitterOauth.getAccessToken(token);
    final AuthCredential credential = TwitterAuthProvider.getCredential(
      authToken: oauthToken['oauth_token'],
      authTokenSecret: oauthToken['oauth_token_secret'],
    );
    final FirebaseUser user =
        await FirebaseAuth.instance.signInWithCredential(credential);
    return user.uid;
  }
}