4
4
import android .content .Context ;
5
5
import android .content .Intent ;
6
6
import android .net .Uri ;
7
+ import android .support .annotation .NonNull ;
7
8
import android .support .annotation .Nullable ;
8
9
9
10
import com .facebook .react .bridge .ActivityEventListener ;
16
17
import com .facebook .react .bridge .ReadableMap ;
17
18
import com .facebook .react .bridge .ReadableMapKeySetIterator ;
18
19
import com .facebook .react .bridge .WritableMap ;
20
+ import com .reactlibrary .utils .UnsafeConnectionBuilder ;
19
21
22
+ import net .openid .appauth .AppAuthConfiguration ;
20
23
import net .openid .appauth .AuthorizationException ;
21
24
import net .openid .appauth .AuthorizationRequest ;
22
25
import net .openid .appauth .AuthorizationResponse ;
23
26
import net .openid .appauth .AuthorizationService ;
24
27
import net .openid .appauth .AuthorizationServiceConfiguration ;
28
+ import net .openid .appauth .Preconditions ;
25
29
import net .openid .appauth .ResponseTypeValues ;
26
30
import net .openid .appauth .TokenResponse ;
27
31
import 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 ;
29
40
import java .text .SimpleDateFormat ;
30
41
import java .util .Date ;
31
42
import java .util .HashMap ;
32
43
import java .util .Iterator ;
44
+ import java .util .concurrent .TimeUnit ;
33
45
34
46
public class RNAppAuthModule extends ReactContextBaseJavaModule implements ActivityEventListener {
35
47
36
48
private final ReactApplicationContext reactContext ;
37
49
private Promise promise ;
50
+ private Boolean dangerouslyAllowInsecureHttpRequests ;
38
51
39
52
public RNAppAuthModule (ReactApplicationContext reactContext ) {
40
53
super (reactContext );
@@ -96,24 +109,53 @@ private HashMap<String, String> additionalParametersToMap(ReadableMap additional
96
109
return additionalParametersHash ;
97
110
}
98
111
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
+
99
134
@ ReactMethod
100
135
public void authorize (
101
136
String issuer ,
102
137
final String redirectUrl ,
103
138
final String clientId ,
104
139
final ReadableArray scopes ,
105
140
final ReadableMap additionalParameters ,
141
+ final Boolean dangerouslyAllowInsecureHttpRequests ,
106
142
final Promise promise
107
143
) {
108
144
109
145
final Context context = this .reactContext ;
146
+
147
+ // store args in private fields for later use in onActivityResult handler
110
148
this .promise = promise ;
111
- final Activity currentActivity = getCurrentActivity () ;
149
+ this . dangerouslyAllowInsecureHttpRequests = dangerouslyAllowInsecureHttpRequests ;
112
150
151
+ final Activity currentActivity = getCurrentActivity ();
113
152
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 );
114
156
115
- AuthorizationServiceConfiguration .fetchFromIssuer (
116
- Uri . parse ( issuer ),
157
+ AuthorizationServiceConfiguration .fetchFromUrl (
158
+ buildConfigurationUriFromIssuer ( issuerUri ),
117
159
new AuthorizationServiceConfiguration .RetrieveConfigurationCallback () {
118
160
public void onFetchConfigurationCompleted (
119
161
@ Nullable AuthorizationServiceConfiguration serviceConfiguration ,
@@ -123,6 +165,7 @@ public void onFetchConfigurationCompleted(
123
165
return ;
124
166
}
125
167
168
+
126
169
AuthorizationRequest .Builder authRequestBuilder =
127
170
new AuthorizationRequest .Builder (
128
171
serviceConfiguration ,
@@ -137,13 +180,14 @@ public void onFetchConfigurationCompleted(
137
180
}
138
181
139
182
AuthorizationRequest authRequest = authRequestBuilder .build ();
140
-
141
- AuthorizationService authService = new AuthorizationService (context );
183
+ AuthorizationService authService = new AuthorizationService (context , configuration );
142
184
Intent authIntent = authService .getAuthorizationRequestIntent (authRequest );
143
185
currentActivity .startActivityForResult (authIntent , 0 );
144
186
145
187
}
146
- });
188
+ },
189
+ builder
190
+ );
147
191
148
192
}
149
193
@@ -155,14 +199,20 @@ public void refresh(
155
199
final String refreshToken ,
156
200
final ReadableArray scopes ,
157
201
final ReadableMap additionalParameters ,
202
+ final Boolean dangerouslyAllowInsecureHttpRequests ,
158
203
final Promise promise
159
204
) {
160
205
final Context context = this .reactContext ;
161
-
162
206
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 );
163
210
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 ),
166
216
new AuthorizationServiceConfiguration .RetrieveConfigurationCallback () {
167
217
public void onFetchConfigurationCompleted (
168
218
@ Nullable AuthorizationServiceConfiguration serviceConfiguration ,
@@ -187,9 +237,7 @@ public void onFetchConfigurationCompleted(
187
237
188
238
TokenRequest tokenRequest = tokenRequestBuilder .build ();
189
239
190
-
191
- AuthorizationService authService = new AuthorizationService (context );
192
-
240
+ AuthorizationService authService = new AuthorizationService (context , configuration );
193
241
authService .performTokenRequest (tokenRequest , new AuthorizationService .TokenResponseCallback () {
194
242
@ Override
195
243
public void onTokenRequestCompleted (@ Nullable TokenResponse response , @ Nullable AuthorizationException ex ) {
@@ -203,7 +251,8 @@ public void onTokenRequestCompleted(@Nullable TokenResponse response, @Nullable
203
251
});
204
252
205
253
}
206
- });
254
+ },
255
+ builder );
207
256
}
208
257
209
258
@ Override
@@ -217,9 +266,11 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
217
266
}
218
267
219
268
final Promise authorizePromise = this .promise ;
269
+ final AppAuthConfiguration configuration = createAppAuthConfiguration (
270
+ createConnectionBuilder (this .dangerouslyAllowInsecureHttpRequests )
271
+ );
220
272
221
- AuthorizationService authService = new AuthorizationService (this .reactContext );
222
-
273
+ AuthorizationService authService = new AuthorizationService (this .reactContext , configuration );
223
274
authService .performTokenRequest (
224
275
response .createTokenExchangeRequest (),
225
276
new AuthorizationService .TokenResponseCallback () {
@@ -248,4 +299,4 @@ public void onNewIntent(Intent intent) {
248
299
public String getName () {
249
300
return "RNAppAuth" ;
250
301
}
251
- }
302
+ }
0 commit comments