Я не могу за всю жизнь этой программы понять, почему этот файл cookie не сохраняется в браузере. Если я запустил игровую площадку graphql (которая находится на порту 4000, так же, как и сервер), идентификатор сеанса будет сохранен в браузере без проблем. У меня включен корсинг, так что это не должно блокировать это. Но если я отправлю запрос на вход с любого другого URL-адреса, он не сохранит его в браузере. Я пробовал несколько браузеров, и ни на одном из них это не сэкономит, и я пробовал регистрировать сеансы, чтобы убедиться, что я действительно их сохраняю. Любые идеи?
const { GraphQLServer } = require('graphql-yoga');
const session = require('express-session');
const bcrypt = require('bcryptjs');
const ms = require('ms');
const typeDefs = `
type Query {
isLoggedIn: Boolean!
}
type Mutation {
logIn(email: String!, password: String!): Boolean!
signUp(email: String!, password: String!): Boolean!
}
`
// mock mockDBbase
const mockDB = {};
const resolvers = {
Query: {
// is the user authenticated
isLoggedIn: (parent, args, ctx) => {
return ctx.session.isLoggedIn === true;
}
},
Mutation: {
// user can sign up for a new account
signUp: async (parent, { email, password }, ctx) => {
// if user is already in the DB
if (mockDB[email]) {
throw new Error('This user already exists, please log in.');
}
const saltRounds = 14; // roughly 1.5 secs on 2GHZ CPU
// store password in mock DB (replace with real DB)
mockDB[email] = {
// salt and hash pw
password: await bcrypt.hashSync(password, saltRounds),
};
return true;
},
// authenticates user into respective account
logIn: async (parent, { email, password }, ctx) => {
// grab user from DB
const user = mockDB[email];
if (user) {
// make sure pw matches
if (await bcrypt.compareSync(password, user.password)) {
// set user logged in flag
ctx.session.isLoggedIn = true;
return true;
}
throw new Error('User email or password is incorrect.');
}
throw new Error('User email or password is incorrect.');
}
}
}
// opts
const opts = {
port: 4000,
cors: {
credentials: true,
origin: "*"
}
};
// context
const context = req => ({
session: req.request.session,
});
// server
const server = new GraphQLServer({
typeDefs,
resolvers,
context,
});
const SESSION_SECRET = 'my-super-secret-secret';
server.express.set('trust proxy', 1) // trust first proxy
// session middleware
server.express.use(
session({
name: 'SSID',
// change this to randomly generate a secret
secret: SESSION_SECRET,
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: process.env.NODE_ENV === 'production',
maxAge: ms('1d'),
}
})
);
// start server
server.start(opts, () => console.info(`Server is running on http://localhost:${opts.port}`));
Так что я только что выяснил, в чем проблема. Проблема с площадкой Graphql все еще не решена. Даже если вы установите учетные данные для отправки с вашим запросом, они не будут отправляться вместе с вашим запросом. Он все равно попадет в api, но cookie не будет установлен. github.com/prisma/graphql-playground/issues/748





Итак, когда вы входите в систему, вы имеете в виду вход через мутацию graphql или вход через вход в сеанс в экспрессе? В любом случае, не могли бы вы опубликовать свой сетевой запрос и ответ? Я догадываюсь, в чем проблема.