无状态资源服务器有效验证facebook令牌

aij0ehis  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(491)

我正在为移动应用程序前端编写一个资源服务器后端。该应用程序负责从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);
  }
}
vwoqyblh

vwoqyblh1#

只要对有效,就可以缓存访问令牌。要知道那是多久,你可以解释 expires_in 在来自facebook令牌端点的json响应中声明,如下所述:https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/

相关问题