Почему app.logout () не вызывает метод удаления службы / authentication на сервере Feathers? - PullRequest
0 голосов
/ 03 июля 2019

Я использую следующий код в клиенте:

import frAppLib from '@feathersjs/feathers'
import frRestLib from '@feathersjs/rest-client'
import auth from '@feathersjs/authentication-client'
import { CookieStorage } from 'cookie-storage'
const cookieStorage = new CookieStorage()

const authOptions = {
  header: 'Authorization', // the default authorization header for REST
  prefix: '', // if set will add a prefix to the header value. for example if prefix was 'JWT' then the header would be 'Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOi...'
  path: '/authentication', // the server-side authentication service path
  jwtStrategy: 'jwt', // the name of the JWT authentication strategy 
  entity: 'user', // the entity you are authenticating (ie. a users)
  service: 'users', // the service to look up the entity
  cookie: 'feathers-jwt', // the name of the cookie to parse the JWT from when cookies are enabled server side
  storageKey: 'feathers-jwt', // the key to store the accessToken in localstorage or AsyncStorage on React Native
  storage: cookieStorage // Passing a WebStorage-compatible object to enable automatic storage on the client.
}

const feathers = frAppLib()

const apiUrl = process.env.NODE_ENV == 'production'
      ? 'http://localhost:3030' //TODO
      : 'http://localhost:3030'

const frRest = frRestLib(apiUrl)

feathers.configure(frRest.fetch(window.fetch))
feathers.configure(auth(authOptions))


export default feathers

И мой код выхода из системы:

import feathers from '@/feathers.js'
async logoutClick() {
  await feathers.logout()
  this.$router.replace('/login')
}

Моя проблема в следующем:

  • Я делаю логин в моем приложении
  • открыть мое приложение в другой вкладке браузера
  • вернуться на первую вкладку с моим приложением и нажать кнопку выхода

после этого в первой вкладке выход из системы в порядке, но браузер не отправляет удаление на авторизацию службы на сервер. Я не вижу его в Сетевая активность браузера

Итак, мое приложение во второй вкладке браузера все еще подключено.

Как сделать выход для всех вкладок браузера, где мое приложение открыто?

1 Ответ

0 голосов
/ 15 июля 2019

Если вы используете метод аутентификации JWT, то по умолчанию на сервере нет списка аутентифицированных пользователей. Сервер в каждом запросе десериализует токен и загружает объект пользователя.

Если вы хотите реализовать механизм выхода из системы, то вам нужно создать черный список , содержащий пользователей, вышедших из системы. Здесь - хорошее подробное объяснение предмета.

Я думаю, что в Feathers.js не реализован механизм внесения в черный список. На самом деле, в официальной документации говорится, что метод remove сервиса app.service('authentication') используется для реализации пользовательского черного списка.

В этом случае вы должны хранить одноэлементный черный список пользователей, а после метода удаления вставить в этот список. Когда пользователь входит в систему .create(), вы должны попытаться удалить пользователя из этого черного списка. Последнее, что нужно сделать, - запретить пользователю из черного списка доступ к любому сервису, кроме действий входа в систему, возможно.

Весь этот процесс провоцирует то, что когда пользователь выходит из системы на вкладке браузера, этот пользователь будет в черном списке. Затем на другой вкладке, когда он пытается получить доступ к другой службе с помощью своего собственного токена, этот пользователь не сможет получить доступ к какой-либо службе, поскольку он уже находится в черном списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...