我正在关注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,所以我确定我错过了一些东西。不幸的是,我所有的调试和搜索都让我感到难过。
答案 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);
}