4

我在第二天与 LinkedIN API 战斗,每次我尝试获取令牌时,我都会收到 400 错误请求。

这是我的代码,也许有人可以帮忙?

public void RequestAuthentication(System.Web.HttpContextBase context, System.Uri returnUrl)
{
    string url = String.Format("https://www.linkedin.com/uas/oauth2/authorization?response_type=code" +
                 "&client_id={0}" +
                 "&scope={1}" +
                 "&state={3}" +
                 "&redirect_uri={2}",this._consumerKey,_scope,HttpUtility.UrlEncode(returnUrl.ToString()),Guid.NewGuid().ToString());
    context.Response.Redirect(url);
}

public AuthenticationResult VerifyAuthentication(System.Web.HttpContextBase context)
{
    //TODO: check CSRF
    string code = context.Request.QueryString["code"];

    string rawUrl = context.Request.Url.OriginalString;
    //From this we need to remove code portion
    rawUrl = Regex.Replace(rawUrl, "&code=[^&]*", "");

    string authUrl = "https://www.linkedin.com/uas/oauth2/accessToken";
    string postData = String.Format("grant_type=authorization_code&code={0}&redirect_uri={1}&client_id={2}&client_secret={3}", code,HttpUtility.UrlEncode(context.Request.QueryString["ReturnUrl"]), _consumerKey, _consumerSecret);

    //WebClient client = new WebClient();
    //var getReq =  client.DownloadString(authUrl + "?" + postData);

    HttpWebRequest webRequest = WebRequest.Create(authUrl + "?" + postData) as HttpWebRequest;
    webRequest.Method = "POST";

    //This "application/x-www-form-urlencoded"; line is important
    webRequest.ContentType = "application/x-www-form-urlencoded";

    webRequest.ContentLength = postData.Length;

    StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
    requestWriter.Write(postData);
    requestWriter.Close();

    StreamReader responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
}

任何想法 ?也许有人在过去解决了类似的问题?

4

2 回答 2

0

您必须在两者中使用相同的redirect_uri

public void RequestAuthentication(System.Web.HttpContextBase context, System.Uri returnUrl)

public AuthenticationResult VerifyAuthentication(System.Web.HttpContextBase context)

功能。但是在您的代码中,第一个函数 HttpUtility.UrlEncode(returnUrl.ToString())和第二个函数HttpUtility.UrlEncode(context.Request.QueryString["ReturnUrl"])的代码redirect_uri不一样(我认为)。因此,请确保您已解决此问题。您的代码可能有效。

于 2015-01-15T09:30:27.070 回答
0

我刚刚调试了这个,这是我在成功之前尝试过的一些事情。我不确定哪一个是正确的,所以我会把它们都记下来以防万一你需要从某个地方开始:

  • HTTP 协议 1.1
  • 添加content-type: application/x-www-form-urlencoded标题
  • 不刷新授权码返回页面的响应;URL参数中的代码($_GET['code']在PHP中)显然不能重复使用(另一个答案说它每20秒过期一次)
    • 换句话说,不要尝试重用或缓存授权码,尽快直接流入访问令牌请求中
  • 请尝试使用其他应用程序(如 SoapUI 或 Fiddlr)来访问端点以显示它正在工作,并更清楚地查看一些标头
    • 话虽如此,查看响应标头(不仅仅是响应代码)可能会有所帮助
  • 将数据作为 POST 内容而不是 URL 参数发送

请注意,400错误表示请求格式错误(400 BAD request HTTP 错误代码含义?)不是缺少资源(404),如果您想得太快,这也可能是一个陷阱。

于 2015-04-07T18:55:41.740 回答