标签: jwt-auth

如何正确设置带有 React Context 的 Axios 拦截器?

由于我想使用 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)

javascript jwt reactjs axios jwt-auth

19
推荐指数
1
解决办法
5225
查看次数

PWA 的 API 身份验证

设置

我们正在构建一个 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 存储在localstoragecookie 中。使用 localstorage 意味着 JWT易受 XSS 攻击,如果令牌被盗,攻击者可以完全冒充用户。使用 cookie,我们仍然需要解决 …

authentication session api-design progressive-web-apps jwt-auth

14
推荐指数
1
解决办法
4418
查看次数

在数据库中存储刷新令牌是否安全?(为登录目的颁发新的访问令牌)。或者有没有更简单的方法?

目前我正在尝试收集有关如何实现身份验证系统(登录)的知识。在我的研究期间,我尝试在我的后端实施基于 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)

jwt express-jwt jwt-auth

12
推荐指数
2
解决办法
9183
查看次数

.NET Core 3.1 Web API 和 Blazor 服务器端 JWT 身份验证

我想了解,如何为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或其他一些不记名令牌。

(来源: …

.net jwt .net-core jwt-auth blazor-server-side

9
推荐指数
1
解决办法
4996
查看次数

控制器级别之外的基于 Asp.net Core WebAPI 资源的授权

我正在创建一个具有不同角色的用户的 Web API,此外,作为任何其他应用程序,我不希望用户 A 访问用户 B 的资源。像下面这样:

订单/1(用户A

订单/2(用户B

当然,我可以从请求中获取 JWT 并查询数据库以检查该用户是否拥有该订单,但这会使我的控制器操作变得过于繁重。

示例使用 AuthorizeAttribute 但它似乎太宽泛了,我必须为 API 中的所有路由添加大量条件以检查正在访问哪个路由,然后查询数据库进行多个连接,返回到用户表以返回如果请求是否有效。

更新

对于路由,第一道防线是需要特定声明的安全策略。

我的问题是关于负责确保用户只能访问他们的数据/资源的第二道防线。

在这种情况下是否有任何标准方法要采取?

c# asp.net-core-webapi jwt-auth asp.net-core-3.1

9
推荐指数
2
解决办法
1929
查看次数

JWT不记名令牌授权不起作用asp net core web 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)

c# jwt asp.net-core asp.net-core-webapi jwt-auth

8
推荐指数
1
解决办法
8192
查看次数

JwtBearerAuthenticationOptions 不包含 IssuerSecurityTokenProviders 的定义

目前正在关注有关如何实现 OAuth JWT 身份验证的本教程。目前卡在两件事情上,这已经变得有点难以解决。

  1. 下面的代码抛出“定义”和“命名空间”错误。
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 身份验证。大部分已经过时,包已经改变了多年来例如这一个,这是很难发现的答案中遇到的问题。令人沮丧的触摸

oauth jwt asp.net-web-api owin jwt-auth

7
推荐指数
1
解决办法
2886
查看次数

JWT 令牌:注销 JWT 令牌

目前我们正在使用 JWT 进行身份验证,因此一旦创建令牌,它就是终身的,如果我们设置时间过期,令牌将过期。有什么办法可以使令牌过期吗?单击注销按钮时,我需要销毁令牌。asp.net 核心,web api。

.net api core jwt jwt-auth

7
推荐指数
1
解决办法
9762
查看次数

如何使用基于 JWT 令牌的授权来保护 fastapi API 端点?

我对 python 中的 FastAPI 有点陌生。我正在构建一个需要基于 JWT 令牌的授权的 API 后端框架。现在,我知道如何生成 JWT 令牌,但不确定如何将其与 Python 中快速 api 中的 API 方法集成。任何指针将不胜感激。

python jwt jwt-auth fastapi

7
推荐指数
3
解决办法
1万
查看次数

jwt.io 从哪里获取 JWT 令牌的公钥?

我正在通过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 中的调试器从哪里检索公钥?我无法理解这一点。

public-key jwt jwk jwt-auth

7
推荐指数
2
解决办法
3009
查看次数