我正在制作一个应用程序,我在其中使用JWT来维护会话。当任何新用户注册时,我向用户提供JWT令牌并将其存储在我的数据库和用户浏览器中。当用户注销时,我从浏览器和我的数据库中删除该令牌。
但我希望如果用户从多个设备登录,那么它将从一个设备注销,它也不会从其他设备注销。我该如何实现这一目标?
答案 0 :(得分:1)
首先,JWT不应该能够退出"但是要自动过期,这就是你应该设置短expiresIn
次的原因。
这是因为使用JWT,会话由客户端处理,注销用户不是服务器的责任,只是丢弃JWT的用户。
在您的情况下,我想您在允许用户之前检查数据库中是否存在JWT,因此,您只需要搜索并删除与该帐户关联的其他JWT。
但是如果你想让事情变得干净,那么接受JWT逻辑:只需缩短生命周期,等待它们过期。
答案 1 :(得分:1)
只需在数据库中使用令牌数组即可。每个设备将在令牌数组中拥有自己的令牌(当用户首次从新设备登录时,每个令牌都已添加到db),并且当用户从该设备注销时,只会删除令牌数组中的关联令牌。这是一个用户模式的示例:
import SwiftUI
struct ContentView: View {
@State var showsAlert = false
@State var errorMsg = "xxxx"
var body: some View {
Button(action: { self.showsAlert = true }) {
Text("press to test").padding(10).border(Color.black)
}.alert(isPresented: self.$showsAlert) {
Alert(title: Text(self.errorMsg),
message: Text("text message"),
primaryButton: Alert.Button.default(Text("yes"), action: {
print("---> yes")
}),
secondaryButton: Alert.Button.default(Text("no"), action: {
print("---> no")
}))
}
}
}