如何使用 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 应用程序进行身份验证和授权 的相关文章

随机推荐

  • 使用数组调用 vararg 函数?

    在下面的示例中 我想将数组的内容传递给接收可变数量参数的函数 换句话说 我想传递给printf的内容foo按值传递这些参数 从而将这些参数传递到堆栈上 include
  • 如何使用 scikit-learn 从线性判别分析中获取特征向量

    如何从 scikit learn 线性判别分析对象中获取变化基矩阵 对于数组X有形状m x p m样品和p特征 和N类 缩放矩阵有p行和N 1列 该矩阵可用于将数据从原始空间变换到线性子空间 艾莉亚回答后编辑 让我们考虑以下示例 from
  • 如何检查是否跨浏览器兼容? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的小问题是是否有一个在线工具可以检查您的 html css 和 jQuery 页面是否跨浏览器兼容 我有一个带有 jquery 的简单淡
  • SH 脚本根据文件名将文件从一个目录移动到另一个目录

    我正在尝试编写一个 sh 脚本 该脚本将在我的其中一个下载完成时运行 它应该在 Downloads 上查找特定的文件名 并根据文件名将其移动到不同的目录 IE 我已经下载了 欢乐合唱团 的最后一集 文件名是 glee some trash
  • 如何仅列出将提交的文件?

    有什么方法可以获取当我键入以下内容时将提交的文件列表 git commit m my changes git status 列出太多 我可以去掉所有的词 但我不愿意 我不想被告知有关未跟踪文件的信息 我试过了 git ls files md
  • 如何在 ASP.NET MVC 中实现分页?

    目前 我正在使用许多博客文章中找到的策略 基本上 URL 包含页码 例如 Users List 5 将为您提供分页用户列表第 5 页上的用户 但是 我没有遇到一个页面必须列出两个单独的分页列表的情况 我该如何使用 ASP NET MVC 来
  • 如果我在 Bootstrap 3 中使用 .container-fluid,这是否意味着我需要使用网格类?

    我读过一些关于什么的答案 container and container fluid是 但我缺少的很简单 如果我使用 container fluid 我是否使用 col xs 6 col md 9 等列类 resize 和 containe
  • iOS 上的 ZBar 内存泄漏?

    我对 ZBar 扫描性能非常满意 但是如果这很重要的话 我在 ARC 下运行的项目上遇到了一个大问题 也就是说 似乎存在严重的内存泄漏 并且随着 readerView 的每次新显示 该泄漏呈指数级上升 在大约 10 倍的内存使用量开始呈指数
  • Deno 允许所有权限

    我经常发现自己在使用 Deno 时至少输入两到三个权限选项 deno run allow net allow read allow env app ts 有一种方法可以逃避显式权限 您可以使用 allow all或短选项 A允许所有权限 请
  • 删除与 ember-data 关联的模型

    我有两个模型 App User DS Model create comments DS hasMany App Comment App Comment DS Model create user DS belongsTo App User 当
  • 我如何在Python中获取Postgresql中的数据库列表

    我想获取所有数据库的列表Postgresqlpython 列表中的服务器 基本上我想在另一个数据库中创建它们 但我无法得到它 这就是我尝试过的 config read host psql 002 database tesdb user pg
  • Inno Setup 循环遍历文件并注册每个 .NET dll

    我正在使用 Inno Setup 创建一个安装文件 其中我需要使用 regasm exe 文件注册未知数量的 net dll 我知道我可以使用以下代码来注册 net dll Run Filename dotnet20 RegAsm exe
  • 通过 j2me 应用程序发送电子邮件

    我正在使用 j2me lwuit 构建应用程序 我需要从该应用程序发送电子邮件 为了使您的应用程序更小 我建议通过SocketConnection 对于小型电子邮件 这应该非常简单 SocketConnection connection S
  • 作为页面登录时 Facebook Like 按钮“中断”

    我的页面上有一个 Facebook 的 赞 按钮 并且运行良好 但是 当访问者作为 Facebook 的 页面 登录时 它会包含一张照片并破坏了我的设计 我想这是因为主页不允许点赞 我几乎有一个像这样的 iframe http develo
  • 如何将逗号分隔值的字符串解析为haskell中的字符串列表?

    所以如果我有一个字符串 this is a story all about how 到其中的单词列表中 this is a story all about how 作为 ReadP String 的实例 我尝试了很多不同的方法 其中之一是
  • 匹配此 JSON 进行反序列化的模型,带有破折号的字段名称

    我正在尝试创建一个与此 JSON 结构的 JSON NET 反序列化相匹配的模型 第一项 190374 vid 190374 canonical vid 190374 portal id 62515 is contact true prof
  • 本地 JavaScript - 写入本地文件

    我有一些从本地 HTML 文件加载的 JavaScript 代码 无需通过网络服务器 即使用打开file 有没有办法可以使用此文件中的 JavaScript 代码写入本地文件 我知道跨站点限制不允许JavaScript中的很多东西 但这不是
  • 读取文件签名并区分 zip 文件和 docx 文件之间的区别

    我有一个上传例程 我将前几个字节读入数组并将其转换为十六进制字符串以获取文件签名 我一直在将前 4 个字节读入数组 一切似乎都很顺利 直到我遇到了 zip 文件和 docx 文件的问题 它们的前 4 个字节具有相同的签名 50 4b 03
  • 从函数而不是按钮命令调用 Tkinter 框架控制器

    所以我有以下内容 效果很好 import tkinter as tk class App tk Tk def init self args kwargs tk Tk init self args kwargs container tk Fr
  • 如何使用 Passport.js 的远程 NodeJS API 对客户端 Web 应用程序进行身份验证和授权

    如下图所示 我有一个独立的 API 项目在服务器上运行 端口为3001 我有一个 Web 应用程序在服务器上运行 端口为3002 端口上的API3001 拥有 Web 应用程序 和移动应用程序 获取和放置数据所需的所有 API 路由 包括身