我在Xamarin中创建了一个facebook登录服务。在UWP应用程序中,一切都很好。我还为Android实现了所需的选项(CallbackActivity有意图)。将正确显示Facebook登录页。登录是成功的,它重定向到已配置的成功页面。问题是,在Android上,在成功页面出现后,登录窗口没有关闭,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);
}
}您是否知道,在登录成功之后,登录窗口为什么没有关闭,会有什么问题呢?
提前感谢!
发布于 2020-08-03 07:51:30
您可以使用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
https://stackoverflow.com/questions/63213480
复制相似问题