Xamarin.Auth - Google OAuth не закрывается по UWP, если для IsUsingNativeUI установлено значение true

Я только что реализовал Xamarin.Auth на UWP, и у меня странная проблема. Я начинаю с создания своего объекта OAuth:

public class OAuth
{
    private Account account;
    private AccountStore store;

    public string Scope;
    public string AuthorizeUrl;
    public string AccessTokenUrl;
    public string UserInfoUrl;

    string clientId;
    string clientSecret;
    string redirectUri;

    private bool isUsingNativeUI;

    private Func<JObject, User> OAuthParser;

    private Action<User> OnCompleted;
    private Action<string> OnError;

    public OAuth()
    {
        account = null;
        store = null;

        Scope = "";
        AuthorizeUrl = "";
        AccessTokenUrl = "";
        UserInfoUrl = "";

        clientId = "";
        clientSecret = null;
        redirectUri = "";
    }

    public OAuth Facebook()
    {
        // These values do not need changing
        Scope = "email";
        AuthorizeUrl = "https://www.facebook.com/v2.8/dialog/oauth";
        AccessTokenUrl = "https://graph.facebook.com/oauth/access_token";
        UserInfoUrl = "https://graph.facebook.com/me?fields=email,name,gender,picture";

        clientId = "xxxx";
        clientSecret = "xxxxx";
        redirectUri = "http://www.facebook.com/connect/login_success.html";

        isUsingNativeUI = false;

        OAuthParser = ParseFacebookResponse;

        return this;
    }

    public OAuth GooglePlus()
    {
        // These values do not need changing
        Scope = "https://www.googleapis.com/auth/userinfo.email";
        AuthorizeUrl = "https://accounts.google.com/o/oauth2/auth";
        AccessTokenUrl = "https://www.googleapis.com/oauth2/v4/token";
        UserInfoUrl = "https://www.googleapis.com/oauth2/v2/userinfo";

        clientId = "xxxxx";
        redirectUri = "xxxxxx";

        isUsingNativeUI = true;

        OAuthParser = ParseGooglePlusResponse;

        return this;
    }

    public OAuth2Authenticator Authenticator(Action<User> onCompleted, Action<string> onError)
    {
        OAuth2Authenticator authenticator = new OAuth2Authenticator(
            clientId,
            clientSecret,
            Scope,
            new Uri(AuthorizeUrl),
            new Uri(redirectUri),
            new Uri(AccessTokenUrl),
            null,
            isUsingNativeUI);

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

        OnCompleted = onCompleted;
        OnError = onError;

        return authenticator;
    }

    private async void OnAuthCompleted(object sender, AuthenticatorCompletedEventArgs e)
    {
        User user = null;

        try
        {
            OAuth2Authenticator OAuth2Authenticator = sender as OAuth2Authenticator;

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

            //User user = null;
            if (e.IsAuthenticated)
            {
                var request = new OAuth2Request("GET", new Uri(UserInfoUrl), null, e.Account);
                var response = await request.GetResponseAsync();

                if (response != null)
                {
                    user = OAuthParser(JObject.Parse(await response.GetResponseTextAsync()));
                }

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

                await store.SaveAsync(account = e.Account, App.AppName);
            }
        } catch (Exception ex) {
            Debug.WriteLine(ex);
        }

        (Application.Current.MainPage as LoginPage).OAuthCompleted(user);

    }

    private void OnAuthError(object sender, AuthenticatorErrorEventArgs e)
    {
        OAuth2Authenticator OAuth2Authenticator = sender as OAuth2Authenticator;

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

        (Application.Current.MainPage as LoginPage).OAuthError("Authentication error: " + e.Message);
    }

    private static User ParseGooglePlusResponse(JObject jobject)
    {
        try
        {
            User user = new User()
            {
                Email = jobject["email"].ToString(),
                Pseudo = jobject["name"].ToString(),
                Firstname = jobject["given_name"].ToString(),
                Surname = jobject["family_name"].ToString(),
                Image = jobject["picture"].ToString(),
                Password = "girafe"
            };
            return user;
        }
        catch (Exception e)
        { Debug.WriteLine(e.ToString()); }
        return null;
    }

    private static User ParseFacebookResponse(JObject jobject)
    {
        try
        {
            Debug.WriteLine(jobject);
            User user = new User()
            {
                Email = jobject["email"].ToString(),
                Pseudo = jobject["name"].ToString(),
                Image = jobject["picture"]["data"]["url"].ToString(),
                Password = "girafe"
            };
            return user;
        }
        catch (Exception e)
        { Debug.WriteLine(e.ToString()); }
        return null;
    }
}

И я использую это так:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LoginPage : ContentPage, INotifyPropertyChanged
{
    private OAuth OAuthService;

    private OAuthLoginPresenter Presenter;

    // ...

    private void FacebookAuthConnection()
    {
        AuthenticationState.Authenticator = OAuthService.Facebook().Authenticator(OAuthCompleted, OAuthError);
        Presenter.Login(AuthenticationState.Authenticator);
    }

    private void GooglePlusAuthConnection()
    {
        AuthenticationState.Authenticator = OAuthService.GooglePlus().Authenticator(OAuthCompleted, OAuthError);
        Presenter.Login(AuthenticationState.Authenticator);
    }

    // ...
}

На Android либо если isUsingNativeUI устанавливается в true или false, после того как я подключусь, webview/oauth закроются. Однако в UWP это не работает, если для isUsingNativeUI задано значение true, веб-просмотр / oauth не закрываются, поэтому я перехожу на Google и не могу вернуться в приложение (UWP Desktop)...

Есть ли у вас какие-либо идеи?

0 ответов

Другие вопросы по тегам