Я пытаюсь увидеть все файлы cookie моего браузера, но заметил, что connect.sid
, созданный express-session
, не распознается различными библиотеками файлов cookie React, которые я пробовал, и мне интересно, почему это может быть? Это как-то заметно отличается от других установленных файлов cookie? Я что-то пропустил?
Вот как я настраиваю сервер на экспресс-стороне:
const express = require('express')
const next = require('next')
const bodyParser = require('body-parser')
const flash = require('connect-flash')
const routes = require('./controllers/routes')
// Passport
const passport = require('passport')
// Session Management
const session = require('express-session')
const redis = require('redis');
const RedisStore = require('connect-redis')(session);
const redisClient = redis.createClient({
host: process.env.REDIS_HOST || 'localhost',
port: process.env.REDIS_PORT || '6379',
url: process.env.REDIS_URL || ''
});
redisClient.on_connect("error", function(error){
console.error(error);
})
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
// Setting proxy for session handlng that is required for non-dev servers
if (!dev){
server.set('trust poxy', 1)
}
console.info(process.env.DB_DATABASE)
// Session Management
server.use(session({
store: new RedisStore({ client: redisClient }),
secret: process.env.SESSION_SECRET,
saveUninitialized: false,
resave: false,
cookie: {
secure: process.env.SESSION_SECURE || false,
httpOnly: true,
}
}))
// Request notifications. Must be used prior to routes
server.use(flash());
// Passport middleware
server.use(passport.initialize())
server.use(passport.session())
// Form body parsing
server.use(bodyParser.json())
server.use(bodyParser.urlencoded({extended: true}))
// server.use(helmet()) Enable at later date
// ExpressJS Routes
server.use(routes);
// mount the router on the app
// Any routes that aren't handled by ExpressJS are handled by NextJS
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.info('> Ready on http://localhost:3000')
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
Вот как я пытаюсь получить доступ к файлам cookie браузера (попытка с nookies и js-cookie) на интерфейсе React:
import {parseCookies} from 'nookies'
import Cookies from 'js-cookie'
const AppSession = ({ children }) => {
console.info(parseCookies())
console.info(Cookies.get())
console.info(Cookie.get())
}
export default AppSession;
Вот что запротоколировано:
{_ga: "GA1.1.630490776.1602939000"}
{_ga: "GA1.1.630490776.1602939000"}
Вот файлы cookie моего браузера:
Вы устанавливаете файл cookie сеанса connect.sid
с атрибутом httpOnly . См. Ограничить доступ к файлам cookie
Файл cookie с атрибутом HttpOnly недоступен для JavaScript
Document.cookie
API; он отправляется только на сервер. Например, файлы cookie, сохраняющие сеансы на стороне сервера, не обязательно должны быть доступны для JavaScript и должны иметь атрибут HttpOnly. Эта мера предосторожности помогает смягчить атаки межсайтового скриптинга (XSS).
Вот почему вы не можете получить или установить его с помощью пакета js-cookie
в браузере.