2016-07-18 3 views
0

Oauth2를 사용하여 내 사이트에 Googleplus 로그인을 구현하려고합니다. 일단 사용자가 성공적으로 인증되면 사용되는 상태 매개 변수를 전달하고 싶습니다. 내가 받고있는 오류는 입니다. "OAuth 2 매개 변수는 하나의 값만 가질 수 있습니다 : 코드". state 매개 변수를 사용하지 않으면 제대로 작동하고 사용자를 인증합니다. 내가 무슨 일을하고있을 수Googleplus 인증 : OAuth 2 매개 변수는 단일 값만 가질 수 있습니다. 코드

protected void Page_Load(object sender, EventArgs e) 
    { 
     string returnPath = Request.QueryString["ReturnUrl"]; 
     if (returnPath == null) 
     { 
      returnPath = "ManageAccount.aspx"; 
     } 
     else 
     { 
      returnPath = Request.QueryString["ReturnUrl"].ToString(); 
     } 
     Session["state"] = returnPath; 
      if (Session["Provider"] != null) 
      { 
       if (Session["Provider"].ToString() == "Google") 
       { 
        try 
        { 
         var url = Request.Url.Query; 
         if (url != "") 
         { 
          string queryString = url.ToString(); 
          char[] delimiterChars = { '=' }; 
          string[] words = queryString.Split(delimiterChars); 
          string code = words[1]; 

          if (code != null) 
          { 
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token"); 
            webRequest.Method = "POST"; 
            Parameters = "code=" + code + "&client_id=" + googleplus_client_id + "&client_secret=" + googleplus_client_sceret + "&redirect_uri=" + googleplus_redirect_url + "&grant_type=authorization_code"; 
            byte[] byteArray = Encoding.UTF8.GetBytes(Parameters); 
            webRequest.ContentType = "application/x-www-form-urlencoded"; 
            webRequest.ContentLength = byteArray.Length; 
            Stream postStream = webRequest.GetRequestStream(); 
            // Add the post data to the web request 
            postStream.Write(byteArray, 0, byteArray.Length); 
            postStream.Close(); 
            WebResponse response = webRequest.GetResponse(); 
            postStream = response.GetResponseStream(); 
            StreamReader reader = new StreamReader(postStream); 
            string responseFromServer = reader.ReadToEnd(); 
            GooglePlusAccessToken serStatus = JsonConvert.DeserializeObject<GooglePlusAccessToken>(responseFromServer); 

            if (serStatus != null) 
            { 
             accessToken = serStatus.access_token; 
             if (!string.IsNullOrEmpty(accessToken)) 
             { 
              getgoogleplususerdataSer(accessToken); 
             } 
            } 
          } 
         } 
        } 
        catch (WebException wex) 
        { 
         if (wex.Response != null) 
         { 
          using (var errorResponse = (HttpWebResponse)wex.Response) 
          { 
           using (var reader = new StreamReader(errorResponse.GetResponseStream())) 
           { 
            string error = reader.ReadToEnd(); 
            lblMessage.Text = error; 
           } 
          } 
         } 
        } 
       } 
      } 
    } 

protected void btnGoogleLogin_Click(object sender, System.EventArgs e) 
    { 
     var Googleurl = "https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=" + googleplus_redirect_url + "&scope=https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&client_id=" + googleplus_client_id + "&state=" + Session["state"]; 
     Session["Provider"] = "Google"; 
     Response.Redirect(Googleurl); 
    } 

: 아래 내 코드?

답변

0

나는 상태 매개 변수를 피하기로 결정했습니다. 대신 성공적인 인증 후에 사용하기 위해 쿠키에 ReturnUrl을 저장했습니다.

returnPath = Request.QueryString["ReturnUrl"]; 
     if (returnPath == null) 
     { 
      returnPath = "ManageAccount.aspx"; 
     } 
     else 
     { 
      returnPath = Request.QueryString["ReturnUrl"].ToString(); 
     } 
     //Create a cookie to redirect user after login 
     HttpCookie rCookie = new HttpCookie("RedirectCookie"); 
     DateTime now = DateTime.Now; 
     rCookie.Value = returnPath; 
     Response.Cookies.Add(rCookie);