为什么app.logout()在Feathers服务器上不调用/ authentication服务的remove方法?

时间:2019-07-03 11:02:38

标签: feathersjs feathers-authentication

我在客户端中使用以下代码:

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 :(得分:0)

如果使用的是JWT身份验证方法,则默认情况下,服务器不保存已身份验证用户的列表。服务器在每个请求中反序列化令牌并加载用户对象。

如果要实现注销机制,则必须创建一个黑名单,以保留已注销的用户。 Here是对该主题的很好的详细说明。

我认为Feathers.js尚未实现黑名单机制。实际上,官方documentation表示remove服务的app.service('authentication')方法用于实现自定义黑名单。

在这种情况下,您应该保留一个用户的单例黑名单,然后在remove方法之后将其插入该列表。用户登录.create()时,您应尝试从该黑名单中删除该用户。最后一件事是阻止黑名单中的用户访问除登录操作以外的任何服务。

所有这些过程都会激发用户在浏览器选项卡中注销时,该用户将被列入黑名单。然后,另一个选项卡尝试使用自己的令牌访问另一个服务时,该用户将无法访问任何服务,因为他已经在黑名单中。