Я знаю, что использование файлов cookie HttpOnly для хранения токена пользователя предпочтительнее, чем его сохранение в локальном хранилище, так как оно предотвращает попадание любого хитрого JavaScript в руки клиента.
Сервер API создает и отправляет файл cookieклиенту успешно, но когда вы делаете запрос, cookie не отправляется, и поэтому авторизация не происходит.
Вот логин пользователя на маршруте, который создает cookie
const jwt = require('jsonwebtoken')
const bcrypt = require('bcrypt')
const { User, validate } = require('@models/user')
const express = require('express')
const router = express.Router()
const fs = require('fs')
const path = require('path')
router.post('/', async (req, res) => {
// First Validate The HTTP Request
const { error } = validate(req.body)
if (error) {
return res.status(400).send(error.details[0].message)
}
// Now find the user by their email address
let user = await User.findOne({ email: req.body.email })
if (!user) {
return res.status(400).send('Incorrect email or password.')
}
// Then validate the Credentials in MongoDB match
// those provided in the request
const validPassword = await bcrypt.compare(req.body.password, user.password)
if (!validPassword) {
return res.status(400).send('Incorrect email or password.')
}
var signOptions = {
expiresIn: '30d',
algorithm: 'RS256'
}
var CurrentDate = new Date()
CurrentDate.setMonth(CurrentDate.getMonth() + 1)
var cookieOptions = {
httpOnly: true,
expiresIn: CurrentDate,
secure: true
}
const token = jwt.sign({ _id: user._id },
fs.readFileSync(path.resolve('src/routes/keys/private.key'), 'utf8'),
signOptions)
res.status(200).cookie('stickyAccessJwt', token, cookieOptions).send(`Successfully logged in as ${user.email} done`)
})
module.exports = router
Здесьэто заголовок
Вот промежуточное ПО авторизации, которое всегда поражает 'Недействительно или отсутствует'
const jwt = require('jsonwebtoken')
const fs = require('fs')
const path = require('path')
const { User } = require('@models/user')
let authorisation = (req, res, next) => {
console.log(req.cookies)
var userJWT = req.cookies.stickyAccessJwt
if (!userJWT) {
res.status(401).send('Invalid or missing authorization token')
} else {
// 2. There's a token; see if it is a valid one and retrieve the payload
var verifyOptions = {
expiresIn: '30d',
algorithm: ['RS256']
}
const userJWTPayload = jwt.verify(
userJWT,
fs.readFileSync(path.resolve('routes/keys/public.key'), 'utf8'),
verifyOptions)
if (!userJWTPayload) {
// Kill the token since it is invalid
res.clearCookie('stickyAccessJwt')
res.status(401).send('Kill the token since it is invalid')
} else {
// 3. There's a valid token...see if it is one we have in the db as a logged-in user
User.findOne({ '_id': userJWTPayload._id })
.then(function (user) {
if (!user) {
res.status(401).send('User not currently logged in')
} else {
console.log('Valid user:', user.email)
next()
}
})
}
}
}
exports.authorisation = authorisation
И заголовок дляэто когда я проверяю это
Извините, если я пропустил что-то, что стоит поделиться.
Будет ли это как-то связано со всем, что запускается локально?Если да, при развертывании, какие шаги я должен предпринять, чтобы убедиться, что он по-прежнему работает?
Существуют ли другие безопасные способы, которые я мог бы использовать для обработки пользовательских входов, которые я могу авторизовать на API?