0

Google Open Auth 2.0 を介してユーザー認証を実装しようとしています。私はすでに Google から「コード」を取得することに成功しており、現在、ユーザーの情報にアクセスするための access_token を取得しようとしています。これはコントローラーのコードです:

    public void Google(string code)
    {
        if (!string.IsNullOrWhiteSpace(code))
        {
            var parameters = new Dictionary<string, string>();
            parameters["code"] = code;
            parameters["client_id"] = ConfigurationProvider.GoogleApplicationId;
            parameters["client_secret"] = ConfigurationProvider.GoogleClientSecret;
            parameters["redirect_uri"] = "http://localhost:1291" + Url.Action("GoogleAuth");
            parameters["grant_type"] = "authorization_code";

            var keyValuePairs = new string[parameters.Count];
            var i = 0;
            const string keyValueTemplate = "{0}={1}";

            foreach (var parameter in parameters)
            {
                keyValuePairs[i] = string.Format(keyValueTemplate, parameter.Key, parameter.Value);
                i++;
            }

            var parametersString = string.Join("&", keyValuePairs);
            // code=CODE&client_id=MY.apps.googleusercontent.com&client_secret=SECRET&redirect_uri=http://localhost:1291/Account/GoogleAuth&grant_type=authorization_code

            const string uri = "https://accounts.google.com/o/oauth2/token";

            var webClient = new WebClient();
            webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            webClient.UploadString(uri, "POST", parametersString); // Here I get Bad Request exception.
        }
    }

また、例外には「ProtocolError」に等しい Status が含まれます。空の parametersString で POST を実行しようとしても、同じエラーが発生します。

アドバイスや提案をいただければ幸いです。

ありがとう

編集: 私はまた、パラメータの有無にかかわらず、このスニペットを試しました(同じエラーがあります):

var data = new NameValueCollection
               {
                   {"code", code},
                   {"client_id", ConfigurationProvider.GoogleApplicationId},
                   {"client_secret", ConfigurationProvider.GoogleClientSecret},
                   {"redirect_uri", "http://localhost:1291" + Url.Action("GoogleAuth")},
                   {"grant_type", "authorization_code"}
               };

    var webClient = new WebClient();
    webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; // with and without this header...
    var result = webClient.UploadValues(uri, "POST", data);
4

1 に答える 1

0

redirect_uri は正しくエスケープする必要があります。そうしないと、不正な形式の URL が取得されます。

parameters["redirect_uri"] = Uri.EscapeDataString(_redirectUri);
于 2012-07-06T11:59:00.710 に答える