3

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

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

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

现在我被困在我应该从 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,它只是我的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 规范中的描述计算

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

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

4

2 回答 2

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 plus?
于 2013-12-06T00:39:42.303 回答
0

根据有关此主题的Spring 论坛讨论,Spring Social 目前不支持在Exchange JSAPI Tokens for REST API OAuth Tokens中描述的 LinkedIn JSAPI Token Exchange 。

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

LinkedIn 开发者论坛讨论中发布的代码显示了如何使用Scribe执行交换。必须发送到 LinkedIn 的请求是标准 OAuth 请求,但必须access_token将 JSAPI 令牌对象中的字段作为 HTTP 查询参数发送xoauth_oauth2_access_tokenmember_id也可供您使用的信息仅供您参考,并且允许您signature在不查询 LinkedIn 的情况下进行验证。access_tokenmember_id

于 2014-05-13T13:42:47.723 回答