与Facebook令牌的Azure移动服务LoginAsync未经授权

时间:2014-04-20 18:16:14

标签: facebook azure facebook-c#-sdk azure-mobile-services

我正在关注http://ntotten.com/2013/03/14/using-windows-azure-mobile-services-with-the-facebook-sdk-for-windows-phone/的帖子,我可以成功获得Facebook访问令牌。但是,当我将访问令牌作为JObject提交到MobileServiceClient.LoginAsync(provider, token)方法时,我得到IvalidOperationException (Unauthorized)。代码,请求和响应(来自例外)低于......

代码

private async Task Authenticate()
{
    while (user == null)
    {
        try
        {
            fbSession = await App.FacebookSessionClient.LoginAsync("email,publish_stream,friends_about_me");
            var client = new FacebookClient(fbSession.AccessToken);
            var token = JObject.FromObject(new
            {
                access_token = fbSession.AccessToken
            });
            user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token); // this line causes the exception
        }
        catch (InvalidOperationException e)
        {
        }
    }
}

请求

{Method: POST, RequestUri: 'https://[MY-DOMAIN].azure-mobile.net/login/facebook', Version: 1.1, Content: System.Net.Http.StringContent, Headers:
{
  X-ZUMO-INSTALLATION-ID: f13ec5fb-XXXX-XXXX-XXXX-f249415499de
  X-ZUMO-APPLICATION: jUjMFbasVpKwbktxTWcBShXXXXXXXXXX
  Accept: application/json
  User-Agent: ZUMO/1.0
  User-Agent: (lang=Managed; os=Windows Phone; os_version=8.10.0.12359; arch=Win32NT; version=1.0.20402.0)
  X-ZUMO-VERSION: ZUMO/1.0 (lang=Managed; os=Windows Phone; os_version=8.10.0.12359; arch=Win32NT; version=1.0.20402.0)
  Content-Type: application/json; charset=utf-8
  Content-Length: 223
}}

响应

{StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 0.0, Content: System.Net.Http.StreamContent, Headers:
{
  Server: Microsoft-IIS/8.0
  WWW-Authenticate: Basic realm="Service"
  X-Powered-By: ASP.NET
  Set-Cookie: ARRAffinity=e1254f762d2198b2b306557ef6b226a2d9f70aac5e3cc654c3381bXXXXXXXXXX;Path=/;Domain=[MY-DOMAIN].azure-mobile.net
  Date: Sun, 20 Apr 2014 17:37:00 GMT
  Content-Length: 0
}}

如果我删除Facebook客户端访问权限并使用MobileServiceClient.LoginAsync(provider)方法,则Facebook身份验证成功,但我希望能够访问手机上的客户端SDK,所以我确定我错过了一些东西。不幸的是,我所有的调试和搜索都让我感到难过。

2 个答案:

答案 0 :(得分:3)

根据响应中的WWW-Authenticate标头,我假设您正在使用.NET后端进行移动服务。 .NET后端仍然不支持从访问提供程序(Facebook / Microsoft)登录令牌。如果您使用带有node.js后端的移动服务,那么您应该能够在客户端使用该代码登录移动服务。

对于这些提供商的客户端登录的支持应该在不久的将来为移动服务.NET后端提供。

答案 1 :(得分:0)

为了解决我的问题,我在我的数据库中添加了一个User表,包括一个名为FacebookToken的列。然后,当新用户被添加到表中时(或Controller上的任何其他操作),我可以从Claim中捕获Facebook访问令牌。

我的PostUser方法现在如下所示;

public async Task<IHttpActionResult> PostUser(User item)
{
    //get current user and facebook token...
    var currentUser = User as ServiceUser;
    Claim fbClaim = currentUser.Claims.First(c => c.Type == "urn:microsoft:credentials");
    JToken accessToken = JToken.Parse(fbClaim.Value);

    //set the facebook token on the User object...
    item.FacebookToken = accessToken["accessToken"].Value<string>();

    //insert the user record...
    User current = await InsertAsync(item);
    return CreatedAtRoute("Tables", new { id = current.Id }, current);
}