섹션 2: 사용자 역할 및 관리 - FeathersJS


백엔드 - FeathersJS
본고는 주로 백엔드를 주목한다. FeathersJS framework와FeatherJS 생태계의 몇 가지 상호 보완 라이브러리인 feathers-authentication-managementfeathers-permissions를 이용했다.

FeatherJS 시작
Getting started FeathersJS를 사용하면 매우 간단합니다.구성 가능한 여러 옵션에 따라 애플리케이션을 생성하는 CLI 가 있습니다.

Note: I would advise against copying/pasting any code snippets and instead go directly to the repository to view the code. Due to the amount of code involved, I've omitted lines of code in this article for brevity. As this is not written as a tutorial, please view the repository if you want to create a similar project.



FeathersJS 개요
Feathers는 좋은 예getting started guide가 있기 때문에 저는 여러분들이 그들의 안내서를 읽어서 더욱 깊은 개술을 얻도록 강력히 건의합니다.나는 이 초보자를 위해 맞춤형으로 제작한 몇 가지 기능을 중점적으로 소개할 것이다.

프로비저닝
깃털이 있으면 configuration 상당히 간단하다.이것은 NODE_ENV 환경 변수를 사용하여 사용할 설정을 결정합니다.예를 들어 NODE_ENV=prod인 경우 default.jsonprod.json 구성 설정을 결합합니다.서비스의 올바른 실행에 필요한 값을 확보하기 위해 설정 파일에 설정을 추가할 것입니다.

로그인 시
사용자가 로그인할 때의 시간 스탬프를 저장하고 싶어서 app.on('login'...) 연결 이벤트를 사용했습니다.
  app.on('login', (data) => {
    data.user['lastLoggedIn'] = new Date();
    app.service('users').patch(data.user._id, data.user);
  });

깃털 서비스
Feathers 서비스는 feathers generate service 명령줄 생성기를 사용하여 생성할 수 있습니다.이것은 사용자의 요구에 따라 서비스를 설정하는 알림 시퀀스를 시작합니다.Services in Feather는 클래스, 갈고리 및 서비스 정의로 구성됩니다.

깃털 우체부
전자메일을 보내기 위해 서버는 feathers-mailer 라이브러리를 사용합니다. 이것은 nodemailer의 패키지입니다.이 이니시에이터의 경우 AWS SES로 구성했지만 아무 때나 사용할 수 있습니다supported transport.AWS를 구성하려면 AWS 계정에 다음 구성 키가 필요합니다.
{
  "smtp_user": "aws_smtp_user",
  "smtp_pw": "aws_smtp_pw",
  "smtp_host": "aws_smtp_host"
}
${env}.json 프로파일이나 default.json 프로파일에 추가할 수 있습니다.
feathers cli를 사용하여 맞춤형 서비스를 만들고 AWS SES 전송으로 구성했습니다.email service는 어떻게 설정하는지 보여 줍니다.
module.exports = function (app) {
  app.use(
    '/email',
    Mailer(
      smtpTransport({
        host: app.get('smtp_host'),
        secure: true,
        auth: {
          user: app.get('smtp_user'),
          pass: app.get('smtp_pw'),
        },
      })
    )
  );
};
전자메일 서비스가 설정되면 피더스 인증 관리 라이브러리에 등록할 때 전자메일을 검증할 수 있습니다.

Coming Soon: I'll be writing a separate article about creating beautiful templated emails to send out using this service.



