From c2e49bb63016e66a7da7ee23a7a9781d0bcb0cd7 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Wed, 23 Jan 2019 20:17:59 +0100 Subject: [PATCH] Add a POC OAuth client implementation I've registered GitJournal as an app on Github and tried to get the access_token within the app. This seems to work. Though, I need to provide the client secret as well. It's quite sad that GitHub does not even support the Implicit Grant auth type. Credit: https://stackoverflow.com/questions/46196240/oauth2-flow-in-flutter-app --- android/app/src/main/AndroidManifest.xml | 12 +++++ .../gitjournal/gitjournal/MainActivity.java | 4 +- .../gitjournal/UriReceiverActivity.java | 35 +++++++++++++ lib/oauthapp.dart | 51 +++++++++++++++++++ 4 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 android/app/src/main/java/io/gitjournal/gitjournal/UriReceiverActivity.java create mode 100644 lib/oauthapp.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7cc01825..21e8dd6f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -35,5 +35,17 @@ + + + + + + + + + + diff --git a/android/app/src/main/java/io/gitjournal/gitjournal/MainActivity.java b/android/app/src/main/java/io/gitjournal/gitjournal/MainActivity.java index 8acd2a18..6bf5b22b 100644 --- a/android/app/src/main/java/io/gitjournal/gitjournal/MainActivity.java +++ b/android/app/src/main/java/io/gitjournal/gitjournal/MainActivity.java @@ -22,13 +22,15 @@ import io.flutter.util.PathUtils; public class MainActivity extends FlutterActivity implements MethodCallHandler { private static final String CHANNEL_NAME = "gitjournal.io/git"; + static MethodChannel channel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); - new MethodChannel(getFlutterView(), CHANNEL_NAME).setMethodCallHandler(this); + channel = new MethodChannel(getFlutterView(), CHANNEL_NAME); + channel.setMethodCallHandler(this); } @Override diff --git a/android/app/src/main/java/io/gitjournal/gitjournal/UriReceiverActivity.java b/android/app/src/main/java/io/gitjournal/gitjournal/UriReceiverActivity.java new file mode 100644 index 00000000..4cc670ab --- /dev/null +++ b/android/app/src/main/java/io/gitjournal/gitjournal/UriReceiverActivity.java @@ -0,0 +1,35 @@ +package io.gitjournal.gitjournal; + +import android.os.Bundle; +import android.util.Log; +import android.app.Activity; +import android.net.*; + +import android.content.Intent; + +import java.util.HashMap; +import java.util.Map; + +public class UriReceiverActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Uri data = getIntent().getData(); + + Map map = new HashMap<>(); + map.put("URL", data.toString()); + + MainActivity.channel.invokeMethod("onURL", map); + + // Now that all data has been sent back to Dart-land, we should re-open the Flutter + // activity. Due to the manifest-setting of the MainActivity ("singleTop), only a single + // instance will exist, popping the old one back up and destroying the preceding + // activities on the backstack, such as the custom tab. + // Flags taken from how the AppAuth-library accomplishes the same thing + Intent mainIntent = new Intent(this, MainActivity.class); + mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(mainIntent); + finish(); + } + +} diff --git a/lib/oauthapp.dart b/lib/oauthapp.dart new file mode 100644 index 00000000..0ab4faa7 --- /dev/null +++ b/lib/oauthapp.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:journal/apis/git.dart'; +import 'package:flutter/services.dart'; +import 'package:url_launcher/url_launcher.dart'; + +const _platform = const MethodChannel('gitjournal.io/git'); + +// Actual message handler: +Future _handleMessages(MethodCall call) async { + switch (call.method) { + case "onURL": + print("Call onURL" + call.arguments.toString()); + // Do something nice using call.arguments["URL"] + } +} + +class OAuthApp extends StatefulWidget { + @override + OAuthAppState createState() { + return new OAuthAppState(); + } +} + +class OAuthAppState extends State { + void initState() { + super.initState(); + _platform.setMethodCallHandler(_handleMessages); + } + + @override + Widget build(BuildContext context) { + return new MaterialApp( + title: 'OAuth App', + home: Scaffold( + appBar: AppBar( + title: Text('OAuth Test'), + ), + body: Column(children: [ + RaisedButton( + child: Text("Open OAuth URL"), + onPressed: () { + var url = + "https://github.com/login/oauth/authorize?client_id=aa3072cbfb02b1db14ed&scope=repo"; + launch(url); + }, + ), + ]), + ), + ); + } +}