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

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...