44import android .content .Context ;
55import android .content .Intent ;
66import android .net .Uri ;
7+ import android .support .annotation .NonNull ;
78import android .support .annotation .Nullable ;
89
910import com .facebook .react .bridge .ActivityEventListener ;
2223import net .openid .appauth .AuthorizationResponse ;
2324import net .openid .appauth .AuthorizationService ;
2425import net .openid .appauth .AuthorizationServiceConfiguration ;
26+ import net .openid .appauth .Preconditions ;
2527import net .openid .appauth .ResponseTypeValues ;
2628import net .openid .appauth .TokenResponse ;
2729import 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 ;
2938import java .text .SimpleDateFormat ;
3039import java .util .Date ;
3140import java .util .HashMap ;
3241import java .util .Iterator ;
42+ import java .util .concurrent .TimeUnit ;
3343
3444public 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+ }
0 commit comments