由于我想使用 React Context 设置 Axios 拦截器,因此似乎可行的唯一解决方案是创建一个拦截器组件,以便使用 useContext 挂钩来访问 Context 状态和分派。
问题是,这会创建一个闭包,并在调用拦截器时将旧数据返回给拦截器。
我正在使用 React/Node 使用 JWT 身份验证,并且我正在使用 Context API 存储访问令牌。
这就是我的拦截器组件现在的样子:
import React, { useEffect, useContext } from 'react';
import { Context } from '../../components/Store/Store';
import { useHistory } from 'react-router-dom';
import axios from 'axios';
const ax = axios.create();
const Interceptor = ({ children }) => {
const [store, dispatch] = useContext(Context);
const history = useHistory();
const getRefreshToken = async () => {
try {
if (!store.user.token) {
dispatch({
type: 'setMain', …Run Code Online (Sandbox Code Playgroud) 我们正在构建一个 PWA(渐进式网络应用程序)。主要组件是应用程序外壳 (SPA) 和 API。REST API 将提供应用程序所需的数据,而 SPA 将处理其余的(根据 Google 的建议)。
最终用户的身份验证似乎有问题,因为需要考虑 Web 浏览器。我们希望用户登录通过关闭浏览器来保持。我们已经研究了可能的实现方式,但是我们想确保我们不会走错方向。
基于会话的身份验证- 用户将用户名和密码发送到 /accounts/auth 并接收带有会话 ID 的仅 HTTP cookie。会话需要存储在数据库或 Redis 中。此选项的问题在于 cookie 是由浏览器自动发送的,因此我们需要适当的 CSRF 保护。使用同步器令牌模式,每次发出状态更改请求(例如 POST)时都会生成一个新令牌。这意味着应用程序需要为每个请求提供一个 CSRF 令牌,以便 PWA 可以通过 AJAX 发送它。我们认为这并不理想,因为用户可以快速连续发送多个 post 请求,导致其中一些失败并导致糟糕的用户体验。
我们也可以在没有 CSRF 的情况下使用这种方法,方法是将 CORS 策略限制在同一个域并添加一个从技术上讲应该停止所有 CSRF 的标头要求,但是我们不确定它的安全性。
基于 JWT 令牌的身份验证- 用户将用户名和密码发送到 /accounts/auth 并颁发新的 JWT 令牌。然后需要将 JWT 存储在localstorage或cookie 中。使用 localstorage 意味着 JWT易受 XSS 攻击,如果令牌被盗,攻击者可以完全冒充用户。使用 cookie,我们仍然需要解决 …
authentication session api-design progressive-web-apps jwt-auth
目前我正在尝试收集有关如何实现身份验证系统(登录)的知识。在我的研究期间,我尝试在我的后端实施基于 JWT 的解决方案。
我有一个快速服务器,它允许我注册一个用户,存储它的密码(加密)和它的电子邮件。
在登录之后,它会生成一个访问令牌(短期,5 分钟),以访问受保护的路由,以及一个刷新令牌(长期,7 天),以便在前一个过期后生成新的访问令牌。
在我当前的实现中,我将刷新令牌存储在我的数据库中,因此每次我想生成新的访问令牌时都可以使用它。
但这安全吗?据我了解,在我的数据库中存储访问令牌是危险的,因此最好创建一个短期存在的 cookie 存储。但是……刷新令牌?据我所知,这会很危险,因为它基本上允许生成新的访问令牌,所以我不明白为什么不简单地在我的数据库中存储一个长期存在的访问令牌,在每次登录时生成一个新的。
什么是刷新令牌呢?
由于我遵循了一些教程来实现这一点,这就是我的 refresh_token 路由的外观
//get a new access token with a refresh token
app.post('/refresh_token', (req, res) => {
const token = req.cookies.refreshtoken
//if no token in request
if(!token) return res.send({accesstoken : ''});
//if we have a token we verify it
let payload = null;
try{
payload = verify(token, process.env.REFRESH_TOKEN_SECRET);
}catch(err){
return res.send({accesstoken: ''});
}
//if token is valid check if user exist
const user = fakeDB.find(user => user.id === …Run Code Online (Sandbox Code Playgroud) 我想了解,如何为Blazor 服务器端应用程序设置JWT 身份验证?
让我举一个例子:假设我们有一个 .NET Core 3.1 Web API 项目。该项目有自己的TokenController实现,它为有效的用户/密码组合提供 JWT。所有其他控制器对每个请求都需要这样的令牌。
验证身份验证的中间件配置如下:
// enabling JWT bearer scheme
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// TOKEN VALIDATION PARAMETERS
};
});
// applying default authentication policy
services.AddMvc(o =>
{
o.EnableEndpointRouting = false;
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
o.Filters.Add(new AuthorizeFilter(policy));
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
Run Code Online (Sandbox Code Playgroud)
到这里为止,这工作得很好。
现在我想为这个项目添加一个漂亮的 Blazor 服务器端 UI,但我无法思考如何进行身份验证?
根据 Microsoft Docs,服务器端应用程序的身份验证应该在建立 SignalR 连接时进行:
Blazor 服务器身份验证
Blazor 服务器应用通过使用 SignalR 创建的实时连接运行。在建立连接时处理基于 SignalR 的应用程序中的身份验证。身份验证可以基于 cookie或其他一些不记名令牌。
(来源: …
我正在创建一个具有不同角色的用户的 Web API,此外,作为任何其他应用程序,我不希望用户 A 访问用户 B 的资源。像下面这样:
订单/1(用户A)
订单/2(用户B)
当然,我可以从请求中获取 JWT 并查询数据库以检查该用户是否拥有该订单,但这会使我的控制器操作变得过于繁重。
此示例使用 AuthorizeAttribute 但它似乎太宽泛了,我必须为 API 中的所有路由添加大量条件以检查正在访问哪个路由,然后查询数据库进行多个连接,返回到用户表以返回如果请求是否有效。
更新
对于路由,第一道防线是需要特定声明的安全策略。
我的问题是关于负责确保用户只能访问他们的数据/资源的第二道防线。
在这种情况下是否有任何标准方法要采取?
我创建了一个使用令牌JWT与基于角色的策略(基于权限的网页API 此文章)。用户登录会生成一个用于授权的令牌。我成功生成了令牌,但是当我开始使用它访问受限制的 API 操作时,它不起作用并不断给我 401 HTTP 错误(考虑到操作调用不会触发,我什至无法调试)。我究竟做错了什么?。
课程:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<ICountriesService, CountriesService>();
services.AddScoped<ICompanyService, CompanyService>();
services.AddScoped<IPlaneServices, PlaneService>();
services.AddScoped<IPlaneTypeService, PlaneTypeService>();
services.AddScoped<ICitiesService, CitiesService>();
services.AddScoped<IAirfieldService, AirfieldService>();
services.AddScoped<ITicketTypeService, TicketTypeService>();
services.AddScoped<IFlightService, FlightService>();
services.AddScoped<ILuxuryService, LuxuryService>();
services.AddScoped<IUserService, UserService>();
// Register the Swagger generator, defining 1 or more Swagger …Run Code Online (Sandbox Code Playgroud) 目前正在关注有关如何实现 OAuth JWT 身份验证的本教程。目前卡在两件事情上,这已经变得有点难以解决。
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audienceId },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
}
});
Run Code Online (Sandbox Code Playgroud)
不知道为什么我会收到此错误,因为所有必需的软件包都已安装。在另一个 IssuerSecurityKeyProviders 上存在,如果我选择使用这个或运行带有错误的构建,它将生成令牌但是当我尝试访问 api 上的任何授权端点时,我收到可怕的“消息”:“授权此请求已被拒绝。”
当我调试令牌时,所有似乎都匹配。发行人相同,受众 ID 相同,用户也确实存在于数据库中,但 changepassword 端点总是失败,如下面的屏幕截图所示。
最后但并非最不重要的一点是寻找一个很好的教程,我可以按照它来帮助我使用 JWT 和 OWIN 启动和运行 Web API 身份验证。大部分已经过时,包已经改变了多年来例如这一个,这是很难发现的答案中遇到的问题。令人沮丧的触摸
目前我们正在使用 JWT 进行身份验证,因此一旦创建令牌,它就是终身的,如果我们设置时间过期,令牌将过期。有什么办法可以使令牌过期吗?单击注销按钮时,我需要销毁令牌。asp.net 核心,web api。
我对 python 中的 FastAPI 有点陌生。我正在构建一个需要基于 JWT 令牌的授权的 API 后端框架。现在,我知道如何生成 JWT 令牌,但不确定如何将其与 Python 中快速 api 中的 API 方法集成。任何指针将不胜感激。
我正在通过jwt.io(在调试器部分)解码 JWT 令牌以查看标题、有效负载。令人惊讶的是,它还验证了,我可以看到它(jwt.io 调试器)也能够检索公钥。
所以我的问题是:JWT 令牌是否提供公钥以及 JWT 令牌的一部分?
我正在粘贴它的一部分(由于安全原因无法完全粘贴,将截断实际 JWT 令牌的一部分)
F3cy5jb21cL2V1LXdlc3QtMV9ZckVRYjY5Z1giLCJleHAiOjE2MDE2Mzg4OTMsImlhdCI6MTYwMTYzNTI5MywidmVyc2lvbiI6MiwianRpIjoiNmI2YmZiNmYtY2M0MS00N2Q5LWI0YzYtOTBmOGFmNWM2MjQ1IiwiY2xpZW50X2lkIjoiMTM0MWxxa3N1ZmUwbm1vaW9kdnRjc2t2cWIifQ.RtKfz54uBgSZ1gc4KRPjzL4dPe5AbH2YMJu-DDvIxBzgMjqT9q4ApGzcWYB62-MgDUf-F_hK0kF9eIwAi9fARhp 0HGGnyiuydW_our6zE3EphLvXQByTDY5xzOUuSvt7WbDZWeSfpHcjrBttRSJAPOsZ2gInafKjZgWKyGL4vJB9swEhOMSSpTQDGWKenJCyp4emhe8E4XGzYTo9WEb-Wqg6sI__LrusDNd917FaocPKBxA
Run Code Online (Sandbox Code Playgroud)
解码消息(再次被截断)
标题
{
"kid": "cJ0PzkBXPyjX7FM67jcOECIY=",
"alg": "RS256"
}
Run Code Online (Sandbox Code Playgroud)
有效载荷:
{
"sub": "13lqs0moiodvtcskvqb",
"token_use": "access",
"scope": "example.com/Manage",
"auth_time": 1601293,
"iss": "https://cognito.eu.amazonaws.com/",
"exp": 1601638,
"iat": 10353,
"version": 2,
"jti": "cc1-47d9-b6-5c6245",
"client_id": "nmodvtcb"
}
Run Code Online (Sandbox Code Playgroud)
在那里,可以看到公钥(被截断)
-----BEGIN PUBLIC KEY-----
QEFAAOCAQ8AMIIBCxmf9bakWk
556KYmIZB+Sy1ftkkGa4qlUsmRvcG2Hll+7HBWp1ao6MVLskjdaaKg8iH1Iz4DKG
lgqT/ndwhoxvTBuvm0X2CZoNzZn4S8wDTr78m/S/YegZRhv6y58gkiKSEmbbC/g5
Bp+AF88NwBvLm1jdd
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
jwt.io 中的调试器从哪里检索公钥?我无法理解这一点。
jwt-auth ×10
jwt ×8
.net ×2
c# ×2
.net-core ×1
api ×1
api-design ×1
asp.net-core ×1
axios ×1
core ×1
express-jwt ×1
fastapi ×1
javascript ×1
jwk ×1
oauth ×1
owin ×1
public-key ×1
python ×1
reactjs ×1
session ×1