当前位置: 首页 > 知识库问答 >
问题:

节点。使用passport和typescript的js身份验证:找不到请求。使用者

楚彦
2023-03-14

我目前正在为使用typecript、WebStorm、护照和jwt的node.js微服务应用程序开发身份验证服务。在尝试将路由添加到“/api/login”时,我注意到智能感知似乎没有拾取req.user的用户对象或req.header.authorization.的授权对象。例如,以下方法不起作用,因为它找不到用户对象:

private generateToken(req: Request, res: Response, next: NextFunction){
req.token = jwt.sign({
  id: req.user.id,
  firstname: req.user.firstname,
  lastname: req.user.lastname,
  roles: req.user.roles
}, process.env.AUTH_KEY, {
  expiresIn: "7d"
});
return next();
}

我正在使用express中的请求对象:

import { NextFunction, Request, Response, Router } from "express";

我需要使用不同的请求对象吗?

此外,如果我需要强制对某些api路由进行身份验证,但锁定了其他路由,那么应该如何使用passport jwt实现这一点?我知道有一个快递包裹,我可以用在jwt快递上。

共有1个答案

太叔涵亮
2023-03-14

不知道为什么这个问题被否决了,可能是因为它应该是两个独立的问题。

您可以扩展Express的类型声明。

扩展express类型定义

将文件library-ext.d.ts添加到您的源目录中。

declare module 'express' {
  export interface Request {
        user?: any;
    }
}

对于req.header.authorization尝试:req.headers['授权']。注意's'。

与一般认证有关

这取决于您的注册用户是否也可以使用guest路线。如果您不需要来宾路由上的身份,那么只需在经过身份验证的路由上注册passport身份验证中间件,或者将路由拆分为单独的路由器。这相当简单,只需搜索堆栈溢出或在文档中查找它。

更复杂的情况是,当您需要经过身份验证和未经身份验证的用户来访问一条路线时,可以认为是客户或经过身份验证的客户在购物车中添加了一些东西。不幸的是,passport jwt在认证头中没有令牌时会使用401拒绝,所以我找到的最简单的方法,不是分岔项目或滚动我自己的策略,而是使用中间件添加已知值来表示一个匿名请求。然后只需确保中间件在受影响的路由中进行passport身份验证之前。下面是一个小片段,让你开始:

CoreCtrl

class CoreCtrl {

  simulateAnonymous(req, res, next) {
    if (!req.headers.authorization) {
      req.headers.authorization = 'Bearer guest-token';
    }
    return next();
  }

}

然后在你的Express设置中的某个地方

setupRouters() {
    // the public and admin routers are bound to the application
    const coreCtrl = new CoreCtrl(this.serverOpts);
    const anonymousCtrl = coreCtrl.simulateAnonymous.bind(coreCtrl);
    this.routers.admin.use(anonymousCtrl);
    this.routers.admin.use(passport.authenticate('UserBearer', { session: false }));
    this.routers.public.use(anonymousCtrl);
    this.routers.public.use(passport.authenticate('CustomerBearer', { session: false }));
  }

请注意,我在这里设置了单独的公共和管理员路由器,这不是必需的,只是为了说明如何做到这一点。

那么在承载策略中,你会有一些类似的代码。

/**
* Run the strategy
*
* @param token {String} The JWT Token
* @param done {Callback} Callback function
*/
exec(token:string, done):Promise<any> {
  // this is the workaround to support not passing a token for guest users.
  if (token === 'guest-token') {
    return done(null, {
      userId: 'guest',
      roles: ['guest']
    });
  }
  // otherwise decode the token and find the user.
}

最后,在稍后的中间件中,您可以检查“来宾”角色是否可以访问受保护的资源。我建议acl模块来管理基于角色的ACL列表。

 类似资料:
  • 我正在使用node.js.实现一个基于微服务的应用程序在搜索如何实现api网关的示例时,我遇到了以下文章,它似乎提供了一个关于实现api网关的示例:https://memz.co/api-gateway-microservices-docker-node-js/.尽管到目前为止,在node.js中找到实现api网关模式的示例似乎有点困难,但这篇文章似乎是一个非常好的例子。 有几个项目还不清楚,我仍

  • 我正在尝试使用passport ldapauth npm验证openLDAP用户名和密码。在执行下面的代码时,我总是收到错误消息:“缺少凭据”。请帮助我我的代码有什么问题。 有关更多详细信息,请参阅此badRequestMessage flash消息以查找缺少的用户名/密码(默认值:“缺少凭据”)

  • 我的AWS Lambda函数中有一个使用node的http请求。js。代码工作正常,但是,我想访问需要用户名/密码身份验证的URL。如何在代码中实现它?

  • 我是新的(护照)在laravel。是否有可能使用 即使使用了laravel内置身份验证?

  • 我第一次尝试使用Google Firestore,通过Google api身份验证进行身份验证。我要做的第一件事是用几个方法来填充数据库,当我等待批处理任务时,会出现以下错误: 我几乎找不到谷歌认证连接firestore的方法。首先,我使用google console为我的应用程序提供的密码使用此方法进行身份验证: 使用在我的google控制台中为应用程序配置的相同作用域(我在同一应用程序中使用g

  • 我必须用python中的app ID和app token使用或,在中我像下面一样使用,这是可行的 在python建议或,但我不知道如何我需要Authenitcate,我已经找到了几个链接,但基本的身份验证 基本身份验证: 使用urllib3进行身份验证 下面的链接只有令牌秘密和没有令牌ID 具有身份验证的python请求(访问令牌) 有人能帮我通过/验证应用id和应用令牌吗