Skip to content

Commit 22e049e

Browse files
committed
Added Google support
1 parent 53dd620 commit 22e049e

File tree

4 files changed

+84
-16
lines changed

4 files changed

+84
-16
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ Finally, add the `client_id` credential as the id from the url page as well as t
260260
const config = {
261261
google: {
262262
callback_url: `[IOS SCHEME]:/google`,
263-
client_id: 'YOUR_CLIENT_ID'
263+
client_id: 'YOUR_CLIENT_ID',
264+
client_secret: 'YOUR_CLIENT_SECRET'
264265
}
265266
}
266267
```

android/src/main/java/io/fullstack/oauth/OAuthManagerFragmentController.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import android.app.Fragment;
1616
import android.app.FragmentTransaction;
1717

18+
import java.util.HashMap;
19+
import java.util.Map;
1820
import java.io.IOException;
1921

2022
import com.github.scribejava.core.model.OAuth1RequestToken;
@@ -43,6 +45,7 @@ public class OAuthManagerFragmentController {
4345
private OAuth20Service oauth20Service;
4446
private String callbackUrl;
4547
private OAuth1RequestToken oauth1RequestToken;
48+
private HashMap<String,Object> mCfg;
4649

4750
private Runnable onAccessToken;
4851
private OAuthManagerOnAccessTokenListener mListener;
@@ -80,8 +83,9 @@ public OAuthManagerFragmentController(
8083
}
8184

8285

83-
public void requestAuth(OAuthManagerOnAccessTokenListener listener) {
86+
public void requestAuth(HashMap<String,Object> cfg, OAuthManagerOnAccessTokenListener listener) {
8487
mListener = listener;
88+
mCfg = cfg;
8589

8690
runOnMainThread(new Runnable() {
8791
@Override
@@ -218,8 +222,28 @@ protected String doInBackground(Void... params) {
218222
oauth10aService.getAuthorizationUrl(oauth1RequestToken);
219223
return requestTokenUrl;
220224
} else if (authVersion.equals("2.0")) {
221-
final String authorizationUrl =
222-
oauth20Service.getAuthorizationUrl();
225+
226+
String authorizationUrl;
227+
228+
if (mCfg.containsKey("authorization_url_params")) {
229+
final HashMap<String, Object> additionalParams = new HashMap<String, Object>();
230+
additionalParams.put("access_type", "offline");
231+
additionalParams.put("prompt", "consent");
232+
233+
Map<String,String> authUrlMap = (Map) mCfg.get("authorization_url_params");
234+
if (authUrlMap != null) {
235+
if (authUrlMap.containsKey("access_type")) {
236+
additionalParams.put("access_type", (String) authUrlMap.get("access_type"));
237+
}
238+
if (authUrlMap.containsKey("prompt")) {
239+
additionalParams.put("prompt", (String) authUrlMap.get("prompt"));
240+
}
241+
}
242+
authorizationUrl = oauth20Service.getAuthorizationUrl(additionalParams);
243+
} else {
244+
authorizationUrl = oauth20Service.getAuthorizationUrl();
245+
}
246+
223247
return authorizationUrl;
224248
} else {
225249
return null;

android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class OAuthManagerModule extends ReactContextBaseJavaModule {
6161
private Context context;
6262
private ReactContext mReactContext;
6363

64-
private HashMap _configuration = new HashMap<String, HashMap<String,String>>();
64+
private HashMap _configuration = new HashMap<String, HashMap<String,Object>>();
6565
private ArrayList _callbackUrls = new ArrayList<String>();
6666
private OAuthManagerStore _credentialsStore;
6767

@@ -92,7 +92,7 @@ public void configureProvider(
9292

9393

9494
// Keep configuration map
95-
HashMap<String, String> cfg = new HashMap<String,String>();
95+
HashMap<String, Object> cfg = new HashMap<String,Object>();
9696

9797
ReadableMapKeySetIterator iterator = params.keySetIterator();
9898
while (iterator.hasNextKey()) {
@@ -122,7 +122,7 @@ public void authorize(
122122
{
123123
try {
124124
final OAuthManagerModule self = this;
125-
HashMap<String,String> cfg = this.getConfiguration(providerName);
125+
HashMap<String,Object> cfg = this.getConfiguration(providerName);
126126
final String authVersion = (String) cfg.get("auth_version");
127127
Activity activity = mReactContext.getCurrentActivity();
128128
FragmentManager fragmentManager = activity.getFragmentManager();
@@ -153,15 +153,15 @@ public void onOAuth2AccessToken(final OAuth2AccessToken accessToken) {
153153
OAuthManagerFragmentController ctrl =
154154
new OAuthManagerFragmentController(fragmentManager, providerName, service, callbackUrl);
155155

156-
ctrl.requestAuth(listener);
156+
ctrl.requestAuth(cfg, listener);
157157
} else if (authVersion.equals("2.0")) {
158158
final OAuth20Service service =
159159
OAuthManagerProviders.getApiFor20Provider(providerName, cfg, callbackUrl);
160160

161161
OAuthManagerFragmentController ctrl =
162162
new OAuthManagerFragmentController(fragmentManager, providerName, service, callbackUrl);
163163

164-
ctrl.requestAuth(listener);
164+
ctrl.requestAuth(cfg, listener);
165165
} else {
166166
Log.d(TAG, "Auth version unknown: " + (String) cfg.get("auth_version"));
167167
}
@@ -180,7 +180,7 @@ public void makeRequest(
180180

181181
Log.i(TAG, "makeRequest called for " + providerName + " to " + urlString);
182182
try {
183-
HashMap<String,String> cfg = this.getConfiguration(providerName);
183+
HashMap<String,Object> cfg = this.getConfiguration(providerName);
184184
final String authVersion = (String) cfg.get("auth_version");
185185

186186
URL url;
@@ -230,7 +230,7 @@ public void makeRequest(
230230
final OAuth10aService service =
231231
OAuthManagerProviders.getApiFor10aProvider(providerName, cfg, null);
232232
OAuth1AccessToken token = _credentialsStore.get(providerName, OAuth1AccessToken.class);
233-
233+
234234
request = new OAuthRequest(httpVerb, url.toString(), service);
235235
service.signRequest(token, request);
236236
} else if (authVersion.equals("2.0")) {
@@ -283,19 +283,26 @@ public void getSavedAccount(
283283
final Callback onComplete)
284284
{
285285
try {
286-
HashMap<String,String> cfg = this.getConfiguration(providerName);
286+
HashMap<String,Object> cfg = this.getConfiguration(providerName);
287287
final String authVersion = (String) cfg.get("auth_version");
288288

289289
Log.i(TAG, "getSavedAccount for " + providerName);
290290

291291
if (authVersion.equals("1.0")) {
292292
OAuth1AccessToken token = _credentialsStore.get(providerName, OAuth1AccessToken.class);
293293
Log.d(TAG, "Found token: " + token);
294+
if (token == null || token.equals("")) {
295+
throw new Exception("No token found");
296+
}
294297

295298
WritableMap resp = this.accessTokenResponse(providerName, token, authVersion);
296299
onComplete.invoke(null, resp);
297300
} else if (authVersion.equals("2.0")) {
298301
OAuth2AccessToken token = _credentialsStore.get(providerName, OAuth2AccessToken.class);
302+
303+
if (token == null || token.equals("")) {
304+
throw new Exception("No token found");
305+
}
299306
WritableMap resp = this.accessTokenResponse(providerName, token, authVersion);
300307
onComplete.invoke(null, resp);
301308
} else {
@@ -316,7 +323,7 @@ public void getSavedAccount(
316323
public void deauthorize(final String providerName, final Callback onComplete) {
317324
try {
318325
Log.i(TAG, "deauthorizing " + providerName);
319-
HashMap<String,String> cfg = this.getConfiguration(providerName);
326+
HashMap<String,Object> cfg = this.getConfiguration(providerName);
320327
final String authVersion = (String) cfg.get("auth_version");
321328

322329
_credentialsStore.delete(providerName);
@@ -331,14 +338,14 @@ public void deauthorize(final String providerName, final Callback onComplete) {
331338
}
332339

333340

334-
private HashMap<String,String> getConfiguration(
341+
private HashMap<String,Object> getConfiguration(
335342
final String providerName
336343
) throws Exception {
337344
if (!_configuration.containsKey(providerName)) {
338345
throw new ProviderNotConfiguredException("Provider not configured: " + providerName);
339346
}
340347

341-
HashMap<String,String> cfg = (HashMap) _configuration.get(providerName);
348+
HashMap<String,Object> cfg = (HashMap) _configuration.get(providerName);
342349
return cfg;
343350
}
344351

@@ -374,7 +381,12 @@ private WritableMap accessTokenResponse(
374381

375382
resp.putString("status", "ok");
376383
resp.putString("provider", providerName);
377-
response.putString("uuid", accessToken.getParameter("user_id"));
384+
try {
385+
response.putString("uuid", accessToken.getParameter("user_id"));
386+
} catch (Exception ex) {
387+
Log.e(TAG, "Exception while getting the access token");
388+
ex.printStackTrace();
389+
}
378390

379391
WritableMap credentials = Arguments.createMap();
380392
credentials.putString("oauth_token", accessToken.getAccessToken());

android/src/main/java/io/fullstack/oauth/OAuthManagerProviders.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.github.scribejava.apis.TwitterApi;
1919
import com.github.scribejava.apis.FacebookApi;
20+
import com.github.scribejava.apis.GoogleApi20;
2021

2122
public class OAuthManagerProviders {
2223
private static final String TAG = "OAuthManagerProviders";
@@ -40,6 +41,8 @@ static public OAuth20Service getApiFor20Provider(
4041
) {
4142
if (providerName.equalsIgnoreCase("facebook")) {
4243
return OAuthManagerProviders.facebookService(params, callbackUrl);
44+
} else if (providerName.equalsIgnoreCase("google")) {
45+
return OAuthManagerProviders.googleService(params, callbackUrl);
4346
} else {
4447
return null;
4548
}
@@ -82,4 +85,32 @@ private static OAuth20Service facebookService(final HashMap cfg, final String ca
8285

8386
return builder.build(FacebookApi.instance());
8487
}
88+
89+
private static OAuth20Service googleService(final HashMap cfg, final String callbackUrl) {
90+
String clientKey = (String) cfg.get("client_id");
91+
String clientSecret = (String) cfg.get("client_secret");
92+
String state;
93+
if (cfg.containsKey("state")) {
94+
state = (String) cfg.get("state");
95+
} else {
96+
state = TAG + new Random().nextInt(999_999);
97+
}
98+
String scope = "profile";
99+
if (cfg.containsKey("scope")) {
100+
scope = (String) cfg.get("scope");
101+
}
102+
103+
ServiceBuilder builder = new ServiceBuilder()
104+
.apiKey(clientKey)
105+
.apiSecret(clientSecret)
106+
.state(state)
107+
.scope(scope)
108+
.debug();
109+
110+
if (callbackUrl != null) {
111+
builder.callback(callbackUrl);
112+
}
113+
114+
return builder.build(GoogleApi20.instance());
115+
}
85116
}

0 commit comments

Comments
 (0)