LinkedIn - 如何获取访问令牌?

时间:2013-08-05 07:38:28

标签: c# linkedin

我正试图从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"}

有什么想法吗?提前谢谢。

3 个答案:

答案 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;
}

希望它对某人有帮助:)