gpt4 book ai didi

javascript - SPA - Firebase 和 .Net WebApi 2 身份验证

转载 作者:数据小太阳 更新时间:2023-10-29 05:07:46 25 4
gpt4 key购买 nike

我有一个用 AngularJs 编写的单页应用程序(此时框架无关紧要)该应用程序托管在 IIS 中,它由 index.html 和一堆客户端 Assets 组成。

在后端,我有 WebApi 2,它也作为单独的应用程序托管在 IIS 中。

为了在客户端进行身份验证,我使用启用了多个社交网络的 Firebase(简单登录),例如 Facebook、Twitter 或 Google。

到目前为止一切顺利。我喜欢使用 firebase 启用 Twitter 身份验证是多么容易。

在使用社交网络登录时,我从 firebase、firebaseAuthToken 和提供商 accesstoken 返回。

现在我想使用 firebaseAuthToken 或提供商访问 token 对我的 WebApi 进行身份验证。

问题是:在给定条件下使用 WebApi 进行身份验证的最佳方法是什么?

由于我在服务器上部署了复杂的业务逻辑,因此无法仅使用 firebase 来存储我的数据并摆脱 web api。

到目前为止,我有一个愚蠢的想法,就是将社交提供商访问 token 传递给服务器,针对提供商验证 token ,然后使用 Owin -Katana 颁发安全 token 。

由于缺乏文档、复杂性以及与单页应用程序的集成不佳,我没有使用 katana 的内置社交提供程序支持。我发现 SPA 的 visual studio 模板太特定于 mvc。但这就是我 :)

最佳答案

tl;dr - Demo Project on GitHub

下面的步骤可能看起来很长,但实际上非常简单。我只用了一个小时左右就创建了我的演示项目。


我同意你关于使用 Owin 和 Katana 的看法。我以前经历过这个过程,但这并不是一次很棒的经历。使用 Firebase 要容易得多。

这一切都可以用 JWT 来完成!

当您通过 Firebase 和任何社交提供商进行身份验证时,您会得到一个 JSON Web token (JWT) - firebaseAuthToken

从仪表板获取您的 Firebase Secret

JWT 的工作方式是我们有一个 secret token 和一个客户端 token 。 client token是我们登录后收到的firebaseAuthToken。secret token是在Firebase Dashboard中为我们生成的。

Firebase JWTs Dashboard

将您的 Firebase Secret 存储在 Web.config 的 appSettings 部分

我们需要将此 key 存储在 Web.config 中,以便以后更容易访问。

<add key="FirebaseSecret" value="<Firebase-Secret-Token-Goes-Here" />

创建一个 Action 过滤器来检查授权 header 中的 JWT

我们可以通过在授权 header 中传递客户端 token 来验证请求是否有效。在服务器上,我们可以存储从 Firebase 仪表板获得的 key 。当 Web API 检查请求时,我们可以使用 JWT 库(available from NuGet)解码 JWT。如果解码成功,那么我们可以检查 token 以确保它没有过期。

public class DecodeJWT: ActionFilterAttribute 
{

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
string firebaseAuthToken = string.Empty;
if (actionContext.Request.Headers.Authorization != null) {
firebaseAuthToken = actionContext.Request.Headers.Authorization.Scheme;
} else {
throw new HttpException((int) HttpStatusCode.Unauthorized, "Unauthorized");
}

string secretKey = WebConfigurationManager.AppSettings["FirebaseSecret"];
try {
string jsonPayload = JWT.JsonWebToken.Decode(firebaseAuthToken, secretKey);
DecodedToken decodedToken = JsonConvert.DeserializeObject < DecodedToken > (jsonPayload);
// TODO: Check expiry of decoded token
} catch (JWT.SignatureVerificationException jwtEx) {
throw new HttpException((int) HttpStatusCode.Unauthorized, "Unauthorized");
} catch (Exception ex) {
throw new HttpException((int) HttpStatusCode.Unauthorized, "Unauthorized");
}

base.OnActionExecuting(actionContext);
}

}

创建一个 $httpInterceptor 将 firebaseAuthToken 添加到每个请求的 header 中

在客户端,诀窍是每次都必须传递 token 。为了使这更容易,我们需要使用 Angular 创建一个 $httpInterceptor 来检查 sessionStorage 上的 firebaseAuthToken

.factory('authInterceptor', function ($rootScope, $q, $window) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.firebaseAuthToken) {
config.headers.Authorization = $window.sessionStorage.firebaseAuthToken;
}
return config;
},
response: function (response) {
if (response.status === 401) {
// TODO: User is not authed
}
return response || $q.when(response);
}
};
})

成功登录时将 firebaseAuthToken 设置为 sessionStorage

每当用户登录时,我们都可以将值设置为 sessionStorage

$rootScope.$on('$firebaseSimpleLogin:login',
function (e, user) {

// add a cookie for the auth token
if (user) {
$window.sessionStorage.firebaseAuthToken = user.firebaseAuthToken;
}

cb(e, user);
});

全局注册DecodeJWT过滤器

WebApiConfig.cs Register 方法中,我们可以设置 DecodeJWT 过滤器以应用于我们所有的 ApiController。

config.Filters.Add(new DecodeJWT());

现在,每当我们向 ApiController 发出请求时,它都会拒绝它,除非存在有效的 JWT。因此,在用户登录后,如果 ApiController 不存在,我们可以将他们的数据保存到 ApiController。

// globally uses DecodeJWT
public class UsersController: ApiController
{
// POST api/users
public void Post([FromBody] FbUser user) // See GitHub for this Model
{
// Save user if we do not already have it
}
}

关于javascript - SPA - Firebase 和 .Net WebApi 2 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745355/

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