我们的应用程序使用LinkedIn OAuth 2.0登录,如此处记录:
使用OAuth 2.0进行身份验证
https://developer.linkedin.com/docs/oauth2
我们捕获并存储访问令牌,以便以后代表他们发布到用户的时间轴上,该记录有效并且已经运行了一年以上。
我们现在注意到的是,当我们使用相同的存储访问令牌甚至是新的访问令牌在用户的个人资料上执行GET时,请求失败。更加令人困惑的是,例外是“ SendFailure”错误,错误为“底层连接已关闭:发送中发生意外错误。”
请注意,即使使用TLS 1.2,也会发生这种情况,但这也是零星的。如果访问令牌是全新的(不到1分钟),则GET可以正常工作。但是,在测试过程中以及在多种情况下,当访问令牌的使用时间早了几分钟时,相同的GET调用就会失败,并显示“ ...连接已关闭”错误。
所讨论的逻辑正在尝试验证访问令牌。但是,由于LinkedIn没有本地API调用来验证自己的访问令牌(就像Facebook一样),因此我们正在使用其他人在SO上推荐的方法。
这是根据LinkedIn的文档使用的用户个人资料GET请求:
sample call
GET /v1/people/~ HTTP/1.1
Host: api.linkedin.com
Connection: Keep-Alive
Authorization: Bearer AQXdSP_W41_UPs5ioT_t8HESyODB4FqbkJ8LrV_5mff4gPODzOYR
使用OAuth 2.0进行身份验证/第4步-发出授权请求
https://developer.linkedin.com/docs/oauth2
使用LinkedIn登录/第2步-检索基本个人资料数据
https://developer.linkedin.com/docs/signin-with-linkedin
应用代码:
public bool AccessTokenIsValid(string accessToken, string accessTokenSecret, string appToken, string appKey, string appKeySecret)
{
bool isValid = false;
if (!string.IsNullOrWhiteSpace(accessToken))
{
WebHeaderCollection headers = new WebHeaderCollection();
headers.Add("Authorization", "Bearer " + "(access token)");
HttpResponseData userProfilePackage = HttpHelper.DoGetRequest("https://api.linkedin.com/v1/people/~?format=json", headers, true);
if (userProfilePackage.Status == System.Net.HttpStatusCode.OK)
{
isValid = true;
}
}
return isValid;
}
public static HttpResponseData DoGetRequest(string uri, WebHeaderCollection headers, bool setSecurityPortocol)
{
HttpWebRequest webReq = CreateWebRequest(uri);
if (setSecurityPortocol)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
}
foreach (string key in headers.Keys)
{
webReq.Headers.Add(key, headers[key]);
}
webReq.KeepAlive = true;
HttpWebResponse resp = null;
HttpResponseData respData = null;
try
{
resp = (HttpWebResponse)webReq.GetResponse();
respData = HttpData.PackageData(resp);
}
catch (WebException webEx)
{
resp = (HttpWebResponse)webEx.Response;
respData = HttpData.PackageError(resp, webEx, uri);
}
catch (Exception ex)
{
respData = HttpData.PackageError(null, ex, uri);
}
finally
{
if (resp != null)
{
resp.Close();
}
}
return respData;
}
要重申一下,代表用户发布内容的核心功能仍然可以正常工作。我也看过这里,但是信息。似乎已过期:LinkedIn OAuth2: "Unable to verify access token"
道歉,但有没有人对可能发生的事情有任何见解?为什么基本GET调用因新的访问令牌而失败。而且,如果正在使用TLS 1.2,为什么会显示“ ...连接已关闭”错误?
感谢您的帮助。