如何使用 Passport.js 的远程 NodeJS API 对客户端 Web 应用程序进行身份验证和授权

2023-12-27

如下图所示,我有一个独立的 API 项目在服务器上运行,端口为3001,我有一个 Web 应用程序在服务器上运行,端口为3002.

端口上的API3001,拥有 Web 应用程序(和移动应用程序)获取和放置数据所需的所有 API 路由,包括身份验证 API(使用passport-local and passport-jwt)。在项目的API方面,我还处理了用户角色授权,并且每个路由都有可以访问API的角色列表。

示例路线

todoRoutes.get('/', 
               requireAuth,
               AuthController.roleAuth(['user','editor','admin']),
               TodoController.getTodos);

端口 3001 中的角色授权 API 方法

exports.roleAuth = function(roles){

    return function(req, res, next){

        var user = req.user;

        User.findById(user._id, function(err, foundUser){

            if(err){
                res.status(422).json({error: 'No user found.'});
                return next(err);
            }

            if(roles.indexOf(foundUser.role) > -1){
                return next();
            }

            res.status(401).json({error: 'You are not authorized to view this content'});
            return next('Unauthorized');

        });
    }
}

登录成功后响应json是这样的

{
    "token": "JWT eyJhbGci...",
    "user": {
        "_id": "5986b81d940bab06ddc79b34",
        "email": "[email protected] /cdn-cgi/l/email-protection",
        "role": "admin"
    }
}

Now in Web App,我想使用相同的角色授权和身份验证(登录),但是你看,Web 应用程序未连接到数据库,我可以进行查询,例如检查会话中的用户是否有效并且具有其收到的响应中的角色登录成功后。

Summary以下是我在这个问题中寻找的要点:

  1. 通过端口 3001 上的远程 API 登录客户端 Web 应用程序(已实现)
  2. 获取用户Token和其他信息(响应如上所示)(已实现)
  3. 确保用户在客户端 Web 应用程序上经过身份验证,并记住登录用户的角色,以便使用这些信息对客户端应用程序上的每个路由进行授权。在客户端应用程序中,我有几个带有表单的页面可以将数据发送到端口上的服务器端 API3002,这些页面由具有角色的两个不同用户使用editor and admin.

TIA


您的身份验证 API 应返回嵌入有保证信息(角色)的 JWT。此外,应该使用您的视图 API 已知的秘密来创建令牌。


例如,使用 npm 模块jsonwebtoken https://www.npmjs.com/package/jsonwebtoken,像这样签名:

token = jwt.sign( {
    exp: Math.floor( Date.now() / 1000 ) + ( 60 * 60 ), // 1 hour
    i: user._id,
    role: user.role
}, "my-secret" );

然后,在您的视图 API 上,使用护照-jwt https://www.npmjs.com/package/passport-jwt,它既验证令牌又为您提供与您签名的原始对象匹配的有效负载。使用有效负载作为用户对象:

passport.use( new JwtStrategy( {
    secretOrKey: "my-secret"

}, ( payload, callback ) => callback( null, payload ) ) );

const authenticate = () =>
    passport.authenticate( "jwt", { session: false, failWithError: true } )

在此阶段,您的用户至少已通过身份验证。如果您想将视图限制为某些角色,您可以添加第二个中间件:

const assertRole = ( ...roles ) => ( req, res, next ) => 
    req.user && roles.includes( req.user.role ) ? next() : res.sendStatus( 403 ) );

todoRoutes.get("/admin/view1", authenticate, assertRole( "user", "editor", "admin" ), TodoController.getTodos );

如果您的视图需要有关用户的更多信息,则身份验证 API 将需要在 JWT(因此有保证)或外部(不保证,但会产生较小的令牌)中提供该信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Passport.js 的远程 NodeJS API 对客户端 Web 应用程序进行身份验证和授权 的相关文章