gpt4 book ai didi

c# - ASP.net 核心网络 API : Using Facebook/Google OAuth access token for authentication

转载 作者:可可西里 更新时间:2023-11-01 03:01:24 25 4
gpt4 key购买 nike

这几天我一直在尝试使用 Google 和 Facebook 进行 OAuth 身份验证,以便在我的 ASP.net 核心 Web API 项目中工作。

我目前的状态是:

  • 我有一个 ASP.net 核心 Web Api 项目,其中的用户需要进行身份验证
  • 我有一个 Angular 2 网络应用程序,它应该使用我的网络 API(需要身份验证)
  • 我有一个 android 应用程序,它应该使用我的 web api(需要身份验证)

我的目标是:

  • 使用 Google/Facebook 作为 OAuth 提供商进行登录
  • 稍后:添加自己的用户帐户(可能使用 IdentityServer4)
  • 无需重定向到特殊的登录网站(如 IdentityServer4 解决方案)。只需点击应用程序中的 facebook/google 按钮,允许访问,完成!

在我的 android 和 angular 应用程序中,我能够从 google/facebook 检索访问 token 。现在,我想使用 OAuth 隐式流程,使用给定的访问 token (将 token 作为不记名 token 放入 header 中)在我的 web api 上对用户进行身份验证

我的问题是:有没有通用的方法可以轻松做到这一点?我不想为此使用 facebook/google SDK。

我试过以下方法:

  • 使用 IdentityServer4:这样我就可以在我的 webapi 上使用 facebook/google 登录,但是需要重定向到 IdentityServer4 登录页面。有没有什么方法可以在我的应用程序中点击 google/fb 按钮并登录,无需重定向到 identityServer 登录页面?
  • 使用 google/facebook 身份验证中间件 ( https://learn.microsoft.com/en-us/aspnet/core/security/authentication/social/ ):但他们没有验证我发送的不记名 token (尝试了无数种方法来实现正确验证)。这甚至可以在网络 API 中使用吗?
  • 尝试使用 Microsoft.AspNetCore.Authentication.JwtBearer-Middleware 并自行为 google/facebook 添加必要的选项,但也没有验证(以及无数次尝试)

在过去的几天里,我尝试了太多可能的解决方案,以至于我完全陷入困境并且忘记了我需要做什么才能实现这一目标。在这一点上,我已经阅读了几乎所有的 asp.net web api oauth 教程/stackoverflow 条目,但无法弄清楚如何在我的案例中使用它。大多数教程仅适用于 mvc-Websites 或使用 IdentityServer4 并重定向到其登录页面。

有什么建议或解决方案吗?我错过了什么?

最佳答案

如果我理解正确,您已经通过您的应用从 Facebook SDK 获得了您的 Facebook 用户 token 。
像你一样,我找不到如何使用 ASP.NET Core 库/包来完成它。所以我回到了基础。
我只是用 Facebook token 调用我的 api 的端点,根据 Facebook graph api 检查它,如果没问题,那么我注册用户(如果需要)并返回我的 JWT token ,就好像用户通过经典的用户名/密码路径登录一样。

[HttpPost]
[AllowAnonymous]
[Route("api/authentication/FacebookLogin")]
public async Task<IActionResult> FacebookLogin([FromBody] FacebookToken facebookToken)
{
//check token
var httpClient = new HttpClient { BaseAddress = new Uri("https://graph.facebook.com/v2.9/") };
var response = await httpClient.GetAsync($"me?access_token={facebookToken.Token}&fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale,picture");
if (!response.IsSuccessStatusCode) return BadRequest();
var result = await response.Content.ReadAsStringAsync();
var facebookAccount = JsonConvert.DeserializeObject<FacebookAccount>(result);

//register if required
var facebookUser = _context.FacebookUsers.SingleOrDefault(x => x.Id == facebookAccount.Id);
if (facebookUser == null)
{
var user = new ApplicationUser {UserName = facebookAccount.Name, Email = facebookAccount.Email};
var result2 = await _userManager.CreateAsync(user);
if (!result2.Succeeded) return BadRequest();
facebookUser = new FacebookUser {Id = facebookAccount.Id, UserId = user.Id};
_context.FacebookUsers.Add(facebookUser);
_context.SaveChanges();
}

//send bearer token
return Ok(GetToken(facebookUser.UserId));
}

关于c# - ASP.net 核心网络 API : Using Facebook/Google OAuth access token for authentication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43833599/

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