Skip to content

Commit 255fad4

Browse files
committed
Allow insecure requests on Android (@todo: refactor)
1 parent 898cf39 commit 255fad4

File tree

2 files changed

+73
-12
lines changed

2 files changed

+73
-12
lines changed

android/src/main/java/com/reactlibrary/RNAppAuthModule.java

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.content.Intent;
66
import android.net.Uri;
7+
import android.support.annotation.NonNull;
78
import android.support.annotation.Nullable;
89

910
import com.facebook.react.bridge.ActivityEventListener;
@@ -22,14 +23,23 @@
2223
import net.openid.appauth.AuthorizationResponse;
2324
import net.openid.appauth.AuthorizationService;
2425
import net.openid.appauth.AuthorizationServiceConfiguration;
26+
import net.openid.appauth.Preconditions;
2527
import net.openid.appauth.ResponseTypeValues;
2628
import net.openid.appauth.TokenResponse;
2729
import net.openid.appauth.TokenRequest;
28-
30+
import net.openid.appauth.connectivity.ConnectionBuilder;
31+
import net.openid.appauth.connectivity.DefaultConnectionBuilder;
32+
33+
import java.io.IOException;
34+
import java.net.HttpURLConnection;
35+
import java.net.MalformedURLException;
36+
import java.net.URL;
37+
import java.sql.Connection;
2938
import java.text.SimpleDateFormat;
3039
import java.util.Date;
3140
import java.util.HashMap;
3241
import java.util.Iterator;
42+
import java.util.concurrent.TimeUnit;
3343

3444
public class RNAppAuthModule extends ReactContextBaseJavaModule implements ActivityEventListener {
3545

@@ -96,13 +106,30 @@ private HashMap<String, String> additionalParametersToMap(ReadableMap additional
96106
return additionalParametersHash;
97107
}
98108

109+
private ConnectionBuilder createConnectionBuilder(Boolean allowInsecureConnections) {
110+
111+
if (allowInsecureConnections.equals(true)) {
112+
return new UnsafeConnectionBuilder();
113+
}
114+
115+
return DefaultConnectionBuilder.INSTANCE;
116+
}
117+
118+
static Uri buildConfigurationUriFromIssuer(Uri openIdConnectIssuerUri) {
119+
return openIdConnectIssuerUri.buildUpon()
120+
.appendPath(AuthorizationServiceConfiguration.WELL_KNOWN_PATH)
121+
.appendPath(AuthorizationServiceConfiguration.OPENID_CONFIGURATION_RESOURCE)
122+
.build();
123+
}
124+
99125
@ReactMethod
100126
public void authorize(
101127
String issuer,
102128
final String redirectUrl,
103129
final String clientId,
104130
final ReadableArray scopes,
105131
final ReadableMap additionalParameters,
132+
final Boolean dangerouslyAllowInsecureHttpRequests,
106133
final Promise promise
107134
) {
108135

@@ -111,9 +138,11 @@ public void authorize(
111138
final Activity currentActivity = getCurrentActivity();
112139

113140
final String scopesString = this.arrayToString(scopes);
141+
final Uri issuerUri = Uri.parse(issuer);
142+
final ConnectionBuilder builder = createConnectionBuilder(dangerouslyAllowInsecureHttpRequests);
114143

115-
AuthorizationServiceConfiguration.fetchFromIssuer(
116-
Uri.parse(issuer),
144+
AuthorizationServiceConfiguration.fetchFromUrl(
145+
buildConfigurationUriFromIssuer(issuerUri),
117146
new AuthorizationServiceConfiguration.RetrieveConfigurationCallback() {
118147
public void onFetchConfigurationCompleted(
119148
@Nullable AuthorizationServiceConfiguration serviceConfiguration,
@@ -143,7 +172,9 @@ public void onFetchConfigurationCompleted(
143172
currentActivity.startActivityForResult(authIntent, 0);
144173

145174
}
146-
});
175+
},
176+
builder
177+
);
147178

148179
}
149180

@@ -155,14 +186,16 @@ public void refresh(
155186
final String refreshToken,
156187
final ReadableArray scopes,
157188
final ReadableMap additionalParameters,
189+
final Boolean dangerouslyAllowInsecureHttpRequests,
158190
final Promise promise
159191
) {
160192
final Context context = this.reactContext;
161-
162193
final String scopesString = this.arrayToString(scopes);
194+
final Uri issuerUri = Uri.parse(issuer);
195+
final ConnectionBuilder builder = createConnectionBuilder(dangerouslyAllowInsecureHttpRequests);
163196

164-
AuthorizationServiceConfiguration.fetchFromIssuer(
165-
Uri.parse(issuer),
197+
AuthorizationServiceConfiguration.fetchFromUrl(
198+
buildConfigurationUriFromIssuer(issuerUri),
166199
new AuthorizationServiceConfiguration.RetrieveConfigurationCallback() {
167200
public void onFetchConfigurationCompleted(
168201
@Nullable AuthorizationServiceConfiguration serviceConfiguration,
@@ -203,7 +236,8 @@ public void onTokenRequestCompleted(@Nullable TokenResponse response, @Nullable
203236
});
204237

205238
}
206-
});
239+
},
240+
builder);
207241
}
208242

