react-native-oauth
react-native-oauth copied to clipboard
Not working on Android 8.0 Oreo
Facebook login fails with "Sorry something went wrong" message
Google login just hangs after entering the password
With 8.0, for me in OAuthManagerModule.java
private WritableMap accessTokenResponse()
receives a OAuth2AccessToken that looks more like a payload from a URL separated by ampersands (not Json) and the GSON parser crashes on receiving it in about line 404. Even if it were properly formatted Json, it would not contain the "user_id" that we need.
Map accessTokenMap = new Gson().fromJson(accessToken.getRawResponse(), Map.class);
I backed down to 7.1 and avoided this crash.
I'm seeing possibly the same issue on Android 6.0. Logcat:
10-16 10:30:37.079 3051 3051 D OauthFragment: onPageFinished: https://api.twitter.com/oauth/authorize
10-16 10:30:37.079 3051 3051 I OauthFragment: interceptUrl called with url: http://localhost/twitter?oauth_token=BBBBBBBB&oauth_verifier=CCCCCCCC
10-16 10:30:37.080 3051 3112 I System.out: obtaining access token from https://api.twitter.com/oauth/access_token
10-16 10:30:37.080 3051 3112 I System.out: setting token to: OAuth1RequestToken{oauth_token=BBBBBBBB, oauth_token_secret=mY5y4Ks22GANEYlPeoY14EY2tG9FYs0u, oauth_callback_confirmed=true} and verifier to: CCCCCCCC
10-16 10:30:37.080 3051 3112 I System.out: generating signature...
10-16 10:30:37.080 3051 3112 I System.out: using base64 encoder: CommonsCodec
10-16 10:30:37.227 3051 3112 I System.out: base string is: POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Faccess_token&oauth_consumer_key%3DDDDDDDDDDDD%26oauth_nonce%3DEEEEEEEEEEEEEE%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1508146237%26oauth_token%3DBBBBBBBB%26oauth_verifier%3DCCCCCCCC%26oauth_version%3D1.0
10-16 10:30:37.227 3051 3112 I System.out: signature is: SSSSSSSSSSSSSS
10-16 10:30:37.227 3051 3112 I System.out: appended additional OAuth parameters: { oauth_signature_method -> HMAC-SHA1 , oauth_consumer_key -> DDDDDDDDDDD , oauth_version -> 1.0 , oauth_timestamp -> 1508146237 , oauth_nonce -> EEEEEEEEEEEEEE , oauth_verifier -> CCCCCCCC , oauth_token -> BBBBBBBB , oauth_signature -> SSSSSSSSSSSSSS }
10-16 10:30:37.227 3051 3112 I System.out: using Http Header signature
10-16 10:30:37.550 3051 3163 D TSLocationManager: [c.t.l.BackgroundGeolocationService onActivityRecognitionResult] still (100%)
10-16 10:30:37.727 3051 3051 D OAuthManager: Loaded access token in OAuthManagerFragmentController
10-16 10:30:37.727 3051 3051 D OAuthManager: AccessToken: OAuth1AccessToken{oauth_token=9999-TTTTT, oauth_token_secret=FFFFFFFFFF} (raw: oauth_token=9999-TTTTT&oauth_token_secret=FFFFFFFFFF&user_id=8888888&screen_name=NNNNNNN&x_auth_expires=0)
10-16 10:30:37.891 3051 3051 D OAuthManagerStore: Preferences changed: twitter
10-16 10:30:37.892 3051 3051 D AndroidRuntime: Shutting down VM
--------- beginning of crash
10-16 10:30:37.892 3051 3051 E AndroidRuntime: FATAL EXCEPTION: main
10-16 10:30:37.892 3051 3051 E AndroidRuntime: Process: (snip), PID: 3051
10-16 10:30:37.892 3051 3051 E AndroidRuntime: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at com.google.gson.Gson.fromJson(Gson.java:900)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at com.google.gson.Gson.fromJson(Gson.java:853)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at com.google.gson.Gson.fromJson(Gson.java:802)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at com.google.gson.Gson.fromJson(Gson.java:774)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at io.fullstack.oauth.OAuthManagerModule.accessTokenResponse(OAuthManagerModule.java:403)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at io.fullstack.oauth.OAuthManagerModule.access$100(OAuthManagerModule.java:45)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at io.fullstack.oauth.OAuthManagerModule$1.onOAuth1AccessToken(OAuthManagerModule.java:128)
10-16 10:30:37.892 3051 3051 E AndroidRuntime: at io.fullstack.oauth.OAuthManagerFragmentController.loaded10aAccessToken(OAuthManagerFragmentController.java:147)
I don't think it's Android-version specific. The code in question is:
Map accessTokenMap = new Gson().fromJson(accessToken.getRawResponse(), Map.class);
and accessToken.getRawResponse()
looks like this (from a Twitter transaction, and with newlines added for ease of reading):
auth_token=9999999999-AAAAAAAAAAAAAAAAAAAAAAA&
oauth_token_secret=AAAAAAAAAAAAAAAAAAAAAA
&user_id=9999999999
&screen_name=mytwittername
&x_auth_expires=0
so the issue is as @SailingSteve reports that the code is expecting JSON back and it's getting a querystring (x-www-form-urlencoded) instead. What I don't understand is how this ever worked -- https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token is clear that oauth tokens are returned as a querystring. So I must be missing something.
(I think that https://github.com/fullstackreact/react-native-oauth/commit/2a1c0fbb13dc43d09bde267c3ff969034b60a559#diff-9fc211ef231ecaa3ee7613d9696db4a1 is the commit which changed code to parse the response as JSON, instead of as a querystring.)