在 Google.Apis.Auth 中启动浏览器时出错。OAuth2.LocalServerCodeReceiver Android
Error launching browser in Google.Apis.Auth.OAuth2.LocalServerCodeReceiver on Android
我正在尝试在用 C# (Xamarin.Android) 编写的 android 应用程序中对最终用户进行身份验证。
我决定尝试使用 NuGet 包 Google.Apis.Oauth.v2
,它似乎公开了一个易于使用的 Oauth 客户端。
LocalServerCodeReceiver.ReceiveCodeAsync
抛出以下内容:
我得到System.NotSupportedException:"Failed to launch browser with https://XXX.auth.XXX.amazoncognito.com/login?response_type=token&client_id=XXX&redirect_uri=https%3A%2F%2Fwww.google.com&scope=profile%20openid%20email for authorization. See inner exception for details."
它有一个内部异常 System.ComponentModel.Win32Exception:"Cannot find the specified file"
代码:
var clientSecret = new Google.Apis.Auth.OAuth2.ClientSecrets();
clientSecret.ClientId = ...
clientSecret.ClientSecret = ...
var initializer = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.Initializer(
"https://XXX.auth.XXX.amazoncognito.com/login",
"https://XXX.auth.XXX.amazoncognito.com/login");
initializer.Scopes = new List<string> {"profile", "openid", "email"};
initializer.ClientSecrets = clientSecret;
var flow = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(initializer);
var authCodeRequestURL = flow.CreateAuthorizationCodeRequest("https://www.google.com");
authCodeRequestURL.ResponseType = "token";
var uri = authCodeRequestURL.Build();
var cancellationTokenSource = new System.Threading.CancellationTokenSource();
var codeReceiver = new Google.Apis.Auth.OAuth2.LocalServerCodeReceiver();
var task = codeReceiver.ReceiveCodeAsync(authCodeRequestURL, cancellationTokenSource.Token);
- 我需要在应用程序清单中请求特定权限吗?
- 我听说您可以重定向到某个应用,而不是重定向到 www.google.com,我不太确定该怎么做,是 http://my_app_package_name or http://my_app_title 还是别的什么?
- 是否可以不依赖该库来启动浏览器,而是获取 RequestUri 并启动
Activity
,如果是这样,应用程序将如何意识到最终用户完成了登录过程以及如何该应用程序会检索令牌吗?
抱歉,Google.Apis.Oauth.v2
不支持 Xamarin,并且没有简单的方法让它工作。
遗憾的是,目前没有 Google.Apis.*
个包支持 Xamarin。
您可能会发现 Xamarin.Auth
包可以满足您的需求?
我已经弄清楚如何在浏览器中完成身份验证后重定向到应用程序。
它被称为 "Deep Link" 并记录在 enter link description here,本质上你需要在你的 Activity 上声明一个 IntentFilter,它注册到 Android OS 如果有人点击或页面重定向到特定 URI,您的应用程序将被调用。然后可以在您的应用程序中读取附加到 URI 的令牌。
我正在尝试在用 C# (Xamarin.Android) 编写的 android 应用程序中对最终用户进行身份验证。
我决定尝试使用 NuGet 包 Google.Apis.Oauth.v2
,它似乎公开了一个易于使用的 Oauth 客户端。
LocalServerCodeReceiver.ReceiveCodeAsync
抛出以下内容:
我得到System.NotSupportedException:"Failed to launch browser with https://XXX.auth.XXX.amazoncognito.com/login?response_type=token&client_id=XXX&redirect_uri=https%3A%2F%2Fwww.google.com&scope=profile%20openid%20email for authorization. See inner exception for details."
它有一个内部异常 System.ComponentModel.Win32Exception:"Cannot find the specified file"
代码:
var clientSecret = new Google.Apis.Auth.OAuth2.ClientSecrets();
clientSecret.ClientId = ...
clientSecret.ClientSecret = ...
var initializer = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.Initializer(
"https://XXX.auth.XXX.amazoncognito.com/login",
"https://XXX.auth.XXX.amazoncognito.com/login");
initializer.Scopes = new List<string> {"profile", "openid", "email"};
initializer.ClientSecrets = clientSecret;
var flow = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(initializer);
var authCodeRequestURL = flow.CreateAuthorizationCodeRequest("https://www.google.com");
authCodeRequestURL.ResponseType = "token";
var uri = authCodeRequestURL.Build();
var cancellationTokenSource = new System.Threading.CancellationTokenSource();
var codeReceiver = new Google.Apis.Auth.OAuth2.LocalServerCodeReceiver();
var task = codeReceiver.ReceiveCodeAsync(authCodeRequestURL, cancellationTokenSource.Token);
- 我需要在应用程序清单中请求特定权限吗?
- 我听说您可以重定向到某个应用,而不是重定向到 www.google.com,我不太确定该怎么做,是 http://my_app_package_name or http://my_app_title 还是别的什么?
- 是否可以不依赖该库来启动浏览器,而是获取 RequestUri 并启动
Activity
,如果是这样,应用程序将如何意识到最终用户完成了登录过程以及如何该应用程序会检索令牌吗?
抱歉,Google.Apis.Oauth.v2
不支持 Xamarin,并且没有简单的方法让它工作。
遗憾的是,目前没有 Google.Apis.*
个包支持 Xamarin。
您可能会发现 Xamarin.Auth
包可以满足您的需求?
我已经弄清楚如何在浏览器中完成身份验证后重定向到应用程序。
它被称为 "Deep Link" 并记录在 enter link description here,本质上你需要在你的 Activity 上声明一个 IntentFilter,它注册到 Android OS 如果有人点击或页面重定向到特定 URI,您的应用程序将被调用。然后可以在您的应用程序中读取附加到 URI 的令牌。