我已经实施了Xamarin.Auth sample code,以便在Android上与google的身份提供商进行身份验证。我已成功使用设备的Chrome浏览器导航到Google登录页面,我可以在其中输入凭据。我已成功通过Google授权,但Chrome自定义标签在重定向回我的应用时并未关闭,即我在Chrome浏览器中查看谷歌搜索。如果我关闭浏览器,我可以再次看到我的应用,并显示从谷歌身份提供商返回的用户详细信息。
为什么Chrome的自定义标签不会从Google身份提供商重定向关闭,如何使用Xamarin Forms和Xamarin.Auth关闭它?
答案 0 :(得分:8)
如果您在Android中的Xamarin.Auth示例中捕获Redirect(CustomUrlSchemeInterceptorActivity)的类中将此代码添加到OnCreate方法的末尾,则可以返回到您的应用程序
new Task(() =>{
StartActivity(new Intent(Application.Context,typeof(MainActivity)));
}).Start();
其中MainActivity是Android中主要Activity类的名称。 更确切地说,这是一个完整的类,您可以为每个截取的重定向继承
public class UrlSchemeInterceptor : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
try
{
base.OnCreate(savedInstanceState);
// Convert Android.Net.Url to Uri
var uri = new Uri(Intent.Data.ToString());
new Task(() =>
{
var intent = new Intent(ApplicationContext, typeof(MainActivity));
intent.AddFlags(ActivityFlags.IncludeStoppedPackages);
intent.AddFlags(ActivityFlags.ReorderToFront);
StartActivity(intent);
}).Start();
// Load redirectUrl page
AuthenticationState.Authenticator.OnPageLoading(uri);
Finish();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
public class AuthenticationState
{
public static WebAuthenticator Authenticator;
/*This static field is used to store the object
from OAuth1Authenticator or OAuth2Authenticator
upon initialization in the UI (Xamarin forms or Android or iOS).
For example:
var authenticatorObject = new OAuth2Authenticator (YOUR PARAMETERS);
AuthenticationState.Authenticator = (WebAuthenticator)authenticatorObject;
var presenter = new OAuthLoginPresenter();
presenter.Login(authenticatorObject);
*/
}
例如在谷歌案例中
[Activity(Label = "YOURLABEL", NoHistory = true, LaunchMode = LaunchMode.SingleTop)]
[IntentFilter( new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataSchemes = new[]
{
"com.googleusercontent.apps.",// YOUR GOOGLE ID INVERTED
},
DataPaths = new[]
{
"/oauth2redirect",
})]
public class GoogleUrlSchemeInterceptorActivity : UrlSchemeInterceptor { }