Xamarin.Essentials.WebAuthenticator.AuthenticateAsyn c не закрывает всплывающее окно после успешного входа в Facebook на Android - PullRequest
0 голосов
/ 02 августа 2020

Я создал службу входа в facebook в Xamarin. В приложении UWP все работает нормально. Я также реализовал необходимые параметры для Android (CallbackActivity with Intent). Страница входа в Facebook отображается правильно. Вход выполнен успешно, и он перенаправляет на настроенную страницу успеха. Проблема в том, что на Android после появления страницы успеха логин windows не закрывается, и код Xamarin не улавливает access_token. В UWP все нормально работает. В сервисе я вызываю метод RequestFacebookToken для открытия окна входа в систему и запроса токена доступа.

Вот мой сервис facebook:

public class FacebookService
{
    public const string CALLBACK_SCHEME = "https";

    private readonly HttpClient _httpClient;
    private const string _fbOauthEndpoint = "https://www.facebook.com/v7.0/dialog/oauth?";
    private const string CALLBACK_URI = "https://www.facebook.com/connect/login_success.html";
    private const string _fbAPI_URI = "https://graph.facebook.com/v2.8/";
    private string _fbAccessToken;
    private readonly string _AppId;

    public FacebookService(string AppID)
    {
        this._AppId = AppID;

        _httpClient = new HttpClient
        {
            BaseAddress = new Uri(_fbAPI_URI)
        };
        _httpClient.DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task RequestFacebookToken()
    {
        WebAuthenticatorResult res = null;
        try
        {
            string state = Convert.ToBase64String(Encoding.Unicode.GetBytes(DateTime.Now.Ticks.ToString()));
            //  if (Device.RuntimePlatform == Device.UWP)
            //  {
            res = await WebAuthenticator.AuthenticateAsync(new Uri($"{_fbOauthEndpoint}client_id={this._AppId}&display=popup&response_type=token&redirect_uri={CALLBACK_URI}&state={state}"), new Uri($"{CALLBACK_URI}"));
            /*      }
                    else
                    {
                        res = await WebAuthenticator.AuthenticateAsync(new Uri($"{_fbOauthEndpoint}client_id={this._AppId}&response_type=token&redirect_uri={CALLBACK_URI}&state={state}"), new Uri($"{CALLBACK_URI}"));
                    }*/
        }
        catch (Exception e)
        {

        }

        this._fbAccessToken = res?.AccessToken;
    }

    public async Task<FacebookProfile> GetUserFromFacebookAsync()
    {
        var result = await GetAsync<dynamic>("me", "fields=first_name,last_name,email,gender,picture.width(100).height(100)");
        if (result == null)
        {
            throw new Exception("User from this token not exist");
        }

        var account = new FacebookProfile()
        {
            Email = result.email,
            FirstName = result.first_name,
            LastName = result.last_name,
            Picture = result.picture.data.url,
            Gender = result.gender
        };

        return account;
    }

    private async Task<T> GetAsync<T>(string endpoint, string args = null)
    {
        var response = await _httpClient.GetAsync($"{endpoint}?access_token={this._fbAccessToken}&{args}");
        var result = await response.Content.ReadAsStringAsync();
        if (!response.IsSuccessStatusCode)
            return default(T);
        return JsonConvert.DeserializeObject<T>(result);
    }
}

Есть ли у вас какие-либо идеи , в чем может быть проблема, почему окно входа в систему не закрывается после успешного входа?

Заранее спасибо!

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать Plugin.FacebookClient для входа в facebook.

 public async Task LoginAsync()
        {
        FacebookResponse<bool> response = await CrossFacebookClient.Current.LoginAsync(permisions);
            switch(response.Status)
        {
            case FacebookActionStatus.Completed:
                IsLoggedIn = true;
                OnLoadDataCommand.Execute(null);
                break;
            case FacebookActionStatus.Canceled:
            
                break;
            case FacebookActionStatus.Unauthorized:
                await App.Current.MainPage.DisplayAlert("Unauthorized", response.Message, "Ok");
                break;
            case FacebookActionStatus.Error:
                await App.Current.MainPage.DisplayAlert("Error", response.Message,"Ok");
                break;
        }

        }

Вы можете скачать исходный файл по ссылке ниже: https://github.com/WendyZang/FacebookClientPlugin

...