2013-06-10 2 views
4

LinkedIN API로 두 번째 날과 싸우고 있습니다. 토큰을 받으려고 할 때마다 400 번의 잘못된 요청이 발생합니다.LInkedIn oAuth2 요청 토큰 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()); 
} 

의견이 있으십니까? 어쩌면 다른 누군가가 과거에 비슷한 것을 해결했을 것입니까?

+0

기계에서 날짜가 잘못되어 400 오류가 발생할 수 있습니다. (조금 늦었지만 누군가에게 도움이 될 수 있습니다.) – DavidEG

답변

0

당신은 모두

public 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"])의 코드 redirect_uri로 (나는 생각한다) 동일하지 않습니다. 따라서이 문제를 해결했는지 확인하십시오. 당신은 코드가 효과가있을 수 있습니다.

0

방금 ​​디버깅했습니다. 성공하기 전에 시도한 몇 가지 사항이 있습니다. 하나는 올바른했다하는 잘 모르겠어요, 그래서 단지의 경우 모두 내려 놓을 게 시작하는 곳이 필요합니다

  • 새로 고침하지 마십시오

    • HTTP 프로토콜 1.1
    • content-type: application/x-www-form-urlencoded 헤더를 추가 인증 코드 리턴 페이지로부터의 응답; 분명히 다시 사용할 수없는 URL 매개 변수의 코드 (PHP에서 $_GET['code'])
      • 이 다른 방법을 넣어 (another answer 그것은 20 초마다 만료 말한다), 재사용하기 위해 시도하거나 캐시하지 않습니다 인증 코드는 직접 액세스 토큰 요청으로 흐름을 빨리
    • 가 작동하고 표시하기 위해 엔드 포인트를 칠 (SoapUI 또는 Fiddlr 같은) 다른 응용 프로그램을 사용하려고 말고,
        더 명확하게 몇 가지 헤더를 볼 수
      • 즉, 응답 헤더 (응답 코드뿐만 아니라)를 보면 도움이 될 수 있습니다.
    • 없습니다 또한 만약 잡았다가 될 수있는 URL 매개 변수 400 오류가 잘못된 요청 (400 BAD request HTTP error code meaning?)을 나타내는 것을

    참고하지 누락 된 자원 (404)로 POST의 콘텐츠로 데이터 전송 너무 빨리 생각하고있어.