在我的应用程序中(遵循各种文档),用户可以通过专用登录页面登录到 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 以供以后使用(?)。有任何帮助吗?