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 ;
1617import com .facebook .react .bridge .ReadableMap ;
1718import com .facebook .react .bridge .ReadableMapKeySetIterator ;
1819import com .facebook .react .bridge .WritableMap ;
20+ import com .reactlibrary .utils .UnsafeConnectionBuilder ;
1921
22+ import net .openid .appauth .AppAuthConfiguration ;
2023import net .openid .appauth .AuthorizationException ;
2124import net .openid .appauth .AuthorizationRequest ;
2225import net .openid .appauth .AuthorizationResponse ;
2326import net .openid .appauth .AuthorizationService ;
2427import net .openid .appauth .AuthorizationServiceConfiguration ;
28+ import net .openid .appauth .Preconditions ;
2529import net .openid .appauth .ResponseTypeValues ;
2630import net .openid .appauth .TokenResponse ;
2731import net .openid .appauth .TokenRequest ;
28-
32+ import net .openid .appauth .connectivity .ConnectionBuilder ;
33+ import net .openid .appauth .connectivity .DefaultConnectionBuilder ;
34+
35+ import java .io .IOException ;
36+ import java .net .HttpURLConnection ;
37+ import java .net .MalformedURLException ;
38+ import java .net .URL ;
39+ import java .sql .Connection ;
2940import java .text .SimpleDateFormat ;
3041import java .util .Date ;
3142import java .util .HashMap ;
3243import java .util .Iterator ;
44+ import java .util .concurrent .TimeUnit ;
3345
3446public class RNAppAuthModule extends ReactContextBaseJavaModule implements ActivityEventListener {
3547
3648 private final ReactApplicationContext reactContext ;
3749 private Promise promise ;
50+ private Boolean dangerouslyAllowInsecureHttpRequests ;
3851
3952 public RNAppAuthModule (ReactApplicationContext reactContext ) {
4053 super (reactContext );
@@ -96,24 +109,53 @@ private HashMap<String, String> additionalParametersToMap(ReadableMap additional
96109 return additionalParametersHash ;
97110 }
98111
112+ private AppAuthConfiguration createAppAuthConfiguration (ConnectionBuilder connectionBuilder ) {
113+ return new AppAuthConfiguration
114+ .Builder ()
115+ .setConnectionBuilder (connectionBuilder )
116+ .build ();
117+ }
118+
119+ private ConnectionBuilder createConnectionBuilder (Boolean allowInsecureConnections ) {
120+ if (allowInsecureConnections .equals (true )) {
121+ return UnsafeConnectionBuilder .INSTANCE ;
122+ }
123+
124+ return DefaultConnectionBuilder .INSTANCE ;
125+ }
126+
127+ private Uri buildConfigurationUriFromIssuer (Uri openIdConnectIssuerUri ) {
128+ return openIdConnectIssuerUri .buildUpon ()
129+ .appendPath (AuthorizationServiceConfiguration .WELL_KNOWN_PATH )
130+ .appendPath (AuthorizationServiceConfiguration .OPENID_CONFIGURATION_RESOURCE )
131+ .build ();
132+ }
133+
99134 @ ReactMethod
100135 public void authorize (
101136 String issuer ,
102137 final String redirectUrl ,
103138 final String clientId ,
104139 final ReadableArray scopes ,
105140 final ReadableMap additionalParameters ,
141+ final Boolean dangerouslyAllowInsecureHttpRequests ,
106142 final Promise promise
107143 ) {
108144
109145 final Context context = this .reactContext ;
146+
147+ // store args in private fields for later use in onActivityResult handler
110148 this .promise = promise ;
111- final Activity currentActivity = getCurrentActivity () ;
149+ this . dangerouslyAllowInsecureHttpRequests = dangerouslyAllowInsecureHttpRequests ;
112150
151+ final Activity currentActivity = getCurrentActivity ();
113152 final String scopesString = this .arrayToString (scopes );
153+ final Uri issuerUri = Uri .parse (issuer );
154+ final ConnectionBuilder builder = createConnectionBuilder (dangerouslyAllowInsecureHttpRequests );
155+ final AppAuthConfiguration configuration = this .createAppAuthConfiguration (builder );
114156
115- AuthorizationServiceConfiguration .fetchFromIssuer (
116- Uri . parse ( issuer ),
157+ AuthorizationServiceConfiguration .fetchFromUrl (
158+ buildConfigurationUriFromIssuer ( issuerUri ),
117159 new AuthorizationServiceConfiguration .RetrieveConfigurationCallback () {
118160 public void onFetchConfigurationCompleted (
119161 @ Nullable AuthorizationServiceConfiguration serviceConfiguration ,
@@ -123,6 +165,7 @@ public void onFetchConfigurationCompleted(
123165 return ;
124166 }
125167
168+
126169 AuthorizationRequest .Builder authRequestBuilder =
127170 new AuthorizationRequest .Builder (
128171 serviceConfiguration ,
@@ -137,13 +180,14 @@ public void onFetchConfigurationCompleted(
137180 }
138181
139182 AuthorizationRequest authRequest = authRequestBuilder .build ();
140-
141- AuthorizationService authService = new AuthorizationService (context );
183+ AuthorizationService authService = new AuthorizationService (context , configuration );
142184 Intent authIntent = authService .getAuthorizationRequestIntent (authRequest );
143185 currentActivity .startActivityForResult (authIntent , 0 );
144186
145187 }
146- });
188+ },
189+ builder
190+ );
147191
148192 }
149193
@@ -155,14 +199,20 @@ public void refresh(
155199 final String refreshToken ,
156200 final ReadableArray scopes ,
157201 final ReadableMap additionalParameters ,
202+ final Boolean dangerouslyAllowInsecureHttpRequests ,
158203 final Promise promise
159204 ) {
160205 final Context context = this .reactContext ;
161-
162206 final String scopesString = this .arrayToString (scopes );
207+ final Uri issuerUri = Uri .parse (issuer );
208+ final ConnectionBuilder builder = createConnectionBuilder (dangerouslyAllowInsecureHttpRequests );
209+ final AppAuthConfiguration configuration = createAppAuthConfiguration (builder );
163210
164- AuthorizationServiceConfiguration .fetchFromIssuer (
165- Uri .parse (issuer ),
211+ // store setting in private field for later use in onActivityResult handler
212+ this .dangerouslyAllowInsecureHttpRequests = dangerouslyAllowInsecureHttpRequests ;
213+
214+ AuthorizationServiceConfiguration .fetchFromUrl (
215+ buildConfigurationUriFromIssuer (issuerUri ),
166216 new AuthorizationServiceConfiguration .RetrieveConfigurationCallback () {
167217 public void onFetchConfigurationCompleted (
168218 @ Nullable AuthorizationServiceConfiguration serviceConfiguration ,
@@ -187,9 +237,7 @@ public void onFetchConfigurationCompleted(
187237
188238 TokenRequest tokenRequest = tokenRequestBuilder .build ();
189239
190-
191- AuthorizationService authService = new AuthorizationService (context );
192-
240+ AuthorizationService authService = new AuthorizationService (context , configuration );
193241 authService .performTokenRequest (tokenRequest , new AuthorizationService .TokenResponseCallback () {
194242 @ Override
195243 public void onTokenRequestCompleted (@ Nullable TokenResponse response , @ Nullable AuthorizationException ex ) {
@@ -203,7 +251,8 @@ public void onTokenRequestCompleted(@Nullable TokenResponse response, @Nullable
203251 });
204252
205253 }
206- });
254+ },
255+ builder );
207256 }
208257
209258 @ Override
@@ -217,9 +266,11 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
217266 }
218267
219268 final Promise authorizePromise = this .promise ;
269+ final AppAuthConfiguration configuration = createAppAuthConfiguration (
270+ createConnectionBuilder (this .dangerouslyAllowInsecureHttpRequests )
271+ );
220272
221- AuthorizationService authService = new AuthorizationService (this .reactContext );
222-
273+ AuthorizationService authService = new AuthorizationService (this .reactContext , configuration );
223274 authService .performTokenRequest (
224275 response .createTokenExchangeRequest (),
225276 new AuthorizationService .TokenResponseCallback () {
@@ -248,4 +299,4 @@ public void onNewIntent(Intent intent) {
248299 public String getName () {
249300 return "RNAppAuth" ;
250301 }
251- }
302+ }
0 commit comments