Skip to main content

06 Авторизация и Сессии

Sessions

Сессии в morphcluster опциональны, но без них FastifyRest сможет принимать только анонимные запросы. Сервис Sessions использует PostgreSQL. Вначале, добавьте npm пакет:

npm install ./corelibs/sessions

Инициализация сервиса:

import {Sessions,Auth} from '@morphcluster/sessions'
...
//Добавление Sessions к хосту
host.addService(new Sessions( host, {
  "pg": {
    //uri для подключения postgresql
    "uri": "postgresql://postgres:123@127.0.0.1:5432/carabi",
    //schema из postgresql
    "schema": "logger",
    //timezone pg клиента
    "timezone": "Europe/Moscow"
  }
} ))
//Базовый сервис авторизации
//Авторизирует, как администратора в любом workspace
host.addService(new Auth( host, {
  //Логин и пароль администратора
  "admin": {
    "login" : "admin",
    "password" : "123"
  }
} ))

Написание авторизации

Чтобы создать свою авторизацию создайте новый сервис:

import {Sessions} from "@morphcluster/sessions"
import {ComplexError, ServiceRequire} from "@morphcluster/core"

export default class MyAuth extends ServiceRequire {
  constructor (host) {
    super(host)
    /** @type {Sessions} */
    this.Sessions = null
    this.requirements = ["Sessions"]
    this.addRequest({
      name : 'password',
      description: 'Авторизация',
      request: { ... },
      anonymous: true,
      "http":"POST"
  	})
  }

	async password(req, workspace, log) {
    //Напишите валидацию и получение данных
    ...      
    let createInfo = {
      //UserId
      userId: 1,
      //Логин
      login: "user",
      //Является ли администратором
      isAdmin: false
    }
    let token = await this.Sessions.create(createInfo, workspace)
    //Создание сессии вернет токен сессии
    return token
}

Передача сессии в запросе

Если пользователь авторизирован, FastifyRest вместе с входными параметрами передаст объект session, передайте этот параметр в запросы, которые будете вызывать, если хотите чтобы сохранилось привязка к пользователю.

async hello(request, workspace, log) {
  if (request.session) console.log("Hello "+request.session.login)
  else console.log("Hello anonymous")
  //Передача сессии при вызове другого сервиса
  await this.Test2.DoSomething({ session: request.session }, workspace, log )
}

Постоянная сессия

Постоянная сессия не будет автоматически очищатся и может быть использована, как API ключ или в сценарии, когда авторизация постоянна. Отмемтить сессию в постоянную можно запросом Session.setPermanent. В админ панели эта возможность есть в разделе "Сессии" (кнопка ключа, справа от сессии)