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

Zib*_*eah 7 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
Run Code Online (Sandbox Code Playgroud)

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

或者我误解了一切?

我能弄明白的另一种方式是我必须使用"混合方法",如:

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

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

对不起,我试图找出这个身份验证过程旁边的逻辑.

Zib*_*eah 10

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

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

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

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

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

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

  4. Facebook - > Web API - >身份

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

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

我在网上发现了一个有用的课程:(基于WebApi的ASP.NET身份Facebook登录)

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; }
 }
Run Code Online (Sandbox Code Playgroud)

所以,你可以有一个像以下的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;
    }
Run Code Online (Sandbox Code Playgroud)

这里有一个完整而完美的解释: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);
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助!