授权中间件 JWT 混淆

     2023-03-10     208

关键词:

【中文标题】授权中间件 JWT 混淆【英文标题】:Authorization middleware JWT confusion 【发布时间】:2021-04-16 00:33:07 【问题描述】:

我怀疑我在参加的课程中遇到的一些身份验证中间件代码的相对安全性。

所以我使用邮递员向受保护的路线发送请求(请参阅下面的路线代码),发现我能够使用为另一个用户生成的令牌检索一个用户的订单。

const protected = asyncHandler(async (req, res, next) => 
  let token;
  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith("Bearer")
  ) 
    try 
      token = req.headers.authorization.split(" ")[1];
      const decoded = jwt.verify(token, process.env.JWT_SECRET);
      req.user = await User.findById(decoded.id).select("-password");

  next();
 catch (error) 
  console.error(error);
  res.status(401);
  throw new Error("Not authorized, token failed");

 
  if (!token) 
    res.status(401);
    throw new Error("Not authorized, No token found");
  
); 
export protected

在我看来,这个中间件代码只会验证来自解码令牌的用户是否存在于数据库中,但不会根据用户/令牌限制对资源的访问。

import addOrderItems, getOrderbyId  from "../controllers/orderController.js";
import  protected  from "../middleware/authMiddleware.js";
    
const router = express.Router();

router.route("/").post(protected, addOrderItems);
router.route("/:id").get(protected, getOrderbyId);
//:id is the order id

但是,当测试另一个受保护的路由以更新用户的个人资料信息时,我在使用错误的令牌时收到错误消息。

希望得到一些澄清

【问题讨论】:

此代码本身仅验证 jwt 令牌是否有效并匹配数据库中的某个用户。它不做任何其他事情来控制该用户可以或不能访问哪些数据。顺便说一句,asyncHandler() 是什么? @jfriend00 它的中间件用于处理快速异步函数中的异常。检查此link。感谢您的澄清。想了很多 @jfriend00 你觉得这个策略怎么样:我想在我的用户数据库模型/文档中添加一个名为 tokens 的数组字段。然后我会检查令牌字段是否匹配令牌。如果令牌字段不存在匹配项,则抛出错误(未授权) 令牌不一定是永久的,所以我不会将它们用作永久密钥。我不知道您的应用程序,但也许记录可能包含授权用户 ID 列表?或者,如果记录只属于一个用户,那么每个用户都应该有自己的记录列表,并且您的服务器只查找属于当前授权用户的记录。根据应用的整体需求,有很多不同的方式来构建事物。 【参考方案1】:

jwt.verify 只会验证给定的令牌是否由服务器生成。它不关心哪个用户发送了这个令牌。

对于受保护的中间件,它只检查请求是否被授权。如果是这样,请求将传递给控制器​​。

关于更新路线。大概是这样的:

// route 
router.route("/:userId", protected, updateController)

const updateController = (req, res) => 
  const user = req.user; // this is the one generated by protected middleware
  const reqUserId = req.params.userId; // this is the one send by request
  
  if (user.id !== reqUserId) 
      // if two ids are not the same, it means someone is trying
      // to update the profile with the wrong token
      res.status(401);
  

  // update profile in database

【讨论】:

基于角色的 jwt 授权

...。现在我需要根据用户角色保护我的API。这是我如何路由中间件以进行身份​​验证和检查令牌。varapp=express();varapiRoutes=express.Router();api 查看详情

JWT 授权 laravel / angularjs 问题

...作为我的后端API和tymon/jwt-auth来创建令牌/刷新令牌并提供中间件来检查令牌。我正在使用AngularJS和Satellizer将返回的令牌存储在本地存储 查看详情

Postgraphile + express + jwt 正在抛出“未找到授权令牌”,即使 graphiql 有效

...】:2019-03-0404:19:32【问题描述】:我正在尝试将jwtexpress中间件和postgraphile中间件一起使用,并且我想 查看详情

使用 JWT 令牌实现身份验证和授权

