问题描述
我正在为移动应用前端编写资源服务器后端。该应用程序负责从 Facebook 获取令牌并将其传递给 authz 的后端,但因为它们不像其他提供商(例如谷歌、苹果)那样使用 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);
}
}
解决方法
只要访问令牌有效,就可以缓存它。要了解多长时间,您可以解释来自 Facebook 令牌端点的 JSON 响应中的 expires_in
声明,如下所述:https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/