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)...
Есть ли у вас какие-либо идеи?