如何在Google.API ExchangeCodeForTokenAsync方法中使用code_verifier。

问题描述 投票:0回答:1

我正试图在我们的应用程序中实现Google Oauth。我使用的是google.Net客户端库 "Google.Apis 1.45版(NuGet包)"。

从浏览器获取代码后,我想发送code_verifier来获取token。我使用GoogleAuthorizationCodeFlow类 "ExchangeCodeForTokenAsync "来获取token。如果我没有使用 "code_challenge",那么我就能成功获取令牌。但是当我尝试使用 "code_challenge "时,我得到了以下错误信息。

Error: "invalid_grant", Description: "Missing code verifier.", Uri:"".

请检查我的代码。

var clientSecrets = new ClientSecrets
                {
                    ClientId = _clientAppDetails.ClientID,
                    ClientSecret = _clientAppDetails.ClientSecret
                };

 var credential = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = clientSecrets,
                Scopes = new[] { GoogleScope.ImapAndSmtp.Name, GoogleScope.UserInfoEmailScope.Name, GoogleScope.EmailScope.Name }
            });
string state = RandomDataBase64url(32);
string code_verifier = RandomDataBase64url(32);
string code_challenge = Base64urlencodeNoPadding(sha256(code_verifier));
string code_challenge_method = "S256";

string redirectURI = string.Format("http://{0}:{1}/", IPAddress.Loopback, GetRandomUnusedPort());
AuthorizationCodeRequestUrl url = credential.CreateAuthorizationCodeRequest(redirectURI);
url.State = state;
string oauthrequestedURL = url.Build().ToString();
oauthrequestedURL += "&code_challenge=" + code_challenge + "&code_challenge_method=" + code_challenge_method;

/在浏览器中打开请求。

                System.Diagnostics.Process.Start(oauthrequestedURL);

成功登录后,我们能够得到代码。

var context = httpListener.GetContextAsync().Result;
// Sends an HTTP response to the browser.
var response = context.Response;

/然后,我们解析响应并获得成功代码,并通过这个代码和重定向URI到ExchangeCodeForTokenAsync方法。

TokenResponse tokenResponse = credential.ExchangeCodeForTokenAsync("", code, redirectURI, CancellationToken.None).Result;

当我们调用上面这一行时,我们得到了错误信息。

Error:"invalid_grant", Description:"Missing code verifier.", Uri:"".

当调用 "ExchangeCodeForTokenAsync "方法时,我们如何传递 "grant_type "和 "code_verifier"?

c# .net google-api google-oauth google-api-dotnet-client
1个回答
0
投票

你可以尝试添加你的额外参数,使用 UserDefinedQueryParams也许那会有用

var credential = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = clientSecrets,
        Scopes = new[] { GoogleScope.ImapAndSmtp.Name, GoogleScope.UserInfoEmailScope.Name, GoogleScope.EmailScope.Name },
        UserDefinedQueryParams = new KeyValuePair<string, string>[2] { 
            new KeyValuePair("code_challenge", code_challenge), 
            new KeyValuePair("code_challenge_method", code_challenge_method)  
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.