From e182a440c505ae6de358d453f06f159cef3d6beb Mon Sep 17 00:00:00 2001 From: Michael Ribbons Date: Mon, 31 Jul 2017 14:56:55 +1000 Subject: [PATCH 1/2] Handle OAuth2AccessTokenErrorResponse exception when attempting to parse access token. This occurs in AuthorizationCode flow when the client secret is incorrect and the server returns invalid_client. --- .../io/fullstack/oauth/OAuthManagerFragmentController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java b/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java index 5281699..16c4d67 100644 --- a/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java +++ b/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java @@ -10,6 +10,7 @@ import com.facebook.react.bridge.ReactContext; import com.github.scribejava.core.exceptions.OAuthConnectionException; +import com.github.scribejava.core.model.OAuth2AccessTokenErrorResponse; import com.github.scribejava.core.model.OAuth1AccessToken; import com.github.scribejava.core.model.OAuth1RequestToken; import com.github.scribejava.core.model.OAuth2AccessToken; @@ -367,6 +368,10 @@ protected OAuth2AccessToken doInBackground(Void... params) { Log.e(TAG, "OAuth connection exception: " + ex.getMessage()); ex.printStackTrace(); return null; + } catch (OAuth2AccessTokenErrorResponse ex) + { + Log.e(TAG, "Failed to extract access token: " + ex.getMessage()); + return null; } catch (IOException ex) { Log.e(TAG, "An exception occurred getRequestToken: " + ex.getMessage()); ex.printStackTrace(); From c9a3ca3cf74691b33307a0e1c3e3871521a02fb5 Mon Sep 17 00:00:00 2001 From: Michael Ribbons Date: Fri, 4 Aug 2017 16:02:19 +1000 Subject: [PATCH 2/2] Implement OAuthManager.isVisible() method so application can check if login is currently in progress. Useful for situation where authentication status is checked periodically and .authorize() called automatically rather than on a button click. --- .../oauth/OAuthManagerFragmentController.java | 4 +++ .../fullstack/oauth/OAuthManagerModule.java | 25 +++++++++++++++++-- react-native-oauth.js | 4 +++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java b/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java index 16c4d67..3d8cfe2 100644 --- a/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java +++ b/android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java @@ -46,6 +46,10 @@ public class OAuthManagerFragmentController { private Runnable onAccessToken; private OAuthManagerOnAccessTokenListener mListener; + public boolean webViewVisible() { + return this.mWebView != null && this.mWebView.isShown(); + } + private void runOnMainThread(Runnable runnable) { uiHandler.post(runnable); } diff --git a/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java b/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java index 35777a4..f7cdacb 100644 --- a/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java +++ b/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java @@ -137,11 +137,13 @@ public void onOAuth2AccessToken(final OAuth2AccessToken accessToken) { } }; + OAuthManagerFragmentController ctrl = null; + if (authVersion.equals("1.0")) { final OAuth10aService service = OAuthManagerProviders.getApiFor10aProvider(providerName, cfg, params, callbackUrl); - OAuthManagerFragmentController ctrl = + ctrl = new OAuthManagerFragmentController(mReactContext, fragmentManager, providerName, service, callbackUrl); ctrl.requestAuth(cfg, listener); @@ -149,13 +151,15 @@ public void onOAuth2AccessToken(final OAuth2AccessToken accessToken) { final OAuth20Service service = OAuthManagerProviders.getApiFor20Provider(providerName, cfg, params, callbackUrl); - OAuthManagerFragmentController ctrl = + ctrl = new OAuthManagerFragmentController(mReactContext, fragmentManager, providerName, service, callbackUrl); ctrl.requestAuth(cfg, listener); } else { Log.d(TAG, "Auth version unknown: " + (String) cfg.get("auth_version")); } + + this.ctrlReference = ctrl; } catch (Exception ex) { Log.d(TAG, "Exception in callback " + ex.getMessage()); exceptionCallback(ex, callback); @@ -380,6 +384,23 @@ public void deauthorize(final String providerName, final Callback onComplete) { } } + private OAuthManagerFragmentController ctrlReference; + + @ReactMethod + public void isVisible(final Callback callback) + { + try + { + boolean visible = this.ctrlReference != null && this.ctrlReference.webViewVisible(); + WritableMap resp = Arguments.createMap(); + resp.putBoolean("visible", visible); + callback.invoke(null, resp); + } catch (Exception e) + { + exceptionCallback(e, callback); + } + } + private HashMap getConfiguration( final String providerName diff --git a/react-native-oauth.js b/react-native-oauth.js index 3008cf0..c0a8e1d 100644 --- a/react-native-oauth.js +++ b/react-native-oauth.js @@ -90,6 +90,10 @@ export default class OAuthManager { return promisify('deauthorize')(provider); } + isVisible() { + return promisify('isVisible')(); + } + providers() { return OAuthManager.providers(); }