LinkedIn OAuth2:"无法验证访问令牌"

时间:2015-01-22 17:22:58

标签: oauth oauth-2.0 linkedin

当且仅当用户在发出OAuth2请求时登录到LinkedIn时才能正常工作。

如果用户未登录,则会遇到错误。

我们的行动顺序:

  • 成功获取新访问令牌
  • 使用访问令牌,发布到api端点https://api.linkedin.com/v1/people/\~

在此之后,我们收到401以下内容:

{
  "errorCode": 0,
  "message": "Unable to verify access token",
  "requestId": "C0DUCX81SA",
  "status": 401,
  "timestamp": 1421946470523
}

有时,经过一段时间后,使用相同的访问令牌重试会产生200.有时不会。

如果用户在此“401期间”登录LinkedIn,那么神奇的是先前获取的访问令牌开始工作。

我不知道如何解决这个问题,因为它似乎是LinkedIn的一个问题。

有人有任何建议或者之前有人看到过这种行为吗?

我们尝试过Cookie设置,等待我们的请求之前等等。

我们正在向Zotonic [1]添加LinkedIn OAuth2身份验证,但现在仍然使用非工作模块。

[1] http://zotonic.com/

修改

有人提到LinkedIn的两个讨论。他的答复现在遗憾地从下面的讨论中消失了。

这些是链接:

https://developer.linkedin.com/forum/unable-verify-access-token

https://developer.linkedin.com/forum/unauthorized-invalid-or-expired-token-immediately-after-receiving-oauth2-token

我在这些讨论中尝试了所有建议,但无济于事。

编辑#2:

检查LinkedIn上的第一个讨论表明,我不是唯一一个遇到这些一致性问题的人。如果用户已经清除了cookie或者在OAuth“舞蹈”期间必须登录LinkedIn,那么LinkedIn的某些内容就会出错https://developer.linkedin.com/forum/unable-verify-access-token#comment-36950

更新

解决了,感谢Matthijs Bierman,请看下面的答案。

10 个答案:

答案 0 :(得分:20)

对我而言,https://api.linkedin.com/v1/people/~?format=json&oauth2_access_token=[accessToken]无效。

添加reguest标题

授权:持票人[accessToken]

直到我在sdk中进行链接测试并发现它们还要求您添加请求标题

之后才能正常工作

x-li-src:msdk

使用这两个标题,调用https://api.linkedin.com/v1/people/~?format=json起作用。

希望Linkedin很快修复这个无证件的要求......

答案 1 :(得分:6)

我们通过电话交谈,结果发现您遇到与here相同的问题。 LinkedIn不接受Authentication标头,并且需要一个请求参数:oauth2_access_token

答案 2 :(得分:5)

来自移动SDK的

AccessToken给出此错误:

使用网络 OAuth 2.0 协议生成的accessToken不会遇到任何问题。当后端使用accessToken来获取用户详细信息时,仅在移动(iOS / Android)SDK上会出现此问题。

解决方案:在下面提供2个标题

  1. 授权
  2. x-li-src(跳过网页)

例如:

网址: https://api.linkedin.com/v1/people/~?format=json

标题:

Authorization: Bearer AQVYqTNB3bFRAIatBcp4hM1r-......

x-li-src:  msdk 

注意:

如果AccessToken是使用OAuth 2.0生成的,则可以通过删除第二个标头(x-li-src)使用与上述相同的api。

答案 3 :(得分:2)

在Matthijs Bierman的帮助下,我们找到了解决问题的方法。

我们使用Authorization: Bearer ....标头进行了身份验证。 如果我们使用oauth2_access_token查询参数,那么它可以在有和没有登录LinkedIn用户的用例中工作。

结论:请勿使用授权标头,而是使用 oauth2_access_token 查询参数。

答案 4 :(得分:2)

同样在这里,每当我获得新的access_token时,我必须等待几分钟直到它有效。这是不可接受的。

我看了一下不同网站如何使用LinkedIn进行SignIn,这是一个适合我的解决方案。

交换AUTH_CODE以获取ACCESS_TOKEN时使用GET方法而不是POST,例如:

GET https://www.linkedin.com/oauth/v2/accessToken?client_id=yourClientId&client_secret=yourClientSecret&grant_type=authorization_code&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2FlinkedInLogin&code=AQQGx11-p1uaQWz2YBWHBcskaGrVrEDeFUo4O2vjolFaKaQ89UhGlR27_yDACNLoxDmYi7AR5sCplwsHLD_ERAVsscFozo-qRl032aFnj2UcUoPjCfo

Grails与LinkedIn OAuth2集成示例: https://github.com/rgrebski/samples/tree/master/grails-linkedin-integration

答案 5 :(得分:1)

我看到了同样的问题;但是,查询参数对我不起作用。

它的特点是描述的问题: 1)我有一个有效的令牌 2)用户退出linkedin 3)用户配置文件的请求失败 4)等待五分钟,然后成功

您可以在下面看到我的请求/回复:

$ curl -v  "https://api.linkedin.com/v1/people/~?format=json&oauth2_access_token=$LI_AT"
* Hostname was NOT found in DNS cache
*   Trying 108.174.10.12...
* Connected to api.linkedin.com (108.174.10.12) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
* Server certificate: tablet.linkedin.com
* Server certificate: DigiCert SHA2 Secure Server CA
* Server certificate: DigiCert Global Root CA
> GET /v1/people/~?format=json&oauth2_access_token=[**obscurred for security sake**] HTTP/1.1
> User-Agent: curl/7.37.1
> Host: api.linkedin.com
> Accept: */*
> 
< HTTP/1.1 401 Unauthorized
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< x-li-request-id: LZ2X5Y9DCC
< Date: Thu, 20 Aug 2015 16:12:52 GMT
< Vary: *
< x-li-format: json
< Content-Type: application/json;charset=UTF-8
< Content-Length: 142
< X-Li-Fabric: prod-ltx1
< Connection: keep-alive
< X-Li-Pop: prod-lva1
< X-LI-UUID: lS7xYKc3/BNAj0nmNSsAAA==
< Set-Cookie: lidc="b=TB76:g=111:u=47:i=1440087172:t=1440094069:s=AQHPHzjyg93X3bnT8KuNvThuwQo5buSS"; Expires=Thu, 20 Aug 2015 18:07:49 GMT; domain=.linkedin.com; Path=/
< 
{
  "errorCode": 0,
  "message": "Unable to verify access token",
  "requestId": "LZ2X5Y9DCC",
  "status": 401,
  "timestamp": 1440087172914
* Connection #0 to host api.linkedin.com left intact
}

答案 6 :(得分:1)

我尝试了以上所有解决方案,但没有与我合作。我改变了我的网址

https://www.linkedin.com/oauth/v2/ 

https://www.linkedin.com/uas/oauth2/

它运作正常。

答案 7 :(得分:0)

LinkedIn.com上用户的身份验证状态(无论他们是否已登录)对有效的OAuth访问令牌没有影响。换句话说,用户可以退出LinkedIn.com,该令牌应该仍然有效,直到它被撤销或过期。

您是否有可能生成新令牌?这会使前一个无效。您已共享的错误消息通常是在刷新令牌并且您使用之前的令牌进行API调用时引起的

答案 8 :(得分:0)

以上都不适合我。任何人都知道是否有解决方案? 有时它的工作,有时不会没有任何代码更改。

答案 9 :(得分:0)

https://api.linkedin.com/v1/people/~?format=json&oauth2_access_token=<token>

默认情况下,它以XML格式返回响应,添加format=json