我正在使用official NuxtJS Auth Routes example通过express-sessions执行登录,它工作得很好
app.js文件
const express = require('express')
const session = require('express-session')
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
// session middleware
app.use(
session({
secret: 'super-secret-key',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 60000 }
})
)
// Create express router
const router = express.Router()
// Transform req & res to have the same API as express
// So we can use res.status() & res.json()
router.use((req, res, next) => {
Object.setPrototypeOf(req, app.request)
Object.setPrototypeOf(res, app.response)
req.res = res
res.req = req
next()
})
// Add POST - /api/login
router.post('/login', (req, res) => {
if (req.body.username === 'demo' && req.body.password === 'demo') {
req.session.authUser = { username: 'demo' }
return res.json({ username: 'demo' })
}
res.status(401).json({ message: 'Bad credentials' })
})
// Add POST - /api/logout
router.post('/logout', (req, res) => {
delete req.session.authUser
res.json({ ok: true })
})
app.use('/api', router)
module.exports = app问题是,当cookie过期时,用户仍然在前端登录。如果他们访问一个端点,他们就会注销,因为我猜调用nuxtServerInit会取消用户的设置
store/index.js
import axios from 'axios'
export const state = () => ({
authUser: null
})
export const mutations = {
SET_USER(state, user) {
state.authUser = user
}
}
export const actions = {
// nuxtServerInit is called by Nuxt.js before server-rendering every page
nuxtServerInit({ commit }, { req }) {
if (req.session && req.session.authUser) {
commit('SET_USER', req.session.authUser)
}
},
async login({ commit }, { username, password }) {
try {
const { data } = await axios.post('/api/login', { username, password })
commit('SET_USER', data)
} catch (error) {
if (error.response && error.response.status === 401) {
throw new Error('Bad credentials')
}
throw error
}
},
async logout({ commit }) {
await axios.post('/api/logout')
commit('SET_USER', null)
}
}发布于 2019-11-11 13:19:18
如果没有websocket等待注销通知,您将无法在到期时立即注销用户。这就是为什么它会一直等待,直到您再次尝试导航。如果想要立即注销用户,可以创建一个Websocket,该套接字在cookie过期时等待来自服务器的信号。
https://github.com/nuxt/nuxt.js/tree/dev/examples/with-sockets
但是,这是一个特定的用例。大多数网站只是等待用户尝试另一个需要检查令牌过期的操作,然后采取适当的措施。
可以通过跟踪商店中前端的过期时间来完成此操作的简化版本。然后,您可以使用computed属性来检查用户剩余时间的不断递减倒计时。当它达到零时,你就可以运行你的突变了。
发布于 2019-11-20 14:24:03
发布于 2019-11-12 11:02:06
非常接近这里的答案。这个想法是在用户发布到登录路由时设置req.session.expires。目前的问题出在异步登录方法内部,如何访问req.session?
这是server/index.js文件
// Add POST - /api/login
router.post('/login', (req, res) => {
if (req.body.username === 'demo' && req.body.password === 'demo') {
req.session.authUser = { username: 'demo' }
req.session.expires = req.session.cookie.expires.getTime()
return res.json({ username: 'demo' })
}
res.status(401).json({ message: 'Bad credentials' })
})这是store/index.js文件
export const actions = {
// nuxtServerInit is called by Nuxt.js before server-rendering every page
nuxtServerInit({ commit }, { req }) {
if (req.session && req.session.authUser) {
commit('SET_USER', req.session.authUser)
}
if (req.session && req.session.expires) {
commit('SET_EXPIRES', req.session.expires)
}
},
// How do you get req.session.expires HERE???
async login({ commit }, { username, password }) {
try {
const response = await this.$axios.post('/api/login', {
username,
password
})
console.log(response, response.request, response.request.session)
commit('SET_USER', response.data)
} catch (error) {
if (error.response && error.response.status === 401) {
throw new Error('Bad credentials')
}
throw error
}
},
async logout({ commit }) {
await this.$axios.post('/api/logout')
commit('SET_USER', null)
commit('SET_EXPIRES', null)
}
}https://stackoverflow.com/questions/58795369
复制相似问题