diff --git a/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java b/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java index 35777a4..719b267 100644 --- a/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java +++ b/android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java @@ -7,6 +7,7 @@ import android.util.Log; import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; @@ -400,10 +401,27 @@ private WritableMap accessTokenResponse( ) { WritableMap resp = Arguments.createMap(); WritableMap response = Arguments.createMap(); - Map accessTokenMap = new Gson().fromJson(accessToken.getRawResponse(), Map.class); Log.d(TAG, "Credential raw response: " + accessToken.getRawResponse()); - + + /* Some things return as JSON, some as x-www-form-urlencoded (querystring) */ + + Map accessTokenMap = null; + try { + accessTokenMap = new Gson().fromJson(accessToken.getRawResponse(), Map.class); + } catch (JsonSyntaxException e) { + /* + failed to parse as JSON, so turn it into a HashMap which looks like the one we'd + get back from the JSON parser, so the rest of the code continues unchanged. + */ + Log.d(TAG, "Credential looks like a querystring; parsing as such"); + accessTokenMap = new HashMap(); + accessTokenMap.put("user_id", accessToken.getParameter("user_id")); + accessTokenMap.put("oauth_token_secret", accessToken.getParameter("oauth_token_secret")); + accessTokenMap.put("token_type", accessToken.getParameter("token_type")); + } + + resp.putString("status", "ok"); resp.putBoolean("authorized", true); resp.putString("provider", providerName); diff --git a/ios/OAuthManager/OAuthManager.m b/ios/OAuthManager/OAuthManager.m index a9451bc..a5bdb51 100644 --- a/ios/OAuthManager/OAuthManager.m +++ b/ios/OAuthManager/OAuthManager.m @@ -303,7 +303,8 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name NSMutableDictionary *cfg = [[manager getConfigForProvider:providerName] mutableCopy]; DCTAuthAccount *existingAccount = [manager accountForProvider:providerName]; - NSString *clientID = ((DCTOAuth2Credential *) existingAccount).clientID; + NSString *clientID = ([providerName isEqualToString:@"google"]) ? ((DCTOAuth2Credential *) existingAccount).clientID : (NSString *)nil; + if (([providerName isEqualToString:@"google"] && existingAccount && clientID != nil) || (![providerName isEqualToString:@"google"] && existingAccount != nil)) { if ([existingAccount isAuthorized]) {