使用spring社交的长期访问令牌

时间:2014-09-15 16:25:50

标签: spring spring-social

任何人都可以告诉我如何在spring social的帮助下获得社交网站的长期访问令牌。如果可能,请提供代码段。我使用的是spring 1.1.0 spring facebooklinkedIntwitter API。

3 个答案:

答案 0 :(得分:6)

对于使用OAuth 1.0a的Twitter,令牌不会过期。所以你应该得到一个几乎永远持续的令牌(只要用户不撤销它)。

对于Facebook来说,获得永远存在的令牌是不可能的(不管怎样)。您唯一的选择是获取令牌并尽可能使用它。令牌过期后,您必须再次通过授权流程以获取新令牌。好消息是Spring Social提供了ReconnectFilter来帮助您。请参阅Spring Social Showcase示例(https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase),特别是SocialConfig.javaWebMvcConfig.java,了解如何设置ReconnectFilter

我的记忆在LinkedIn上有点模糊,但我记得LinkedIn以与Facebook大致相同的方式处理过期的令牌(也就是说,你必须重新授权以获得新的令牌)。因此,ReconnectFilter也可以为您提供帮助。

请注意,上面针对FB和LI描述的行为是而不是符合OAuth 2规范。根据规范,刷新令牌与访问令牌一起被授予,并且可以在原件到期时用于获得新的访问令牌。 FB和LI没有实现规范的刷新令牌部分。我不知道究竟是为什么,但我怀疑它是因为它更安全。如果客户端必须通过授权流重定向用户以获取新令牌,则表示用户必须主动使用该应用程序并成为令牌续订的参与者。除了初始授权流程之外,按照规范的方法并不需要用户参与 - 即使用户再也不使用该应用程序,应用程序也可以永久续订令牌。

答案 1 :(得分:4)

似乎没有任何特殊功能准备将短命令牌交换为长寿命令牌。以下是适用于我的代码:

private static final String CLIENT_ID = "client_id";
private static final String APP_SECRET = "app_secret";
private static final String GRAPH_API_URL = "https://graph.facebook.com/oauth/access_token";
private static final String FB_EXCHANGE_TOKEN1 = "fb_exchange_token";
private static final String FB_EXCHANGE_TOKEN = "fb_exchange_token";
private static final String CLIENT_SECRET = "client_secret";
private static final String GRANT_TYPE = "grant_type";
(...)



 public void execute(LoginFlow message) {

    URI build = UriBuilder
            .fromPath(GRAPH_API_URL)
            .queryParam(CLIENT_ID, mClientId)
            .queryParam(GRANT_TYPE, FB_EXCHANGE_TOKEN1)
            .queryParam(CLIENT_SECRET, mAppSecret)
            .queryParam(FB_EXCHANGE_TOKEN, message.getAccessToken())
            .build();

    String url = build.toString();

    Facebook facebook = new FacebookTemplate(message.getAccessToken());
    ResponseEntity<String> exchange = facebook.restOperations()
            .exchange(url, HttpMethod.GET, HttpEntity.EMPTY, String.class);
    String response = exchange.getBody();
    String longTermToken = Utils.extractToken(response);
   (...)
}

答案 2 :(得分:0)

没有。在Facebook开发者网站上,他们为长期访问令牌提供了此选项:(输入APP_IDAPP_SECRETEXISTING_ACCESS_TOKEN的值

graph.facebook.com/oauth/access_token?client_id=APP_ID&client_secret=APP_SECRET&grant_type=fb_exchange_token&fb_exchange_token=EXISTING_ACCESS_TOKEN

如果我们提供短期或正常的访问令牌,我们将获得一个长期访问令牌。