gpt4 book ai didi

asp.net-core - 我可以验证使用带有 .net 后端的 native iOS sdk 创建的 Facebook jwt token 吗?

转载 作者:行者123 更新时间:2023-12-02 15:18:25 27 4
gpt4 key购买 nike

我正在使用 .net 核心 Web API 后端在 iOS 应用程序上实现 Facebook 登录。

  1. 我在 Facebook 中使用客户端 ID 和密码创建了该应用。
  2. 我将 iOS 和网页添加到我的应用中
  3. iOS 应用成功连接并获取 token
  4. 我将 app.UseFacebook 代码添加到我的 startup.cs 并使用应用程序 ID 等配置它。
  5. 我将授权属性添加到我要限制访问的操作
  6. 我使用 https get 从 iOS 调用这个 web api 操作,并添加一个 http header Authorization Bearer(我从 Facebook 获得的 token )

get 返回状态代码 401,就好像我的 token 无效一样。我想知道 iOS token 是否也可以用于网页应用程序?我为我的 Facebook 应用配置了这两个。

最佳答案

我不确定这是否是正确的方法,但我的实现是有效的。

工作流程是,

  • iOS 应用使用 facebook sdk 获取 facebook 访问 token
  • iOS 应用程序使用 facebook 访问 token 在 .NET 后端创建用户
  • .NET 后端验证 facebook 访问 token 是否有效并下载用户数据
  • .NET 后端创建一个 jwt 承载 token 并将其返回给 iOS 应用
  • iOS 应用程序使用授权 http header 中的 jwt 不记名 token 调用 .NET 后端

我通过调用 https://graph.facebook.com 检查 Facebook 访问 token 是否有效-- 引用:Task VerifyAccessToken(string email, string accessToken)

AccountController.cs

[AllowAnonymous, HttpPost("[action]")]
public async Task<ActionResult> FacebookAuth([FromBody] ExternalLoginModel model)
{
try
{
await _interactor.VerifyAccessToken(model.Email, model.Token);

var result = await _interactor.SignInWithFacebook(model.Email);

return Ok(result);
}
catch (ValidationException ex)
{
return BadRequest(ex.Message.ErrorMessage(Strings.ValidationException));
}
}

[AllowAnonymous, HttpPost("[action]")]
public async Task<ActionResult> CreateAccountWithFacebook(AccountModel account, string token)
{
try
{
await _interactor.VerifyAccessToken(account.Email, token);

if (ModelState.IsValid)
{
var result = await _interactor.CreateFacebookLogin(account);

return Ok(result);
}

return BadRequest(ModelState);
}
catch (ValidationException ex)
{
return BadRequest(ex.Message.ErrorMessage(Strings.ValidationException));
}
}

调用 facebook 图形服务以验证访问 token 是否有效

public async Task<FacebookMeResponse> VerifyAccessToken(string email, string accessToken)
{
if (string.IsNullOrEmpty(accessToken))
{
throw new ValidationException("Invalid Facebook token");
}

string facebookGraphUrl = "https://graph.facebook.com/me?fields=cover,age_range,first_name,location,last_name,hometown,gender,birthday,email&access_token=" + accessToken;
WebRequest request = WebRequest.Create(facebookGraphUrl);
request.Credentials = CredentialCache.DefaultCredentials;

using (WebResponse response = await request.GetResponseAsync())
{
var status = ((HttpWebResponse)response).StatusCode;

Stream dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
var facebookUser = JsonConvert.DeserializeObject<FacebookMeResponse>(responseFromServer);

bool valid = facebookUser != null && !string.IsNullOrWhiteSpace(facebookUser.Email) && facebookUser.Email.ToLower() == email.ToLower();
facebookUser.PublicProfilePhotoUrl = "http://graph.facebook.com/" + facebookUser.Id + "/picture";

if (!valid)
{
throw new ValidationException("Invalid Facebook token");
}

return facebookUser;
}
}

为您的中间件创建一个 jwt 承载 token ,iOS 应用程序将使用 jwt 承载 token 调用您的 .NET api(它不会使用 facebook access_token)

public async Task<FacebookResponse> SignInWithFacebook(string email)
{
var claims = new List<Claim>();

var user = await _userManager.FindByEmailAsync(email);

var identity = new ClaimsIdentity(claims, "oidc");

var jwtBearerToken= Guid.NewGuid().ToString();
var properties = new AuthenticationProperties();
properties.Items.Add(".Token.access_token", jwtBearerToken);

await _signInManager.SignInAsync(user, properties, "oidc");

var principal = await _signInManager.CreateUserPrincipalAsync(user);

var token = new Token();
token.Key = jwtBearerToken;
token.Expiry = DateTime.UtcNow.AddMinutes(30);
token.UserId = user.Id;
token.TokenType = "FacebookLogin";

await _tokensRepository.Save(token);
var result = _signInManager.IsSignedIn(principal);

return new FacebookResponse("success", result, jwtBearerToken);
}

如果用户不存在则创建一个

public async Task<FacebookResponse> CreateFacebookLogin(AccountModel model)
{
User user = await _userManager.FindByEmailAsync(model.Email);

if (user == null)
{
var createResult = await _userManager.CreateAsync(_mapper.Map<AccountModel, User>(model));
if (!createResult.Succeeded)
{
// handle failure..
}
}

return await SignInWithFacebook(model.Email);
}

用于反序列化来自 facebook 图形 REST 服务的响应的类

public class FacebookAgeRange
{
public int Min { get; set; }
}

public class FacebookMeResponse
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Gender { get; set; }
public FacebookAgeRange AgeRange { get; set; }
public string PublicProfilePhotoUrl { get; set; }
}

public class FacebookResponse : IResponse
{
public bool Ok { get; set; }
public string Message { get; set; }
public string JwtToken { get; set; }

public FacebookResponse(string message, bool ok = true, string jwtToken = "")
{
this.Message = message;
this.Ok = ok;
this.JwtToken = jwtToken;
}
}

关于asp.net-core - 我可以验证使用带有 .net 后端的 native iOS sdk 创建的 Facebook jwt token 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com