我正在尝试让我的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应用程序之间切换?
很抱歉这个混乱,我试图找出这个身份验证过程旁边的逻辑。
答案 0 :(得分:9)
好的,我想我已经知道了!
当WebAPI收到Facebook令牌时,对用户和授权一无所知。但是,由于令牌,可以“作为来电者”访问Facebook。
通过这种方式,应用程序可以执行以下操作:
Android - > Facebook登录 - >获取FBToken
Android - > Web API - >发送FBToken
Web API - > Facebook - > /我发送FBToken
Facebook - > Web API - >身份
Web API - > Andoid - >这是您身份的标记
Android - > Web API - >给我Auth方法,授权: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);
我希望它有所帮助!