Я создал службу входа в 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);
}
}
Есть ли у вас какие-либо идеи , в чем может быть проблема, почему окно входа в систему не закрывается после успешного входа?
Заранее спасибо!