node-red中有关用户Login鉴权的研究

freefree技术Resources

这篇内容可直接阅读,适合用于基础学习和Search引流。

node-red中有关用户Login鉴权的研究缩略图
🌐 This page is not yet available in English. Showing the Chinese version. Back to Chinese page.
本文目录
  1. 1. 前言
  2. 2. Openhttps
  3. 3. Edit器与Admin API的鉴权
  4. 4. 设置默认用户
  5. 5. Customization用户鉴权
  6. 6. 结语

前言

默认地,node-redEdit器可以被任何访问的用户Operation,包括修改节点,流data,重新部署流。
这种默认的部署方式只适用于运行在可靠的网络中。下面我就给大家介绍一下,在公网上部署node-red后,如何对其进行安全加固和权限验证。
主要分为三部分

  • Openhttps权限
  • 保护Edit器和admin api
  • 保护http节点和node-red的仪表盘

Openhttps

node-red默认是使用http来进行访问,如果要配置https访问,你需要在node-red的配置文件setting文件中配置一下https部分的内容
在配置文件中 https配置项可以是一个json静态data,也可以是一个函数。完整的配置参数事nodejs中http模块的配置 Click链接可以View到完整的配置

在该配置项中,至少要有二项需要返回或配置。

  • key PEMformat化后的密钥,Type可以是String 或Buffer
  • cert PEMformat化后的 Cert chain,Type可以是String 或Buffer

配置的例子

https: {
    key: require("fs").readFileSync('privkey.pem'),
    cert: require("fs").readFileSync('cert.pem')
},

如果你要配置成一个function的话,请记得将key与cert放到promise中,如下

https: function() {
    return new Promise((resolve, reject) => {
        var key, cert;
        // Do some work to obtain valid certificates
        // ...
        resolve({
            key: key
            cert: cert
        })
    });
}

如果你要在配置https后,自动refresh证书,并且不用重启node-red,node-red也是能做到的,需要nodejs在11之上,并且https必须配置成function,接着设置 httpsRefreshInterval,Type为一个数字,表示几小时内循环自动refresh。

Edit器与Admin API的鉴权

node-red的Edit器与Admin api支持两种Type的鉴权

  • 使用用户名 密码证书来进行鉴权
  • 使用任何OAuth/OpenID提供商来进行鉴权,如Twitter活GitHub。

基于用户名和密码的鉴权只需要在setting配置文件中配置即可
如下是一个配置示例

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        },
        {
            username: "george",
            password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
            permissions: "read"
        }
    ]
}

管理员可以配置多个用户。这些用户的Login及权限data都是写死的。包括Login的账号,密码,和权限。其中密码是使用bcrypt 算法Tools进行hash加密。
生成hash密码可以使用 node-red admin hash-pw(在node-red 1.1.0 之后)

使用OAuth/OpenID来进行授权

dminAuth: {
    type:"strategy",
    strategy: {
        name: "twitter",
        label: 'Sign in with Twitter',
        icon:"fa-twitter",
        strategy: require("passport-twitter").Strategy,
        options: {
            consumerKey: TWITTER_APP_CONSUMER_KEY,
            consumerSecret: TWITTER_APP_CONSUMER_SECRET,
            callbackURL: "http://example.com/auth/strategy/callback",
            verify: function(token, tokenSecret, profile, done) {
                done(null, profile);
            }
        },
    },
    users: [
       { username: "knolleary",permissions: ["*"]}
    ]
}

配置项详解:
name: 策略名称
lable/icon:在Login页显示的信息
strategy:需要使用到的库
options:根据strategy来进行配置,需要使用的参数
verify:验证函数,最后使用done函数将用户Resources向下传递

设置默认用户

如果你想要限定没有Login时,node-red的一些权限,可以使用设置默认用户的方式来实现
配置一个默认用户,并配置其对于的权限。权限可以是All,也可以是只读。
如下是一个例子

adminAuth: {
    type: "credentials",
    users: [ /* list of users */ ],
    default: {
        permissions: "read"
    }
}

除来 * 和 read 两种大模块的权限限定外,管理员还可以配置Admin API
例如为了获取当前流的信息,用户将会要求 flow.read权限。如果要更新流信息,他们需要使用flows.write权限。

Customization用户鉴权

目前介绍的用户鉴权都是硬Coding的鉴权,写死用户data及对于的权限。这种方式不方便扩展,所以node-red又提供了另一种方式,Customization用户鉴权。以下是实现步骤
创建 <node-red>/user-authentication.js 按照以下模版编写授权代码

module.exports = {
   type: "credentials",
   users: function(username) {
       return new Promise(function(resolve) {
           // Do whatever work is needed to check username is a valid
           // user.
           if (valid) {
               // Resolve with the user object. It must contain
               // properties 'username' and 'permissions'
               var user = { username: "admin", permissions: "*" };
               resolve(user);
           } else {
               // Resolve with null to indicate this user does not exist
               resolve(null);
           }
       });
   },
   authenticate: function(username,password) {
       return new Promise(function(resolve) {
           // Do whatever work is needed to validate the username/password
           // combination.
           if (valid) {
               // Resolve with the user object. Equivalent to having
               // called users(username);
               var user = { username: "admin", permissions: "*" };
               resolve(user);
           } else {
               // Resolve with null to indicate the username/password pair
               // were not valid.
               resolve(null);
           }
       });
   },
   default: function() {
       return new Promise(function(resolve) {
           // Resolve with the user object for the default user.
           // If no default user exists, resolve with null.
           resolve({anonymous: true, permissions:"read"});
       });
   }
}

最后在setting文件的adminAuth中配置
adminAuth: require("./user-authentication")

结语

以上就是本篇的All内容,这些内容对于想要精细化控制node-red的权限尤为重要,特别是要将其改造为一个多租户system时。 谢谢观看。

来源/Tools信息 —— 点击展开
来源 Modbus Chinese Network(modbus.cn) —— China leadingModbus通信协议技术社区 Category Node-RED 字数 3411 字 · 阅读约 9 分钟 更新 2023-02-01 永久链接 https://www.modbus.cn/11524.html
Recommended Tool: Modbus Debug Assistant WeChat Mini Program
Modbus Chinese Network官方推出的Modbus DebuggingTools,支持 Modbus RTU/TCP 实时通信debug、register读写、线圈控制、data监控和message分析。 无需安装,微信Search「Modbus DebuggingAssistant」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
RelatedTags
把这篇Resources用于真实项目?

进入Tools中心进行messageParse、CRC verification和设备debug,或Submit requirements获取选型与接入建议。

工程师member

把这篇文章变成可执行的debugResources

开通后可使用高级messageParse、Resources包Download、Code Example、工程案例和优先Technical Support,适合真实项目交付。

高级Tools不限次
Resources包与代码包
Complete Engineering Case Library
优先Technical Support入口

发表回复

您的邮箱address不会被公开。 必填项已用 * 标注