使用Spring Social for Linkedin将LinkedIn JS API令牌交换为REST令牌

时间:2013-05-17 22:25:55

标签: spring algorithm debugging rest linkedin-jsapi

我正在尝试执行以下操作:

让用户使用Linkedin JSAPI通过Linkedin进行身份验证和授权,然后获取身份验证详细信息并将其发送到我的服务器以通过服务器端通信获取用户配置文件。

我设置了Linkedin按钮,将授权cookie一直提供给我的服务器(如here所述),并且能够使用我的密钥验证令牌是否确实正确签名。

现在我陷入了我应该从JSAPI获取令牌并将其换成访问令牌的地步。

这是我正在使用的代码,如上所述它使用Spring Social for Linkedin,它不起作用,因为它抛出401 Unauthorized响应:

    LinkedInConnectionFactory connectionFactory = 
            new LinkedInConnectionFactory(myLinkedinId, myLinkedinSecret);
    OAuth1Operations oauthOperations = connectionFactory.getOAuthOperations();
    AuthorizedRequestToken art = new AuthorizedRequestToken(new OAuthToken(codeIGotFromJSAPI, aSecretKey), whereDoIGetThisSignature);
    OAuthToken accessGrant = oauthOperations.exchangeForAccessToken(art, null);
    if (accessGrant == null) return null;
    Connection<LinkedIn> connection = connectionFactory.createConnection(accessGrant);
    if (connection != null) {
        LinkedIn linkedin = connection.getApi();
        return linkedin.profileOperations().getUserProfile();
    }

我真正感到困惑的是AuthorizedRequestToken对象。我认为codeIGotFromJSAPI部分很简单,它只是access_token,但是aSecretKey呢,它只是我的密钥密钥吗?怎么样的doDoIGetThisSignature,我该如何创建那个?我是否使用与用于验证linkedin响应相同的哈希方法,并使用我的秘密linkedin密钥对access_token进行哈希处理?在linkedin页面中,它显示:

  

您需要传递四个值作为查询参数:

     
      
  1. oauth_consumer_key,以表明自己的身份
  2.   
  3. xoauth_oauth2_access_token参数,设置为cookie中access_token字段的值。
  4.   
  5. signature_method设置为HMAC-SHA1
  6.   
  7. 签名,按照OAuth 1.0a规范
  8. 中的描述计算   

所以(1)是由我想的连接自动完成的,(2)是我提供的访问令牌,但我该怎么做(3)和(4)?

假设我在Linkedin设置的JSAPI cookie中获得以下数据:

{
 "signature_method":"HMAC-SHA1",
 "signature_order": ["access_token", "member_id"],
 "access_token":"AD2dpVe1tOclAsNYsCri4nOatfstw7ZnMzWP",
 "signature":"73f948524c6d1c07b5c554f6fc62d824eac68fee",
 "member_id":"vvUNSej47H"
 "signature_version": 1
}

我需要做些什么才能完成下一步?

2 个答案:

答案 0 :(得分:1)

使用以下过程:

  • 阅读Cookie
  • "signature":"..."转换为&signature=...
  • "signature_method":"HMAC-SHA1"转换为&signature_method=HMAC-SHA1
  • "member_id":"..."转换为&oauth_customer_key=...
  • "access_token":"..."转换为&xoauth_oauth2_access_token=...
  • 将所有内容附加到LinkedIn网址加?

答案 1 :(得分:0)

Exchange JSAPI Tokens for REST API OAuth Tokens目前不支持Spring forum discussion中描述的LinkedIn JSAPI令牌交换,根据LinkedIn developer forum discussion关于此主题的说法。

但是,如果没有Spring Social,可以使用可用于Java的标准OAuth库来实现解决此任务的实现。您从交换机获得的LinkedIn用户访问令牌可以放入新的AccessGrant对象中,该对象可用于在用户中创建Spring Social Connection<?> ConnectionRepository

Scribe中发布的代码显示了如何使用{{3}}执行交换。必须发送到LinkedIn的请求是标准OAuth请求,但必须将来自JSAPI令牌对象的access_token字段作为HTTP查询参数xoauth_oauth2_access_token发送。您可以使用的member_id仅供参考,signature可让您在不查询LinkedIn的情况下验证access_tokenmember_id