尝试检索配置文件信息时,linkedin登录返回404

时间:2017-02-17 17:45:02

标签: go login linkedin linkedin-api

我在使用登录api的linkedin上有一个应用程序。它是一个使用go和goth身份验证库的Web应用程序。直到几天前我的应用程序正在验证用户是否正常。现在它返回此错误消息:

linkedin回复了404尝试获取用户信息

该应用程序连续几周没有更新。所以没有任何代码更改。

我应该提一下,它确实将我带到登录页面,但在输入我的用户名和密码后,它会重定向并输出上述错误

goth oauth api代码位于:https://github.com/markbates/goth/blob/master/providers/linkedin/linkedin.go

它本质上使用访问令牌调用此URL http://api.linkedin.com/v1/people/~:(id,first-name,last-name,headline,location:(name),picture-url,email-address)

是否有人知道api端点是否已更改或任何其他原因认证将停止工作?

我一直在查看博客,但我发现没有关于api的更新,似乎没有办法达到linkedin开发者支持,因为它只是指向stackoverflow。

2 个答案:

答案 0 :(得分:1)

因此深入研究了这个问题。似乎linkedin现在从他们的api返回http 2.0响应。

我通过编写一个小的go程序发现了这一点,我在本地机器和服务器代码所在的aws实例上运行。

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/http/httputil"
    "net/url"
)

const (
    bearerToken string = "AQVJampuUSuvWs5beuCvHiJYC--"
)

func main() {

    userEndpoint := "//api.linkedin.com/v1/people/~:(id,first-  name,last-name,headline,location:(name),picture-url,email-address)?format=json"

client := &http.Client{}

req, err := http.NewRequest("GET", "", nil)

req.URL = &url.URL{
    Scheme: "https",
    Host:   "api.linkedin.com",
    Opaque: userEndpoint,
}

req.Header.Set("Authorization", "Bearer "+bearerToken)
resp, err := client.Do(req)

request, _ := httputil.DumpRequest(req, true)

fmt.Println("request:", string(request))

data, _ := ioutil.ReadAll(resp.Body)

response, _ := httputil.DumpResponse(resp, false)

resp.Body.Close()

fmt.Println("response:", string(response))

fmt.Println(err, req.URL.String(), string(data))
}

在本地计算机上运行时,api返回了包含配置文件数据的响应。当我在aws实例上运行它时,它返回了一个带有http 2.0标头的404

以下是在aws

上运行此程序的输出的摘录

请求:获取https://api.linkedin.com/v1/people/~?format=json HTTP / 1.1 主持人:api.linkedin.com 授权:持票人AQVJampuUSuvWs5beu -

响应:未找到HTTP / 2.0 404 内容长度:5530 缓存控制:无存储 内容 - 语言:en 内容类型:text / html 日期:星期六,2017年2月18日03:45:21 GMT X-Li-Pop:prod-lva1-h2

<!-- EF of static content included-->
<html>
  <head>
  <title>404: Not Found</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <style type="text/css">
 /* GLOBAL */

现在我不知道这是一个错误还是预期的行为,但是当看起来正在拾取导致404时,似乎是在返回http 2.0响应。

我能够解决的问题是关闭http 2.0客户端支持。通过设置以下环境变量

GODEBUG = http2client = 0

此时,admin api会返回个人资料信息。

我很想知道这是facebook的错误还是go。希望来自linkedin的人可以加入。

答案 1 :(得分:1)

现在几天,我们偶尔会看到这些错误。

从今天开始,每个请求似乎都失败了 - 甚至在我的本地开发机器上(生产是AWS)。

在协议协商过程中看起来出现了问题,服务器只是挽救并返回标准的404响应。 LinkedIn似乎不支持APLN。

我现在的解决方法是创建一个不支持HTTP / 2的http.Client,如下所示:

client := &http.Client{
    Transport: &http.Transport{
        TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),
    },
}