我在使用登录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。
答案 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),
},
}