2

在我的应用程序中(遵循各种文档),用户可以通过专用登录页面登录到 facebook。由此,给出访问令牌并保存它。问题是以这种方式获取令牌(使用await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, loginUri, new Uri(redirectUri));,这似乎会自动显示来自 facebook 的登录屏幕,老实说我不知道​​它是如何出现的......)意味着用户必须再次输入他们的用户名和密码。

我不希望出现这种情况,因为我认为如果用户登录过一次,他们就不需要一次又一次地输入他们的详细信息。但是,无论我尝试了什么,我似乎都可以获得一个新的访问令牌,而无需再次通过此登录屏幕。

我已经尝试过使用该方法的FacebookClient.Get()方法,但它只是在此版本的 SDK 中不存在。我不知道用什么来代替它,或者我需要发送什么到 Facebook 来获得回复。

到目前为止,这是我第一次必须登录的内容(几乎是文档上的内容)

string redirectUrl = "https://www.facebook.com/connect/login_success.html";
            try
            {
                var loginUrl = fb.GetLoginUrl(new
                {
                    client_id = FacebookHandler.FacebookAppId,
                    redirect_uri = redirectUrl,
                    scope = FacebookHandler.Permissions,
                    display = "touch",
                    response_type = "token"
                });

                Uri endUri = new Uri(redirectUrl);

                WebAuthenticationResult webAuthRes = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, loginUrl, endUri);

                if (webAuthRes.ResponseStatus == WebAuthenticationStatus.Success)
                {
                    var callbackUri = new Uri(webAuthRes.ResponseData.ToString());
                    var facebookOAuthResult = fb.ParseOAuthCallbackUrl(callbackUri);
                    var accessToken = facebookOAuthResult.AccessToken;
                    if (String.IsNullOrEmpty(accessToken))
                    {
                        // User is not logged in, they may have canceled the login
                    }
                    else
                    {
                        // User is logged in and token was returned
                        FacebookHandler.AccessToken = accessToken;
                        LoginSucceeded();
                    }
                }

                else if (webAuthRes.ResponseStatus == WebAuthenticationStatus.ErrorHttp)
                {
                    Debug.WriteLine("Error: " + "HTTP Error returned by AuthenticateAsync() : " + webAuthRes.ResponseErrorDetail.ToString());
                }
                else
                {
                    Debug.WriteLine("Error: " + "Error returned by AuthenticateAsync() : " + webAuthRes.ResponseStatus.ToString());
                }
            }
            catch (Exception ex)
            {
                //
                // Bad Parameter, SSL/TLS Errors and Network Unavailable errors are to be handled here.
                //
                Debug.WriteLine(ex);

                throw ex;
            }

在应用程序的连续启动中,在用户第一次输入他们的详细信息后,可以使用保存的访问令牌,但它很快就会过期,这会抛出一个FacebookOAuthException. 这是我试图隐形获取新访问令牌的地方,但它不起作用。

        try
        {
            await fb.PostTaskAsync(url, argList);
        }

        catch (FacebookOAuthException exc)
        {
            Debug.WriteLine(exc.Message);
            ValidateLoginUrl(GetLoginUrl());
            //Problem is with the ValidateLoginUrl(), which would get an access token from the login url
        }

我尝试过的其中一件事是使用TryParseOAuthCallbackUrl(), 在我可以通过使用获得的 loginUrl 上FacebookClient.GetLoginUrl()(这是成功的),但是当我尝试解析它时,它只会出现一个InvalidOperationException,否则没有解释。

我必须做什么才能获得新的访问令牌而无需用户再次登录?我有我的应用程序 ID 和密码,我可能会从初始登录中保存用户 ID 以供以后使用(?)。有任何帮助吗?

4

0 回答 0