我正试图从LinkedIn获取访问令牌。
我正在关注此网址https://developer.linkedin.com/documents/authentication
我可以获得授权码。
但是当我将授权码传递给此URL时
https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code &code=AUTHORIZATION_CODE &redirect_uri=YOUR_REDIRECT_URI &client_id=YOUR_API_KEY &client_secret=YOUR_SECRET_KEY
我收到以下格式的错误
{"error":"invalid_request","error_description":"missing required parameters, includes an invalid parameter value, parameter more then once. : Unable to retrieve access token : appId or redirect uri does not match authorization code or authorization code expired"}
有什么想法吗?提前谢谢。
答案 0 :(得分:0)
这是因为授权代码在20秒后到期。因此,您必须在该时间范围内获得访问令牌。
答案 1 :(得分:0)
我遇到了和你一样的错误。我还满足以下条件:
POST
请求。redirect_uri
在/authorization
和/accessToken
来电中相同。/accessToken
调用在收到授权码后立即执行,所以
它不会过期。最后我的诀窍是撤销https://www.linkedin.com/secure/developer上应用程序详细信息页面上生成的访问令牌。
这是oAuth 1.a的访问令牌,与当前正在运行的linkedIn api的oAuth 2.0不兼容。
撤销此访问令牌后,我可以使用/authorization
和/accessToken
来调用新的访问令牌。
答案 2 :(得分:0)
我看到这是一个较旧的线程,但是如果可以帮助任何人,这是我的工作解决方案,截至2018年12月在MVC core 2.0上工作。
首先,像这样重定向到LinkedIn
var url = "https://" + Request.Host + "/Login/LoginLinkedIn";
url = WebUtility.UrlEncode(url);
var redirectLinkedIn = "https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=*ClientId*&client_secret=*ClientSecret*&redirect_uri=" + url + "&state=*random required nummeric value*";
return Redirect(redirectLinkedIn);
之后,您将在Login / LoginLinkedIn操作中收到答案(不要忘记在应用程序设置的“授权重定向URL”中指定此路径)。
在那里,您将使用此私有方法来获取一个充满用户数据的动态对象
private dynamic GetLinkedInUser(string code)
{
dynamic jresult;
NameValueCollection parameters = new NameValueCollection {
{"client_id", *ClientId*},
{"client_secret", *ClientSecret*},
{"grant_type", "authorization_code"},
{"redirect_uri", "https://" + Request.Host + "/Login/LoginLinkedIn"},
{"code", code}
};
WebClient client = new WebClient();
byte[] result = client.UploadValues("https://www.linkedin.com/oauth/v2/accessToken", "POST", parameters);
string response = System.Text.Encoding.Default.GetString(result);
string accessToken = JsonConvert.DeserializeObject<dynamic>(response).access_token;
WebRequest webReq = WebRequest.Create("https://api.linkedin.com/v1/people/~:(id,email-address,first-name,last-name)?format=json");
webReq.Method = "GET";
webReq.Headers.Add("Authorization","Bearer "+accessToken);
HttpWebResponse webResponse = (HttpWebResponse)webReq.GetResponse();
using (StreamReader reader = new StreamReader(webResponse.GetResponseStream())) {
string objText = reader.ReadToEnd();
jresult = JsonConvert.DeserializeObject<dynamic>(objText);
}
return jresult;
}
希望它对某人有帮助:)