18
18
19
19
import static bio .overture .ego .model .enums .JavaFields .REFRESH_ID ;
20
20
import static bio .overture .ego .utils .SwaggerConstants .AUTH_CONTROLLER ;
21
+ import static bio .overture .ego .utils .TypeUtils .isValidUUID ;
21
22
import static org .springframework .http .HttpStatus .*;
22
23
import static org .springframework .http .MediaType .TEXT_PLAIN_VALUE ;
23
24
import static org .springframework .web .bind .annotation .RequestMethod .*;
27
28
import bio .overture .ego .model .exceptions .InvalidTokenException ;
28
29
import bio .overture .ego .provider .google .GoogleTokenService ;
29
30
import bio .overture .ego .security .CustomOAuth2User ;
30
- import bio .overture .ego .service .PassportService ;
31
- import bio .overture .ego .service .RefreshContextService ;
32
- import bio .overture .ego .service .TokenService ;
31
+ import bio .overture .ego .service .*;
33
32
import bio .overture .ego .token .IDToken ;
34
33
import bio .overture .ego .token .signer .TokenSigner ;
35
34
import bio .overture .ego .utils .Tokens ;
50
49
import org .springframework .security .oauth2 .client .authentication .OAuth2AuthenticationToken ;
51
50
import org .springframework .util .StringUtils ;
52
51
import org .springframework .web .bind .annotation .*;
52
+ import org .springframework .web .client .HttpClientErrorException ;
53
53
54
54
@ Slf4j
55
55
@ RestController
@@ -65,6 +65,7 @@ public class AuthController {
65
65
private final GoogleTokenService googleTokenService ;
66
66
private final TokenSigner tokenSigner ;
67
67
private final RefreshContextService refreshContextService ;
68
+ private final UserService userService ;
68
69
private final String GA4GH_PASSPORT_SCOPE = "ga4gh_passport_v1" ;
69
70
70
71
@ Autowired
@@ -73,12 +74,14 @@ public AuthController(
73
74
@ NonNull PassportService passportService ,
74
75
@ NonNull GoogleTokenService googleTokenService ,
75
76
@ NonNull TokenSigner tokenSigner ,
76
- @ NonNull RefreshContextService refreshContextService ) {
77
+ @ NonNull RefreshContextService refreshContextService ,
78
+ @ NonNull UserService userService ) {
77
79
this .tokenService = tokenService ;
78
80
this .passportService = passportService ;
79
81
this .googleTokenService = googleTokenService ;
80
82
this .tokenSigner = tokenSigner ;
81
83
this .refreshContextService = refreshContextService ;
84
+ this .userService = userService ;
82
85
}
83
86
84
87
@ RequestMapping (method = GET , value = "/google/token" )
@@ -126,42 +129,54 @@ public ResponseEntity<String> user(
126
129
throw new RuntimeException ("no user" );
127
130
}
128
131
129
- val user = (CustomOAuth2User ) authentication .getPrincipal ();
132
+ val oAuth2User = (CustomOAuth2User ) authentication .getPrincipal ();
130
133
134
+ val passportJwtToken =
135
+ (oAuth2User .getClaim (GA4GH_PASSPORT_SCOPE ) != null )
136
+ ? passportService .getPassportToken (
137
+ authentication .getAuthorizedClientRegistrationId (), oAuth2User .getAccessToken ())
138
+ : null ;
131
139
132
- val passportJwtToken = (user .getClaim (GA4GH_PASSPORT_SCOPE ) != null ) ?
133
- passportService .getPassportToken (
134
- authentication .getAuthorizedClientRegistrationId (),
135
- user .getAccessToken ()) :
136
- null ;
140
+ Optional <ProviderType > providerType =
141
+ ProviderType .findIfExist (authentication .getAuthorizedClientRegistrationId ());
137
142
138
- Optional <ProviderType > providerType = ProviderType
139
- .findIfExist (authentication .getAuthorizedClientRegistrationId ());
140
-
141
- if (user .getClaim (GA4GH_PASSPORT_SCOPE ) != null && providerType .isEmpty ()){
143
+ if (oAuth2User .getClaim (GA4GH_PASSPORT_SCOPE ) != null && providerType .isEmpty ()) {
142
144
providerType = Optional .of (ProviderType .PASSPORT );
143
145
}
144
146
145
- String token =
147
+ val idToken =
148
+ IDToken .builder ()
149
+ .providerSubjectId (oAuth2User .getSubjectId ())
150
+ .email (oAuth2User .getEmail ())
151
+ .familyName (oAuth2User .getFamilyName ())
152
+ .givenName (oAuth2User .getGivenName ())
153
+ .providerType (providerType .get ())
154
+ .providerIssuerUri (oAuth2User .getIssuer ().toString ())
155
+ .build ();
156
+
157
+ val egoToken =
146
158
tokenService .generateUserToken (
147
- IDToken .builder ()
148
- .providerSubjectId (user .getSubjectId ())
149
- .email (user .getEmail ())
150
- .familyName (user .getFamilyName ())
151
- .givenName (user .getGivenName ())
152
- .providerType (providerType .get ())
153
- .providerIssuerUri (user .getIssuer ().toString ())
154
- .build (),
155
- passportJwtToken ,
156
- authentication .getAuthorizedClientRegistrationId ());
157
-
158
- val outgoingRefreshContext = refreshContextService .createInitialRefreshContext (token );
159
- val cookie =
160
- refreshContextService .createRefreshCookie (outgoingRefreshContext .getRefreshToken ());
161
- response .addCookie (cookie );
159
+ idToken , passportJwtToken , authentication .getAuthorizedClientRegistrationId ());
160
+
161
+ if (oAuth2User .getClaim (GA4GH_PASSPORT_SCOPE ) != null && oAuth2User .getRefreshToken () != null ) {
162
+ // create a cookie with passport refresh token
163
+ val user = userService .getUserByToken (idToken );
164
+ val outgoingRefreshContext =
165
+ refreshContextService .createPassportRefreshToken (user , oAuth2User .getRefreshToken ());
166
+ val cookie =
167
+ refreshContextService .createPassportRefreshCookie (
168
+ outgoingRefreshContext , oAuth2User .getRefreshToken ());
169
+ response .addCookie (cookie );
170
+ } else {
171
+ // create a cookie with refreshId
172
+ val outgoingRefreshContext = refreshContextService .createInitialRefreshContext (egoToken );
173
+ val cookie =
174
+ refreshContextService .createRefreshCookie (outgoingRefreshContext .getRefreshToken ());
175
+ response .addCookie (cookie );
176
+ }
162
177
163
178
SecurityContextHolder .getContext ().setAuthentication (null );
164
- return new ResponseEntity <>(token , OK );
179
+ return new ResponseEntity <>(egoToken , OK );
165
180
}
166
181
167
182
@ RequestMapping (
@@ -200,15 +215,41 @@ public ResponseEntity<String> refreshEgoToken(
200
215
return new ResponseEntity <>("Please login" , UNAUTHORIZED );
201
216
}
202
217
val currentToken = Tokens .removeTokenPrefix (authorization , TOKEN_PREFIX );
203
- // TODO: [anncatton] validate jwt before proceeding to service call.
204
218
205
- val outboundUserToken =
206
- refreshContextService .validateAndReturnNewUserToken (refreshId , currentToken );
207
- val newRefreshToken = tokenService .getTokenUserInfo (outboundUserToken ).getRefreshToken ();
208
- val newCookie = refreshContextService .createRefreshCookie (newRefreshToken );
209
- response .addCookie (newCookie );
219
+ try {
220
+ if (isValidUUID (refreshId )) {
221
+ val outboundUserToken =
222
+ refreshContextService .validateAndReturnNewUserToken (refreshId , currentToken );
223
+ val newRefreshToken = tokenService .getTokenUserInfo (outboundUserToken ).getRefreshToken ();
224
+ val newCookie = refreshContextService .createRefreshCookie (newRefreshToken );
225
+ response .addCookie (newCookie );
226
+
227
+ return new ResponseEntity <>(outboundUserToken , OK );
228
+ } else {
229
+
230
+ val user = tokenService .getTokenUserInfo (currentToken );
210
231
211
- return new ResponseEntity <>(outboundUserToken , OK );
232
+ val clientRegistration =
233
+ passportService .getPassportClientRegistrations ().get (user .getProviderIssuerUri ());
234
+
235
+ val passportResponse =
236
+ passportService .refreshToken (clientRegistration .getRegistrationId (), refreshId );
237
+
238
+ val egoToken = tokenService .generatePassportEgoToken (user , passportResponse .getAccess_token (), clientRegistration .getRegistrationId ());
239
+
240
+ val outgoingRefreshContext =
241
+ refreshContextService .createPassportRefreshToken (
242
+ user , passportResponse .getRefresh_token ());
243
+ val newCookie =
244
+ refreshContextService .createPassportRefreshCookie (
245
+ outgoingRefreshContext , passportResponse .getRefresh_token ());
246
+ response .addCookie (newCookie );
247
+
248
+ return new ResponseEntity <>(egoToken , OK );
249
+ }
250
+ }catch (HttpClientErrorException e ){
251
+ return new ResponseEntity <>(e .getResponseBodyAsString (), e .getStatusCode ());
252
+ }
212
253
}
213
254
214
255
@ ExceptionHandler ({InvalidTokenException .class })
0 commit comments