Итак, в настоящее время у меня есть конечная точка API серверной части api / user / login. Когда пользователь успешно входит в систему, я отправляю response.header
обратно клиенту и внутри этого заголовка я включаю токен JWT следующим образом:
router.post('/login', async (request, response) => {
// validate
const {error} = loginValidation(request.body)
if (error) return response.status(400).send(error.details[0].message)
const {email, password} = request.body
// check if email doesn't exist
const user = await pool.query('SELECT id, email, password FROM users WHERE email = $1 LIMIT 1', [email])
if(user.rowCount == 0) return response.status(400).send('Wrong email or password')
// password is correct; move on to validating password
const id = user.rows[0].id
const storedEmail = user.rows[0].email
const storedPassword = user.rows[0].password
const validPass = await bcrypt.compare(request.body.password, storedPassword)
if(!validPass) return response.status(400).send('Wrong email or password')
// create and send token to client
const token = jwt.sign({_id: id}, "SOMESECRET")
response.header('auth-token', token).send(token)
})
В полезных данных JWT я сохраняю только идентификатор пользователя, когда пользователь пытается получить доступ к защищенному маршруту. Я запрашиваю пользователя из базы данных из JWT, который был в заголовке.
Мой вопрос: на клиенте, как только я получу JWT, как мне сохранить его, чтобы затем отправить это в будущем запросе api в качестве заголовка?
Кроме того, следует ли вместо этого хранить JWT как httpOnly cook ie? Как мне тогда использовать свои конечные точки API в других клиентах, таких как приложение iOS?
Я проверяю это так:
module.exports = function (request, response, next){
const token = request.header('auth-token')
if(!token) return response.status(401).send('Access Denied')
try {
const verifed = jwt.verify(token, "SOMESECRET")
request.user = verifed
next()
} catch(error){
response.status(400).send('Invalid Token')
}
}