220 FederatedIdentityModel model = session.users().getFederatedIdentity(tokenSubject,
getConfig().getAlias(), authorizedClient.getRealm());
221 if (model == null || model.getToken() == null) {
222 event.detail(Details.REASON,
"requested_issuer is not linked");
223 event.error(Errors.INVALID_TOKEN);
224 return exchangeNotLinked(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
227 String modelTokenString = model.getToken();
228 AccessTokenResponse tokenResponse = JsonSerialization.readValue(modelTokenString, AccessTokenResponse.class);
230 if (exp != null && exp < Time.currentTime()) {
231 if (tokenResponse.getRefreshToken() == null) {
232 return exchangeTokenExpired(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
234 String response = SimpleHttp.doPost(
getConfig().getTokenUrl(), session)
235 .param(
"refresh_token", tokenResponse.getRefreshToken())
239 if (response.contains(
"error")) {
240 logger.debugv(
"Error refreshing token, refresh token expiration?: {0}", response);
241 model.setToken(null);
242 session.users().updateFederatedIdentity(authorizedClient.getRealm(), tokenSubject, model);
243 event.detail(Details.REASON,
"requested_issuer token expired");
244 event.error(Errors.INVALID_TOKEN);
245 return exchangeTokenExpired(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
247 AccessTokenResponse newResponse = JsonSerialization.readValue(response, AccessTokenResponse.class);
248 if (newResponse.getExpiresIn() > 0) {
249 int accessTokenExpiration = Time.currentTime() + (int) newResponse.getExpiresIn();
251 response = JsonSerialization.writeValueAsString(newResponse);
253 String oldToken = tokenUserSession.getNote(FEDERATED_ACCESS_TOKEN);
254 if (oldToken != null && oldToken.equals(tokenResponse.getToken())) {
255 int accessTokenExpiration = newResponse.getExpiresIn() > 0 ? Time.currentTime() + (int) newResponse.getExpiresIn() : 0;
258 tokenUserSession.setNote(FEDERATED_ACCESS_TOKEN, newResponse.getToken());
262 model.setToken(response);
263 tokenResponse = newResponse;
264 }
else if (exp != null) {
265 tokenResponse.setExpiresIn(exp - Time.currentTime());
267 tokenResponse.setIdToken(null);
268 tokenResponse.setRefreshToken(null);
269 tokenResponse.setRefreshExpiresIn(0);
270 tokenResponse.getOtherClaims().clear();
271 tokenResponse.getOtherClaims().put(OAuth2Constants.ISSUED_TOKEN_TYPE, OAuth2Constants.ACCESS_TOKEN_TYPE);
272 tokenResponse.getOtherClaims().put(ACCOUNT_LINK_URL, getLinkingUrl(uriInfo, authorizedClient, tokenUserSession));
274 return Response.ok(tokenResponse).type(MediaType.APPLICATION_JSON_TYPE).build();
275 }
catch (IOException e) {
276 throw new RuntimeException(e);
static final String OAUTH2_PARAMETER_CLIENT_ID
Definition: AbstractOAuth2IdentityProvider.java:91
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
static final String FEDERATED_ID_TOKEN
Definition: OIDCIdentityProvider.java:74
static final String FEDERATED_REFRESH_TOKEN
Definition: AbstractOAuth2IdentityProvider.java:80
static final Logger logger
Definition: OIDCIdentityProvider.java:71
static final String OAUTH2_PARAMETER_CLIENT_SECRET
Definition: AbstractOAuth2IdentityProvider.java:92
static final String ACCESS_TOKEN_EXPIRATION
Definition: OIDCIdentityProvider.java:78
static final String OAUTH2_PARAMETER_GRANT_TYPE
Definition: AbstractOAuth2IdentityProvider.java:93
static final String OAUTH2_GRANT_TYPE_REFRESH_TOKEN
Definition: AbstractOAuth2IdentityProvider.java:77
static final String FEDERATED_TOKEN_EXPIRATION
Definition: AbstractOAuth2IdentityProvider.java:81