인증 관리
Feathers Authentication Management는 사용자 등록 시 유용한 몇 가지 기능이 활성화된 라이브러리입니다.
  • 이메일 인증
  • 비밀번호 재설정
  • 비밀번호 업데이트
  • 검증을 통해 새 이메일로 업데이트
  • 사용자 워크플로에 추가하기 위해 만들었습니다auth-management service.
    const authManagement = require('feathers-authentication-management');
    const hooks = require('./auth-management.hooks');
    const notifier = require('./notifier');
    
    module.exports = function (app) {
      app.configure(authManagement(notifier(app)));
    
      // Get our initialized service so that we can register hooks
      const service = app.service('authManagement');
    
      service.hooks(hooks);
    };
    
    notifier 전송 요청을 처리하고 요청에서 받은 action에 따라 사례를 처리한다.resendVerifySignup 사례는 사용자에게 인증 이메일을 다시 보냅니다.
    function sendEmail(email) {
        return app
          .service('email')
          .create(email)
          .catch((err) => {
            console.log('Error sending email', err);
          });
      }
    
    switch (type) {
      case 'resendVerifySignup':
      //sending the user the verification email
      tokenLink = getLink('verify', user.verifyToken);
      email = {
        from: FROM_EMAIL,
        to: user.email,
        subject: 'Verify Email',
        html: tokenLink,
      };
      return sendEmail(email);
    }
    
    이 서비스가 올바른 전자메일을 생성하는 데 필요한 모든 정보를 가지고 있는지 확인하기 위해 다음 설정 키를 ${env}.json 파일에 추가합니다.
    {
      "from_email": "[email protected]",
      "client_url": "http://localhost:8080",
      "api_url": "http://localhost:3030/"
    }
    
    갈고리는 각종 조작 전과 후에 사용자 기록을 갱신하는 데 쓰인다.
    module.exports = {
      before: {
        create: [
          // after user is created, add verification fields to user record
          verifyHooks.addVerification(),
        ],
        patch: [
          authenticate('jwt'),
          iff(
            // if request is from external provider
            isProvider('external'),
            // do not allow the following fields to be updating
            preventChanges(
              true,
              'email',
              'isVerified',
              'verifyToken',
              'verifyShortToken',
              'verifyExpires',
              'verifyChanges',
              'resetToken',
              'resetShortToken',
              'resetExpires'
            ),
          ),
        ],
        // don't allow external requests to delete the user
        remove: [disallow('external')],
      },
    
      after: {
        all: [
          // prevent leak of these user information fields
          protect(
            'password',
            'verifyToken',
            'updatedAt',
            'createdAt',
            'verifyShortToken',
            'verifyExpires',
            'resetToken',
            'resetExpires',
            'verifyChanges',
            '__v'
          ),
        ],
        create: [
          // after a user is created, send the user an email to verify email
          (context) => {
            accountService(context.app).notifier(
              'resendVerifySignup',
              context.data
            );
          },
          // remove the user verification fields before returning user as part of request
          verifyHooks.removeVerification(),
        ],
      },
    };
    
    사용자가 작성되면 인증 필드가 추가됩니다(요청의 일부로 반환되기 전에 삭제됨).보안 목적으로 필드도 외부 요청을 통해 직접 업데이트해서는 안 된다.사용자를 만들면 다른 갈고리는 사용자의 검증 필드를 삭제하기 전에 사용자에게 검증 전자메일을 보냅니다.

    깃털 권한
    마지막으로 백엔드는 수동으로 만든 관리자 계정feathers-permissions을 사용하여 역할 개념을 실현한다.계정은 기본적으로 몬고우스 모델에 정의된 '내빈' 역할입니다. (다음 글에서 소개할 것입니다.)
    관리자 역할은 사용자를 다른 역할로 업데이트할 수 있습니다.이 초보자는 게스트(기본 역할), 사용자, 관리자, 비활성 등 네 가지 역할을 정의합니다.관리자가 사용자를 비활성화하면 해당 역할이 비활성으로 업데이트됩니다.
    갈고리는 사용자 역할 업데이트와 같은 특정 관리 기능에 대한 접근을 제어하고 제한하는 데 사용된다.
    iff(
       checkPermissions({
         roles: ['super_admin', 'admin'],
         field: 'permissions',
         error: false,
       }),
       validate.mongoose(adminUpdateSchema, joiOptions)
    ),
    iff((context) => !context.params.permitted, [
       // ensure user only updates their own record
       setField({
          from: 'params.user._id',
          as: 'params.query._id',
       }),
       validate.mongoose(updateSchema, joiOptions),
    ]),
    
    위의 갈고리는 사용자가 관리자인지 확인하고, 만약 그렇다면 승인된 관리자 모드(더 많은 필드 업데이트 허용)에 따라 데이터를 검사합니다.사용자가 관리자가 아닌 경우 승인된 사용자 모드로만 레코드를 업데이트해야 합니다.
    권한은 한층 더 세분화할 수 있다.자세한 내용은 documentation를 참조하십시오.나는 이 요리를 아주 간단하게 만들었다.

    추가 자원
    특히 전자메일 검증 강좌를 작성한 저자들에게 경의를 표합니다.
  • Setting up Email Verification in FeathersJS
  • How to set up email verification in FeathersJS

  • 내가 뭘 놓쳤나?
    백엔드 코드가 끝났습니다.만약 어떤 문제, 의견 또는 건의가 있으면 저에게 알려 주세요.다음 글은 MongoDB 설정을 되돌아보겠습니다!

    좋은 웹페이지 즐겨찾기