通过Android应用程序中的Facebook令牌对WebAPI进行身份验证访问

时间:2014-06-12 08:45:12

标签: android facebook token asp.net-web-api

我正在尝试让我的Android应用程序登录到我的WebAPI服务。我想分享我的想法以验证它们。

如果通过WebSite访问WebAPI,则步骤为:

1-调用WebAPI方法登录

2- WebAPI将客户端重定向到Facebook

3- Facebook登录并返回令牌

4-如果我在下次通话中使用该令牌,我将被认证为正确的用户。

这很有效。

如果通过Android APP访问WebAPI,我该如何获取访问令牌? 其实我做的事情是:

1-通过登录按钮联系Facebook

2-将记录的ID记录到接收令牌的Facebook

3-尝试执行WebAPI调用,将Authentication:Bearer CODE添加到我的呼叫中

那时我正在徘徊..

我的应用程序现在如何才能成为特定用户?如果我执行类似

的操作
GET /API/METHOD1
Authentication: Bearer CODE

如果Android应用程序从未告诉过他,怎么知道代码是我?该应用程序是否会自动联系Facebook以获得“是啊!我发布该令牌,它与......有关”的答案。

或者我误解了一切?

我能弄清楚的另一种方法是我必须使用“混合方法”,如:

1-调用WebAPI(通过浏览器) 2-获取重定向链接到Facebook 3-获取令牌

但是..那时候,我怎么能再次在Facebook App / Facebook Site和我的Android应用程序之间切换?

很抱歉这个混乱,我试图找出这个身份验证过程旁边的逻辑。

1 个答案:

答案 0 :(得分:9)

好的,我想我已经知道了!

当WebAPI收到Facebook令牌时,对用户和授权一无所知。但是,由于令牌,可以“作为来电者”访问Facebook。

通过这种方式,应用程序可以执行以下操作:

  1. Android - > Facebook登录 - >获取FBToken

  2. Android - > Web API - >发送FBToken

  3. Web API - > Facebook - > /我发送FBToken

  4. Facebook - > Web API - >身份

  5. Web API - > Andoid - >这是您身份的标记

  6. Android - > Web API - >给我Auth方法,授权:Bearer WebAPIToken

  7. 我在网上发现了一个有用的课程:(基于WebApi ASP.NET Identity Facebook login

    private async Task<FacebookUserViewModel> VerifyFacebookAccessToken(string accessToken)
    {
        FacebookUserViewModel fbUser = null;
         var path = "https://graph.facebook.com/me?access_token=" + accessToken;
         var client = new HttpClient();
         var uri = new Uri(path);     
         var response = await client.GetAsync(uri);
         if (response.IsSuccessStatusCode)
         {
             var content = await response.Content.ReadAsStringAsync();
             fbUser = Newtonsoft.Json.JsonConvert.DeserializeObject<FacebookUserViewModel>     (content);
         }
    
         return fbUser;
     }
    
    
     public class FacebookUserViewModel
     {
         [JsonProperty("id")]
         public string ID { get; set; }
         [JsonProperty("first_name")]
         public string FirstName { get; set; }
         [JsonProperty("last_name")]
         public string LastName { get; set; }
         [JsonProperty("username")]
         public string Username { get; set; }
         [JsonProperty("email")]
         public string Email { get; set; }
     }
    

    所以,你可以有一个像以下的WebAPI:

        [HttpGet]
        [AllowAnonymous]
        public async Task<string> GetTokenFromFacebook(string accessToken)
        {
            var user = await VerifyFacebookAccessToken(accessToken);
            //Search on your DB for the user ID or email
            //Get token for user
            return token;
        }
    

    这里有一个完整而完美的解释: http://thewayofcode.wordpress.com/2014/03/01/asp-net-webapi-identity-system-how-to-login-with-facebook-access-token/

    令牌创建示例

            var tokenExpirationTimeSpan = TimeSpan.FromDays(14);            
            var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, UserName, null, "Facebook"));
            identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.ToString(), null, "LOCAL_AUTHORITY"));
            AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
            var currentUtc = new Microsoft.Owin.Infrastructure.SystemClock().UtcNow;
            ticket.Properties.IssuedUtc = currentUtc;
            ticket.Properties.ExpiresUtc = currentUtc.Add(tokenExpirationTimeSpan);
            var accesstoken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
    

    我希望它有所帮助!