У меня есть кое-что, что работает, поэтому я решил опубликовать здесь, на случай, если другим людям будет полезно иметь несколько указателей.
Основная идея:
- На стороне Nuxt используйте промежуточное ПО, чтобы проверить, вошли ли мы на сервер до того, как произойдет отрисовка остальной части страницы.
- На стороне платформы API настройте аутентификацию JWT согласно здесь . Это дает нам токен, который мы будем отправлять на запросы API для их проверки.
В клиенте Nuxt вам необходимо хранилище, которое обрабатывает состояние входа в систему. Вот моя текущая версия WIP (поэтому я не утверждаю, что это отличный код):
import axios from 'axios'
export default function({ store, redirect }) {
store.commit('security/AUTHENTICATING')
// Add token header if we have it.
const token = store.state.security.token
if (token) {
axios.defaults.headers.common.Authorization = 'Bearer ' + token.toString()
} else {
axios.defaults.headers.common.Authorization = null
}
// Now make an API call to see if we're logged in.
return axios
.get(process.env.API + '/locations')
.then(response => {
// We're logged in. No need to save the token - it's already in the store.
store.commit('security/AUTHENTICATING_SUCCESS', null)
})
.catch(() => {
// We're not logged in.
if (store.state.security.isAuthenticated) {
// ...but we thought we were. Correct our misapprehension.
store.commit('security/LOGOUT')
}
// Ask them to log in.
return redirect('/login')
})
}
Затем настройте промежуточное программное обеспечение:
import axios from 'axios'
export default function({ store, redirect }) {
store.commit('security/AUTHENTICATING')
// Add token header if we have it.
const token = store.state.security.token
if (token) {
axios.defaults.headers.common.Authorization = 'Bearer ' + token.toString()
} else {
axios.defaults.headers.common.Authorization = null
}
// Now make an API call to see if we're logged in.
return axios
.get(process.env.API + '/locations')
.then(response => {
// We're logged in. No need to save the token - it's already in the store.
store.commit('security/AUTHENTICATING_SUCCESS', null)
})
.catch(() => {
// We're not logged in.
if (store.state.security.isAuthenticated) {
// ...but we thought we were. Correct our misapprehension.
store.commit('security/LOGOUT')
}
// Ask them to log in.
return redirect('/login')
})
}
Я еще не совсем доволен этим, и я уверен, что могло бы быть и лучше. Но что-то в этом роде похоже на то, что оно сделает свою работу.