如何在google登录后返回应用程序

时间:2017-06-15 11:02:37

标签: xamarin.ios xamarin.forms

我尝试使用xamarin.auth在我的应用中实施谷歌登录,如下所示

var auth = new OAuth2Authenticator("284202576320-7kgdhaa5sgvkoe03jmmcv0p8lfdma306.apps.googleusercontent.com","cAZW7uegD-h2-
                                                         tNMMf5q1UGQ","https://www.googleapis.com/auth/userinfo.email",new 
                                                         Uri("https://accounts.google.com/o/oauth2/auth"),new 
                                                         Uri("http://dev.myfav.restaurant/Account/LoginComplete"),new 
                                                         Uri("https://accounts.google.com/o/oauth2/token"),null,true)
    {
        AllowCancel = true,                
    };

但已完成的事件未触发并且在登录后进入网页:( 我收到了以下错误

enter image description here

我需要让用户回到我的应用程序如何才能实现这一目标?任何人都可以帮我这个。

提前致谢

3 个答案:

答案 0 :(得分:0)

在iOS中,一旦您使用 Xamarin.Auth 完成身份验证,您只需要关闭viewController,您就会被放回到应用中。

您这样做订阅了Completed

OAuth2Authenticator事件
auth.Completed += (sender, e) =>
{
    DismissViewController(true, null);
};

答案 1 :(得分:0)

如果" Native UI"使用(构造函数中的最后一个参数设置为true),这意味着外部/系统浏览器用于登录而不是WebView。因此,在Android而不是WebView [Chrome]上使用CustomTabs,而在iOS而不是UIWebView(或WKWebView)上使用SFSafariViewController。

原生UI用户离开您的应用,返回应用的唯一方法是应用链接(或深层链接),这需要完全不同的方法。

1你不能使用http [s]方案redirect_url(在Android上可以,但是在iOS上没有)。使用自定义方案。

参见样本[s](Xamarin.Forms漫画书):

https://github.com/moljac/Xamarin.Auth.Samples.NugetReferences

回购中的文档:

https://github.com/xamarin/Xamarin.Auth/tree/master/docs

答案 2 :(得分:0)

嘿,按照这两个例子,一个是使用网页浏览,一个是使用谷歌登录sdk进行谷歌认证。 https://timothelariviere.com/2017/09/01/authenticate-users-through-google-with-xamarin-auth/https://developer.xamarin.com/samples/xamarin-forms/WebServices/OAuthNativeFlow/ 所以根据Mounika.Kola报道的这个问题。我想你应该参考那个authenticator.Completed - = OnAuthCompleted在你的代码中。仅供参考,请参阅我在Xamarin Forms中用于Google授权的这些代码。

void OnLoginClicked(object sender, EventArgs e)
{
string clientId = null;
string redirectUri = null;

        switch (Device.RuntimePlatform)
        {
            case Device.iOS:
                clientId = Constants.iOSClientId;
                redirectUri = Constants.iOSRedirectUrl;
                break;

            case Device.Android:
                clientId = Constants.AndroidClientId;
                redirectUri = Constants.AndroidRedirectUrl;
                break;
        }

        var authenticator = new OAuth2Authenticator(
            clientId,
            null,
            Constants.Scope,
            new Uri(Constants.AuthorizeUrl),
            new Uri(redirectUri),
            new Uri(Constants.AccessTokenUrl),
            null,
            true);

        authenticator.Completed += OnAuthCompleted;
        authenticator.Error += OnAuthError;

        AuthenticationState.Authenticator = authenticator;

        var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
        presenter.Login(authenticator);
    }
async void OnAuthCompleted(object sender, AuthenticatorCompletedEventArgs e)
{

        var authenticator = sender as OAuth2Authenticator;
        if (authenticator != null)
        {
            authenticator.Completed -= OnAuthCompleted;
            authenticator.Error -= OnAuthError;
        }

        User user = null;
        if (e.IsAuthenticated)
        {
            // If the user is authenticated, request their basic user data from Google
            // UserInfoUrl = https://www.googleapis.com/oauth2/v2/userinfo
            var request = new OAuth2Request("GET", new Uri(Constants.UserInfoUrl), null, e.Account);
            var response = await request.GetResponseAsync();
            if (response != null)
            {
                // Deserialize the data and store it in the account store
                // The users email address will be used to identify data in SimpleDB
                string userJson = await response.GetResponseTextAsync();
                user = JsonConvert.DeserializeObject<User>(userJson);
            }

            if (account != null)
            {
                store.Delete(account, Constants.AppName);
            }

            await store.SaveAsync(account = e.Account, Constants.AppName);
            await DisplayAlert("Email address", user.Email, "OK");
        }
    }

我希望它可以帮到你。