】使用JWT令牌实现身份验证和授权【英文标题】:implementingauthenticationandauthorizationusingJWTtoken【发布时间】:2017-12-1017:58:47【问题描述】:我只是混淆使用UseJwtBearerAuthentication或JWT和OAUTH2在.NetCoreWebAPI中实现身份验证和授权。【问... 查看详情

laravel 8 -> 使用 jwt 和邮递员授权

...户是管理员或作者时才能创建新帖子,所以我创建了一个中间件AdminLevelAuthorizatio 查看详情

NodeJs:错误401(未经授权)我正在使用passport-jwt

...-2822:11:11【问题描述】:我正在使用nodejsmongodb和passport-jwt中间件passport.authenticate登录进行身份验证应用程序工作,我得到了令牌,但是当我在登录后尝试访问用户配置文件时, 查看详情

Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权

...之前,我在通过令牌JWT(简单JWT)授权时遇到问题。我的中间件:fromchannels.authi 查看详情

在 Ocelot API 网关中间件中返回未授权

】在OcelotAPI网关中间件中返回未授权【英文标题】:ReturnunauthorizedinOcelotAPIGatewayMiddleware【发布时间】:2021-10-2913:20:53【问题描述】:此时,我的微服务中有一个OcelotAPI网关,但我最近正在研究如何使JWT无效,而在我的项目中做... 查看详情

PHP Slim 4 - 使用 firebase JWT 令牌授权 api 请求

...:35:53【问题描述】:我正在尝试使用适用于slim4的TuupolaJwt中间件验证从firebasejavascriptsdk提供的idToken,但我总是收到401错误。这是我用来获取令牌的客户端代码:constpro 查看详情

使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误

...题描述】:我正在使用Keycloak进行身份验证,并使用它的中间件为我的请求附加了一个令牌。我试图编写一个 查看详情

Passport JWT 策略没有被调用

...间】:2018-09-1402:53:47【问题描述】:我正在尝试使用护照中间件授权我的JWT令牌,但没有调用策略回调函数。在我的app.js文件中,我指定我的/users路由使用中间件,如下所示:app.use(\'/users\',passport.authenticate(\'jwt\',session 查看详情

如何在 NodeJS 中使用 JWT 令牌验证路由

...确认用户和密码后,将创建一个JWT令牌。我还制作了一个中间件来验证该令牌并在我创建的某个路线上使用该中间件。使用Postman在标头插入令牌测试此路由,一切正常,但是当我尝试在浏览器上使 查看详情

.Net Core JWT 身份验证与自定义 API 密钥中间件

】.NetCoreJWT身份验证与自定义API密钥中间件【英文标题】:.NetCoreJWTAuthenticationwithcustomAPIKeyMiddleware【发布时间】:2018-02-2721:10:43【问题描述】:我有一个使用JWT令牌授权用户的.NetCore2.0应用程序。这一切都很好,但我希望有某种AP... 查看详情

jwt生成token及过期处理方案

...成功;如果token超时,客户端 携带refresh\_token调用中间件接口获取新的access\_token; 3.中间件接受刷新token的请求后,检查refresh_t 查看详情

JSON Web Token exp 时间混淆

...100年以上。应该没有必要这样做:当JWT过期时,您只需在授权服务器上获得一个新的;如果用户仍处于登录状 查看详情

多用户模型 Laravel JWT Auth

...ceUser在JWT配置中定义为标准模型。现在我已经编写了一个中间件来验证它们中的每一个授权用户:publicfunctionhandle($request,Closure$next)Con 查看详情

此示例中 JWT 令牌存储在哪里?

...找如何在nodejs中实现它的教程。显然有一个用于nodejs的jwt中间件,称为“jsonwebtoken”。我看过一些关于它的视频,了解到您可以通过访问header来访问创建的令牌:(r 查看详情

处理可组合中间件中的express-jwt错误(代码片段)

我正在为每个API实现JWT授权,如下所示:auth.jsimportexpressJwtfrom'express-jwt';importcomposefrom'composable-middleware';varvalidateJwt=expressJwt(secret:config.secrets.session);functionisAuthenticated()returncompose().use(function(req,res,next)validateJwt(req,res,next);).use(function... 查看详情