LinkedIn JS API令牌交换到使用Spring Social for LinkedIn的REST令牌



我想做以下事情:

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

我得到了Linkedin按钮设置,得到了授权cookie一直到我的服务器(如这里所述),并且能够验证令牌确实是用我的密钥正确签名的。

现在我被困在我应该从JSAPI获得令牌并将其交换为访问令牌的地方。

这是我使用的代码,如上所述,它使用Linkedin的Spring Social,它不起作用,因为它抛出401未经授权的响应:

    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呢,它只是我的linkedin密钥吗?whereDoIGetThisSignature呢,我怎么创建那个?我是否使用与验证linkedin响应相同的哈希方法并用我的秘密linkedin密钥哈希access_token ?在linkedin的页面上,它说:

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

  1. oauth_consumer_key,标识您自己
  2. xoauth_oauth2_access_token参数,设置为cookie中access_token字段的值。
  3. signature_method设置为HMAC-SHA1
  4. 签名,按照OAuth 1.0a规范
  5. 中的描述计算

所以(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
}

我需要用它做什么来进行下一步?

使用以下流程:

  • 读取cookie
  • 变换"signature":"..."&signature=...
  • 变换"signature_method":"HMAC-SHA1"&signature_method=HMAC-SHA1
  • 变换"member_id":"..."&oauth_customer_key=...
  • "access_token":"..."转换为&xoauth_oauth2_access_token=...
  • 将所有附加到LinkedIn url加上?

根据Spring论坛关于该主题的讨论,Spring Social目前不支持在Exchange JSAPI令牌for REST API OAuth令牌中描述的LinkedIn JSAPI令牌交换。

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

在LinkedIn开发者论坛讨论中发布的代码展示了如何使用Scribe执行交换。必须发送到LinkedIn的请求是一个标准的OAuth请求,但必须将JSAPI令牌对象中的access_token字段作为HTTP查询参数xoauth_oauth2_access_token发送。member_id也可供您使用,仅供您参考,signature允许您验证access_tokenmember_id而无需查询LinkedIn。

最新更新