node - red 에서의 사용자 로그인 인증에 관한 연구

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

node - red 에서의 사용자 로그인 인증에 관한 연구

前言

默认地,node-red편집器可以被任何访问的用户操作,包括修改节点,流데이터,重新部署流。
这种默认的部署방식只适用于运行在可靠的네트워크中。下面我就给大家介绍一下,在公网上部署node-red后,如何对其进行安全加固和权限验证。
主要分为三部分

  • 开启https权限
  • 保护편집器和admin api
  • 保护http节点和node-red的仪表盘

开启https

node-red默认是使用http来进行访问,如果要설정https访问,你需要在node-red的설정文件setting文件中설정一下https部分的콘텐츠
在설정文件中 https설정项可以是一个json静态데이터,也可以是一个函数。完整的설정매개변수事nodejs中http模块的설정 클릭链接可以보기到完整的설정

在该설정项中,至少要有二项需要返回或설정。

  • key PEM형식化后的密钥,유형可以是String 或Buffer
  • cert PEM형식化后的 Cert chain,유형可以是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后,自动새로고침证书,并且不用重启node-red,node-red也是能做到的,需要nodejs在11之上,并且https必须설정成function,接着设置 httpsRefreshInterval,유형为一个数字,表示几小时内循环自动새로고침。

편집器与Admin API的鉴权

node-red的편집器与Admin api支持两种유형的鉴权

  • 使用用户名 密码证书来进行鉴权
  • 使用任何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"
        }
    ]
}

管理员可以설정多个用户。这些用户的로그인及权限데이터都是写死的。包括로그인的账号,密码,和权限。其中密码是使用bcrypt 算法도구进行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:在로그인页显示的信息
strategy:需要使用到的库
options:根据strategy来进行설정,需要使用的매개변수
verify:验证函数,最后使用done函数将用户자료向下传递

设置默认用户

如果你想要限定没有로그인时,node-red的一些权限,可以使用设置默认用户的방식来实现
설정一个默认用户,并설정其对于的权限。权限可以是전체,也可以是只读。
如下是一个例子

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

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

自定义用户鉴权

目前介绍的用户鉴权都是硬编码的鉴权,写死用户데이터及对于的权限。这种방식不方便扩展,所以node-red又提供了另一种방식,自定义用户鉴权。以下是实现步骤
创建 <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")

结语

以上就是本篇的전체콘텐츠,这些콘텐츠对于想要精细化控制node-red的权限尤为重要,特别是要将其改造为一个多租户系统时。 谢谢观看。

相关标签
실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注