C# UWP的Google OAuth v2
我是OAuth验证新手,这里的选项已经用完了,因为当我尝试访问Google的OAuth屏幕时,它从未向我提供访问代码。我可以访问登录屏幕,然后如果我选择允许或拒绝,它会给我一条成功消息。没有错误,但有时它会给出无效协议的异常,但我不知道为什么会这样 我正试图从别人那里得到帮助,但什么都不起作用 我使用的代码如下:C# UWP的Google OAuth v2,c#,uwp,google-oauth,C#,Uwp,Google Oauth,我是OAuth验证新手,这里的选项已经用完了,因为当我尝试访问Google的OAuth屏幕时,它从未向我提供访问代码。我可以访问登录屏幕,然后如果我选择允许或拒绝,它会给我一条成功消息。没有错误,但有时它会给出无效协议的异常,但我不知道为什么会这样 我正试图从别人那里得到帮助,但什么都不起作用 我使用的代码如下: string state = GenerateRandomBase64Url(32); string code_verifier = GenerateR
string state = GenerateRandomBase64Url(32);
string code_verifier = GenerateRandomBase64Url(32);
string code_challenge = GenerateBase64urlencodeNoPadding(sha256(code_verifier));
string clientID = "1037832553054-2ktd0l6dop546i1ti312r2doi63sglfe.apps.googleusercontent.com";
string redirectURI = "uwp.app:/oauth2redirect";
string authorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth";
string tokenEndpoint = "https://www.googleapis.com/oauth2/v4/token";
string userInfoEndpoint = "https://www.googleapis.com/oauth2/v3/userinfo";
string youtubeScope = "https://www.googleapis.com/auth/youtube";
string code_challenge_method = "S256";
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
localSettings.Values["state"] = state;
localSettings.Values["code_verifier"] = code_verifier;
string authorizationRequest = string.Format($@"{authorizationEndpoint}?response_type=code&scope={Uri.EscapeDataString(youtubeScope)}&redirect_uri={Uri.EscapeDataString(redirectURI)}&client_id={clientID}&state={state}&code_challenge={code_challenge}&code_challenge_method={code_challenge_method}&login_hint={EmailBox.Text.Trim()}");
string endURL = "https://accounts.google.com/o/oauth2/approval?";
// I don't know if this is actually valid because google says that this Url is not available
Uri startURI = new Uri(authorizationRequest);
Uri endURI = new Uri(endURL);
string result = string.Empty;
try
{
//var success = Windows.System.Launcher.LaunchUriAsync(new Uri(authorizationRequest));
WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, startURI, endURI);
switch (webAuthenticationResult.ResponseStatus)
{
// Successful authentication.
case WebAuthenticationStatus.Success:
result = webAuthenticationResult.ResponseData.ToString();
break;
// HTTP error.
case WebAuthenticationStatus.ErrorHttp:
result = webAuthenticationResult.ResponseErrorDetail.ToString();
break;
default:
result = webAuthenticationResult.ResponseData.ToString();
break;
}
}
catch (Exception ex)
{
result = ex.Message;
}
response.Text = result;
// the string that I get looks like this
// https://accounts.google.com/o/oauth2/approval?as=410b4db829b95fce&pageId=none&xsrfsign=AMt42IIAAAAAWO9e-l2loPR2RJ4_HzjfNiGJbiESOyoh
我不知道在UWP应用程序中这样做是否正确。此外,我从结果中得到的字符串只是一个Url,它不包括任何被认为是code
的内容,如Google示例中所述。
有人能指出我做错了什么吗?这应该很简单,但我不知道我做错了什么。谢谢我不确定上次是如何按照我的评论解决这个问题的
startURL
和一个callbackURL
我昨天遇到了与我的问题相同的问题,我通过将我的应用程序的redirectUri
替换为callbackURL
解决了这个问题,WebAuthenticationBroker
不再抛出异常,它提供了一个成功的结果
所以要解决这个问题,你应该这样做:
string redirectURI = "uwp.app:/oauth2redirect";
Uri startURI = new Uri(authorizationRequest); // as in the question
Uri endURI = new Uri(redirectUri); // change to 'redirectUri'
WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, startURI, endURI);
switch(webAuthenticationResult.ResponseStatus)
{
case WebAuthenticationStatus.Success:
break;
}
我希望它能帮助其他人。谢谢我已经使用官方软件对Google OAuth v2进行了UWP测试。我使用
WebAuthenticationBroker.authenticateSync
来获得web身份验证结果。但是我不能复制你的问题,可以提供你的源代码给我,这样我就可以在这个问题上做更多的测试吗?嗯,我想这只是?
在endURL
的末尾,我把它放在这里,但我没有在我的实际代码中使用它,我不知怎么整理了它。谢谢你。