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

Posted

技术标签:

【中文标题】通过 Facebook 令牌从 Android 应用程序对 WebAPI 的身份验证访问【英文标题】:Authenticated access to WebAPI via Facebook token from Android App 【发布时间】:2014-08-02 12:29:41 【问题描述】:

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

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

1-调用WebAPI方法登录

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

3- Facebook 登录并返回一个 Token

4- 如果我在接下来的调用中使用该令牌,我将被验证为正确的用户。

这行得通。

如果通过Android APP访问WebAPI,如何获取访问令牌? 实际上我正在做类似的事情:

1- 通过登录按钮联系 Facebook

2- 将登录的 id 获取到 Facebook 接收令牌

3- 尝试执行 WebAPI 调用,将身份验证:承载代码添加到我的调用中

那时我正在徘徊..

既然我是那个特定的用户,我的应用程序怎么办?如果我执行类似的操作

GET /API/METHOD1
Authentication: Bearer CODE

如果 Android 应用程序从未告诉他,它怎么知道 CODE 是我?应用程序是否会自动联系 Facebook 以接收类似“是的!我释放了该令牌,它与...有关”的答案

还是我误解了一切?

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

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

但是.. 到那时,我怎样才能在 Facebook 应用程序/Facebook 站点之间再次切换到我的 Android 应用程序?

对不起,我正在尝试找出这个身份验证过程旁边的逻辑。

【问题讨论】:

【参考方案1】:

好的,我想我明白了!

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

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

    Android -> Facebook 登录 -> 获取 FBToken

    Android -> Web API -> 发送 FBToken

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

    Facebook -> Web API -> 身份

    Web API -> Andoid -> 这是你身份的令牌

    Android -> Web API -> Give me Auth Method, Authorization: Bearer WebAPIToken

我在网上找到了一个有用的课程:(基于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);

希望对你有帮助!

【讨论】:

你能解释一下你是如何获得用户令牌的吗? 我在答案中添加了用于创建令牌的代码!希望对你有帮助 可以在应用程序内使用 facebook api 进行 get /me 调用,然后发回用户 obj 很好的答案。解释了很多,帮助我完成了我的工作。为 WebApi accessToken 创建身份时 - 不要忘记为分配给用户的所有角色添加声明。否则,您最终可能会想知道为什么令牌不适用于某些方法和验证角色的方法 - 不是。

以上是关于通过 Facebook 令牌从 Android 应用程序对 WebAPI 的身份验证访问的主要内容,如果未能解决你的问题,请参考以下文章

使用新访问令牌在 android 上使用 asmack 进行 Facebook 聊天

Facebook Android SDK 图形 API 版本

如何从 Facebook 登录 sdk 中删除 ProgressBar

将 Facebook 访问令牌传递到评论框

从用户 ID facebook 解析访问令牌

令牌过期后的Android Facebook登录