【问题标题】:LinkedIn OAuth2: "Unable to verify access token"LinkedIn OAuth2:“无法验证访问令牌”
【发布时间】:2018-07-19 20:02:14
【问题描述】:

当且仅当用户在发出 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 上的第一次讨论表明,我并不是唯一一个遇到这些一致性问题的人。如果用户在 OAuth“跳舞”https://developer.linkedin.com/forum/unable-verify-access-token#comment-36950

期间清除了 cookie 或必须登录 LinkedIn,LinkedIn 就会出现问题

更新

感谢 Matthijs Bierman 已解决,请参阅下面的答案。

【问题讨论】:

    标签: oauth oauth-2.0 linkedin


    【解决方案1】:

    https://api.linkedin.com/v1/people/~?format=json&oauth2_access_token=[accessToken] 对我来说不起作用。

    添加请求头

    授权:承载[accessToken]

    直到我通过 sdk 中的链接并测试并发现它们还要求您添加请求标头后才起作用

    x-li-src: msdk

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

    希望 Linkedin 尽快修复这个未记录的要求...

    【讨论】:

    • 对我来说,这仅适用于来自 android 手机的访问令牌,不适用于 iOS 手机
    • 只有这个解决方案对我有用 :) 非常感谢!伙计们试试这个,它是 100% 工作的。
    • 我们需要把这个头文件放在哪个文件中?
    【解决方案2】:

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

    【讨论】:

    • 确实问题类似。 Authorization 标头和访问令牌查询参数似乎有不同的处理方式。令人困惑的是,LinkedIn 示例使用了 Authorization 标头。
    • 我在 2017 年尝试过这个,但它不再起作用了。我已经尝试过文档说(developer.linkedin.com/docs/oauth2),使用 Authorization: Bearer {access_token} 并使用 oauth2_access_token={access_token) 进行查询,但均未成功。几分钟后,这行得通。有人有更多信息吗?这似乎是他们方面的最终一致性。
    • @mwm 你能帮我解决与获取访问令牌相同的问题吗?分享我的问题帖子stackoverflow.com/questions/52501144/…
    【解决方案3】:

    来自移动 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 生成的,您可以通过仅删除第二个 header(x-li-src) 来使用与上述相同的 api。

    【讨论】:

      【解决方案4】:

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

      我查看了不同网站如何使用 LinkedIn 登录,这里有一个适合我的解决方案。

      在交换 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

      【讨论】:

      • 这确实是我的问题,应该指出作为问题的潜在答案。
      • 这是真的。当我将交换 AuthCode 到 AccessToken 过程从 POST 请求更改为 GET 请求时,401 错误被静音。
      【解决方案5】:

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

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

      结论:不要使用 Authorization 标头,而是使用 oauth2_access_token 查询参数。

      【讨论】:

        【解决方案6】:

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

        它的特征正如所描述的问题: 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
        }
        

        【讨论】:

        • 当您向linkedin 发出请求时,您正在生成一个新令牌。如果您尝试使用旧令牌,您将失败
        • 问题是我没有生成新的令牌。此外,有时新令牌仅失败大约 30 秒,然后它开始工作;但是,30 秒的登录时间是不可接受的。
        【解决方案7】:

        我尝试了上述所有解决方案,但没有与我一起工作。我从

        更改了我的网址
        https://www.linkedin.com/oauth/v2/ 
        

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

        它工作正常。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

          • 嗨,Kamyar,我正在按照developer.linkedin.com/documents/authentication 的步骤操作,每次用户对 LinkedIn 进行身份验证时,它都会给我一个新的访问令牌。使用不同浏览器的三个不同人观察到登录和未登录 LinkedIn 之间的区别。当我们得到一个 OAuth 对话框时,我们必须在 LinkedIn 上填写电子邮件/密码,然后我们将收到上述错误。我还在我们的系统旁边使用 curl 来检查是否存在持久连接问题。
          • Kamyar,您有什么建议可以让我们尝试一下吗?目前,由于提到的 LinkedIn OAuth2 流程存在问题,我们不得不向所有客户和成员发送邮件,告知我们无法使用 LinkedIn 身份验证。
          • @MarcWorrell 你能帮我解决与获取访问令牌相同的问题吗?分享我的问题帖子stackoverflow.com/questions/52501144/…
          • @PrasannaSasne 我看到您通过添加 CORS 标头解决了您的问题。很高兴知道您也可以使用它。
          【解决方案9】:

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

          【讨论】:

          • 你找到解决办法了吗?
          【解决方案10】:

          https://api.linkedin.com/v1/people/~?format=json&amp;oauth2_access_token=&lt;token&gt;

          默认情况下,返回XML格式的响应,加上format=json

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-23
            • 2016-09-04
            • 1970-01-01
            • 1970-01-01
            • 2016-09-15
            • 2019-03-10
            • 2018-09-07
            • 1970-01-01
            相关资源
            最近更新 更多