209243
@Override
@@ -249,3 +283,22 @@ public String getName() {
249283
return "RNAppAuth";
250284
}
251285
}
286+
287+
288+
final class UnsafeConnectionBuilder implements ConnectionBuilder {
289+
290+
private static final int CONNECTION_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(15);
291+
private static final int READ_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(10);
292+
293+
294+
@NonNull
295+
@Override
296+
public HttpURLConnection openConnection(@NonNull Uri uri) throws IOException {
297+
Preconditions.checkNotNull(uri, "url must not be null");
298+
HttpURLConnection conn = (HttpURLConnection) new URL(uri.toString()).openConnection();
299+
conn.setConnectTimeout(CONNECTION_TIMEOUT_MS);
300+
conn.setReadTimeout(READ_TIMEOUT_MS);
301+
conn.setInstanceFollowRedirects(false);
302+
return conn;
303+
}
304+
}

index.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,25 @@ const validateClientId = clientId =>
1212
const validateRedirectUrl = redirectUrl =>
1313
invariant(typeof redirectUrl === 'string', 'Config error: redirectUrl must be a string');
1414

15-
export const authorize = ({ issuer, redirectUrl, clientId, scopes, additionalParameters }) => {
15+
export const authorize = ({ issuer, redirectUrl, clientId, scopes, additionalParameters, dangerouslyAllowInsecureHttpRequests = false }) => {
1616
validateScopes(scopes);
1717
validateIssuer(issuer);
1818
validateClientId(clientId);
1919
validateRedirectUrl(redirectUrl);
2020
// TODO: validateAdditionalParameters
2121

22-
return RNAppAuth.authorize(issuer, redirectUrl, clientId, scopes, additionalParameters);
22+
return RNAppAuth.authorize(
23+
issuer,
24+
redirectUrl,
25+
clientId,
26+
scopes,
27+
additionalParameters,
28+
dangerouslyAllowInsecureHttpRequests
29+
);
2330
};
2431

2532
export const refresh = (
26-
{ issuer, redirectUrl, clientId, scopes, additionalParameters },
33+
{ issuer, redirectUrl, clientId, scopes, additionalParameters, dangerouslyAllowInsecureHttpRequests = false },
2734
{ refreshToken }
2835
) => {
2936
validateScopes(scopes);
@@ -39,7 +46,8 @@ export const refresh = (
3946
clientId,
4047
refreshToken,
4148
scopes,
42-
additionalParameters
49+
additionalParameters,
50+
dangerouslyAllowInsecureHttpRequests
4351
);
4452
};
4553

0 commit comments

Comments
 (0)