我想做以下事情:
让用户使用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的页面上,它说:
需要传递四个值作为查询参数:
- oauth_consumer_key,标识您自己
- xoauth_oauth2_access_token参数,设置为cookie中access_token字段的值。
- signature_method设置为HMAC-SHA1
- 签名,按照OAuth 1.0a规范
中的描述计算
所以(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_token
和member_id
而无需查询LinkedIn。