我在客户端中使用以下代码:
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')
}
我的问题如下:
此操作后在第一个选项卡中注销是可以的,但是浏览器不会将授权服务的删除发送到服务器。我没有在浏览器网络活动
中看到它因此,我在浏览器第二个选项卡中的应用仍处于登录状态。
如何为浏览器的所有标签注销,我的应用在哪里打开?
答案 0 :(得分:0)
如果使用的是JWT身份验证方法,则默认情况下,服务器不保存已身份验证用户的列表。服务器在每个请求中反序列化令牌并加载用户对象。
如果要实现注销机制,则必须创建一个黑名单,以保留已注销的用户。 Here是对该主题的很好的详细说明。
我认为Feathers.js尚未实现黑名单机制。实际上,官方documentation表示remove
服务的app.service('authentication')
方法用于实现自定义黑名单。
在这种情况下,您应该保留一个用户的单例黑名单,然后在remove方法之后将其插入该列表。用户登录.create()
时,您应尝试从该黑名单中删除该用户。最后一件事是阻止黑名单中的用户访问除登录操作以外的任何服务。
所有这些过程都会激发用户在浏览器选项卡中注销时,该用户将被列入黑名单。然后,另一个选项卡尝试使用自己的令牌访问另一个服务时,该用户将无法访问任何服务,因为他已经在黑名单中。