我正在为移动应用程序前端编写一个资源服务器后端。该应用程序负责从facebook获取一个令牌并将其传递到authz的后端,但由于它们不像其他提供商(如google、apple)那样使用jwt承载令牌。。。哪个Spring有很好的图书馆。。。我不得不编写这个自定义位来验证令牌并收集一些基本的用户信息。
这工作得相当好,但是如果我需要为我的无状态应用程序的每个请求运行这个,响应时间可能会变慢。我正在考虑对这个令牌进行某种形式的缓存,在它被验证之后(当然是使用ttl)。。。但我还是很好奇是否有什么既定的技术我应该使用。
@Data
class FacebookDetails {
private String id;
private String name;
private String email;
}
class Facebook {
public AuthenticationProvider getAuthenticationProvider() {
WebClient facebookWebClient = WebClient.create("https://graph.facebook.com/v10.0");
OpaqueTokenIntrospector introspector = = token -> {
Optional<ResponseEntity<FacebookDetails>> maybeResponse = facebookWebClient.get()
.uri("/me?fields=id,name,email&access_token=" + token)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.toEntity(FacebookDetails.class)
.onErrorResume(e -> Mono.empty())
.blockOptional(Duration.ofMinutes(1L));
if (maybeResponse.isEmpty()) {
throw new BadOpaqueTokenException("token is invalid");
}
FacebookDetails details = maybeResponse.get().getBody();
return details.getPrincipal();
};
return new OpaqueTokenAuthenticationProvider(introspector);
}
}
1条答案
按热度按时间vwoqyblh1#
只要对有效,就可以缓存访问令牌。要知道那是多久,你可以解释
expires_in
在来自facebook令牌端点的json响应中声明,如下所述:https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/