2016-07-18 4 views
0

Oauth2を使用して自分のサイトにGoogleplusログインを実装しようとしています。 ユーザが正常に認証されると使用される状態パラメータを渡したいと思います。 エラーはです。「OAuth 2パラメータは1つの値しか持てません:コード」。 私は、状態パラメータを使用しない場合、正常に動作し、ユーザーを認証します。私は間違って何をしていることができGoogleplus認証:OAuth 2パラメータには1つの値しか指定できません。コード

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); 
関連する問題