1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| public class MyOAuth2AccessTokenResponseHttpMessageConverter extends AbstractHttpMessageConverter<OAuth2AccessTokenResponse> { private static final Charset DEFAULT_CHARSET; private static final ParameterizedTypeReference<Map<String, Object>> PARAMETERIZED_RESPONSE_TYPE; private GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters.getJsonMessageConverter(); protected Converter<Map<String, Object>, OAuth2AccessTokenResponse> tokenResponseConverter = new OAuth2AccessTokenResponseConverter(); protected Converter<OAuth2AccessTokenResponse, Map<String, Object>> tokenResponseParametersConverter = new OAuth2AccessTokenResponseParametersConverter();
public MyOAuth2AccessTokenResponseHttpMessageConverter() { super(DEFAULT_CHARSET, new MediaType[]{MediaType.APPLICATION_JSON, new MediaType("application", "*+json")}); }
protected boolean supports(Class<?> clazz) { return OAuth2AccessTokenResponse.class.isAssignableFrom(clazz); }
protected OAuth2AccessTokenResponse readInternal(Class<? extends OAuth2AccessTokenResponse> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { try { Map<String, Object> tokenResponseParameters = (Map)this.jsonMessageConverter.read(PARAMETERIZED_RESPONSE_TYPE.getType(), (Class)null, inputMessage); return (OAuth2AccessTokenResponse)this.tokenResponseConverter.convert(tokenResponseParameters); } catch (Exception var4) { throw new HttpMessageNotReadableException("An error occurred reading the OAuth 2.0 Access Token Response: " + var4.getMessage(), var4, inputMessage); } }
protected void writeInternal(OAuth2AccessTokenResponse tokenResponse, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { try { Map<String, String> tokenResponseParameters = (Map)this.tokenResponseParametersConverter.convert(tokenResponse); this.jsonMessageConverter.write(tokenResponseParameters, PARAMETERIZED_RESPONSE_TYPE.getType(), MediaType.APPLICATION_JSON, outputMessage); } catch (Exception var4) { throw new HttpMessageNotWritableException("An error occurred writing the OAuth 2.0 Access Token Response: " + var4.getMessage(), var4); } }
public final void setTokenResponseConverter(Converter<Map<String, Object>, OAuth2AccessTokenResponse> tokenResponseConverter) { Assert.notNull(tokenResponseConverter, "tokenResponseConverter cannot be null"); this.tokenResponseConverter = tokenResponseConverter; }
public final void setTokenResponseParametersConverter(Converter<OAuth2AccessTokenResponse, Map<String, Object>> tokenResponseParametersConverter) { Assert.notNull(tokenResponseParametersConverter, "tokenResponseParametersConverter cannot be null"); this.tokenResponseParametersConverter = tokenResponseParametersConverter; }
static { DEFAULT_CHARSET = StandardCharsets.UTF_8; PARAMETERIZED_RESPONSE_TYPE = new ParameterizedTypeReference<Map<String, Object>>() { }; }
private static class OAuth2AccessTokenResponseParametersConverter implements Converter<OAuth2AccessTokenResponse, Map<String, Object>> { private OAuth2AccessTokenResponseParametersConverter() { }
public Map<String, Object> convert(OAuth2AccessTokenResponse tokenResponse) { Map<String, Object> parameters = new HashMap(); long expiresIn = -1L; if (tokenResponse.getAccessToken().getExpiresAt() != null) { expiresIn = ChronoUnit.SECONDS.between(Instant.now(), tokenResponse.getAccessToken().getExpiresAt()); }
parameters.put("access_token", tokenResponse.getAccessToken().getTokenValue()); parameters.put("token_type", tokenResponse.getAccessToken().getTokenType().getValue()); parameters.put("expires_in", String.valueOf(expiresIn)); if (!CollectionUtils.isEmpty(tokenResponse.getAccessToken().getScopes())) { parameters.put("scope", StringUtils.collectionToDelimitedString(tokenResponse.getAccessToken().getScopes(), " ")); }
if (tokenResponse.getRefreshToken() != null) { parameters.put("refresh_token", tokenResponse.getRefreshToken().getTokenValue()); }
if (!CollectionUtils.isEmpty(tokenResponse.getAdditionalParameters())) { tokenResponse.getAdditionalParameters().entrySet().stream().forEach((e) -> { String var10000 = (String)parameters.put(e.getKey(), e.getValue().toString()); }); }
return parameters; } }
private static class OAuth2AccessTokenResponseConverter implements Converter<Map<String, Object>, OAuth2AccessTokenResponse> { private static final Set<String> TOKEN_RESPONSE_PARAMETER_NAMES = (Set) Stream.of("access_token", "token_type", "expires_in", "refresh_token", "scope").collect(Collectors.toSet());
private OAuth2AccessTokenResponseConverter() { }
public OAuth2AccessTokenResponse convert(Map<String, Object> tokenResponseParameters) { String accessToken = (String)tokenResponseParameters.get("access_token"); OAuth2AccessToken.TokenType accessTokenType = null; if (OAuth2AccessToken.TokenType.BEARER.getValue().equalsIgnoreCase((String)tokenResponseParameters.get("token_type"))) { accessTokenType = OAuth2AccessToken.TokenType.BEARER; }
long expiresIn = 0L; if (tokenResponseParameters.containsKey("expires_in")) { try { expiresIn = Long.valueOf((String)tokenResponseParameters.get("expires_in")); } catch (NumberFormatException var9) { } }
Set<String> scopes = Collections.emptySet(); String refreshToken; if (tokenResponseParameters.containsKey("scope")) { refreshToken = (String)tokenResponseParameters.get("scope"); scopes = (Set) Arrays.stream(StringUtils.delimitedListToStringArray(refreshToken, " ")).collect(Collectors.toSet()); }
refreshToken = (String)tokenResponseParameters.get("refresh_token"); Map<String, Object> additionalParameters = new LinkedHashMap(); tokenResponseParameters.entrySet().stream().filter((e) -> { return !TOKEN_RESPONSE_PARAMETER_NAMES.contains(e.getKey()); }).forEach((e) -> { additionalParameters.put(e.getKey(), e.getValue()); }); return OAuth2AccessTokenResponse.withToken(accessToken).tokenType(accessTokenType).expiresIn(expiresIn).scopes(scopes).refreshToken(refreshToken).additionalParameters(additionalParameters).build(); } } }
|