我正在与LinkedIN API争夺第二天,每次我尝试获取令牌时,我都会收到400 Bad Request。
这是我的代码,也许有人可以帮忙解决这个问题?
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());
}
有什么想法?也许有人在过去解决了类似问题?
答案 0 :(得分:0)
您必须在
中使用相同的 redirect_uripublic void RequestAuthentication(System.Web.HttpContextBase context, System.Uri returnUrl)
并且
public AuthenticationResult VerifyAuthentication(System.Web.HttpContextBase context)
功能。但是在你的代码 redirect_uri 的第一个函数 HttpUtility.UrlEncode(returnUrl.ToString())和第二个函数 HttpUtility.UrlEncode(context.Request.QueryString [“ReturnUrl “])不一样(我认为)。因此,请确保您已解决此问题。你可以使用代码。
答案 1 :(得分:0)
我刚调试了这个,这是我在成功之前尝试过的一些事情。我不确定哪一个是正确的,所以我会把它们全部放下,以防万一你需要从哪里开始:
content-type: application/x-www-form-urlencoded
标题$_GET['code']
)显然无法重复使用(another answer表示它每20秒到期一次)
请注意,400
错误表示格式错误的请求(400 BAD request HTTP error code meaning?)并非遗漏资源(404
),如果您考虑得太快,这也可能是错误的。