在我的 windows phone 8.1 应用程序中通过 Facebook 登录时如何检索用户访问令牌?

How can I retrieve the user-access-token when logging in via Facebook in my windows phone 8.1 app?

我正在尝试在我的 cordova 应用程序中实现 Facebook 登录。它适用于 iPhone 和 Android,但我无法使其适用于 Windows Phone 8.1.

我现在为 Windows phone 8.1 做的是调用我制作的 cordova 插件,它执行以下操作:

string loginUrl = "fbconnect://authorize" +
    "?client_id=CLIENTID" +
    "&scope=public_profile,email" +
    "&redirect_uri=msft-APPID://authorize";
var uri = new Uri(loginUrl);
var success = await Windows.System.Launcher.LaunchUriAsync(uri);

这会在很短的时间内启动 Facebook 应用程序,然后我的应用程序恢复。

facebook 文档说他们恢复我的应用程序的方式与我调用 facebook 应用程序的方式相同,但使用不同的 loginUrl,包含不同的参数。

或者:

msft-{APPID}://authorize/?
    access_token={user-access-token}&

或:

msft-{AppID}://authorize/?
  error=access_denied&
  error_code=200&
  error_description=Permissions%20Error&
  error_reason=user_denied

我正在尝试在我的应用恢复时检索 {user-access-token}error_reason

我知道调用了 Application_Activated (app.xaml.cs) 方法,但传递给它的参数不包含任何这些。我如何获得这些值?

在 Windows Phone 8.1 Silverlight 中,您可以使用 UriMapperBase 来处理这个问题。这是对 UriMapperBase 的一个很好的介绍,它展示了它是什么以及如何使用它:http://bsubramanyamraju.blogspot.fi/2014/06/windowsphone-8-custom-uri.html

此外,这里是关于如何使用自定义 UriMapperBase 在 Windows Phone Silverlight 应用程序中实现 Facebook 登录的分步教程:http://doli.us/facebook-login-with-windows-phone-8/

更新了更多细节

您的 UriMapperBase 在应用第一次导航发生之前执行。有多种方法可以处理此问题,但一种选择是将静态 属性 添加到 App.xaml.cs:

        public static string AccessToken { get; set; }

然后,在您的自定义 UriMapper 中,解析接收到的数据并将其设置为 AccessToken 属性:

public class AccessTokenParser : UriMapperBase
{
    public override void MapUri(Uri uri)
    {
        var url = uri.ToString();        
        if (url.Contains("access_token"))
        {
            App.AccessToken = ParseAccessTokenFromUrl(url); // Your code here
        }
        return new Uri("/MainPage.xaml", UriKind.Relative);
    }
}

现在,在您的 MainPage.xaml.cs 中,您可以覆盖 OnNavigatedTo 方法:

    public partial class MainPage : PhoneApplicationPage
    {

      protected override void OnNavigatedTo(NavigationEventArgs e)
      {
          if (string.IsNullOrEmpty(App.AccessToken))
            return;

          DoThingsWithAccessToken();
      }

希望这对您有所帮助。