我正试图在我们的应用程序中实现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"?
你可以尝试添加你的额外参数,使用 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)
}
});