首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android上登录Facebook后,Xamarin.Essentials.WebAuthenticator.AuthenticateAsync不会关闭弹出窗口。

在Android上登录Facebook后,Xamarin.Essentials.WebAuthenticator.AuthenticateAsync不会关闭弹出窗口。
EN

Stack Overflow用户
提问于 2020-08-02 07:30:42
回答 1查看 910关注 0票数 0

我在Xamarin中创建了一个facebook登录服务。在UWP应用程序中,一切都很好。我还为Android实现了所需的选项(CallbackActivity有意图)。将正确显示Facebook登录页。登录是成功的,它重定向到已配置的成功页面。问题是,在Android上,在成功页面出现后,登录窗口没有关闭,Xamarin代码也没有捕获access_token。在UWP中,一切都很正常。在服务中,我调用方法RequestFacebookToken来打开登录窗口并请求访问令牌。

这是我的facebook服务:

代码语言:javascript
复制
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);
    }
}

您是否知道,在登录成功之后,登录窗口为什么没有关闭,会有什么问题呢?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-03 07:51:30

您可以使用Plugin.FacebookClient登录facebook。

代码语言:javascript
复制
 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63213480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档