HttpOnly куки не отправляются в запросе - PullRequest
0 голосов
/ 21 июня 2019

Я знаю, что использование файлов 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

Здесьэто заголовок

enter image description here

Вот промежуточное ПО авторизации, которое всегда поражает 'Недействительно или отсутствует'

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

И заголовок дляэто когда я проверяю это enter image description here

Извините, если я пропустил что-то, что стоит поделиться.

Будет ли это как-то связано со всем, что запускается локально?Если да, при развертывании, какие шаги я должен предпринять, чтобы убедиться, что он по-прежнему работает?

Существуют ли другие безопасные способы, которые я мог бы использовать для обработки пользовательских входов, которые я могу авторизовать на API?

...