Я не могу понять, что я не так с сервером Apollo и аутентификацией Apollo CLient с помощью GraphQl и React.
Со стороны сервера у меня есть это:
app.use(cors({
credentials: true,
origin: process.env.ALLOW_ORIGINS
}))
app.use(express.urlencoded({extended: true}))
//Express session: ? It provides the functionality to save session data in a storage that you choose
app.use(session({
genid: (req) => uuidv4(),
secret: process.env.SESSION_SECRECT,
resave: false,
saveUninitialized: true,
cookie: { path: '/', httpOnly: true, secure: false, maxAge: null }
}));
// ??? passport init
app.use(passport.initialize())
app.use(passport.session());
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req, res }) => {
const contextualized = buildContext({ req, res, User })
return contextualized
},
playground: {
settings: {
'request.credentials': 'same-origin',
},
},
})
И прекрасно работает с моими резольверами на детской площадке. Пока все хорошо.
Я могу сделать запрос от клиента и получить ответ как для мутаций, так и для запросов. Но пока я не могу сохранить повар ie в своем браузере. И волшебным образом это работает на детской площадке. Почему?
Это пример распознавателя входа в систему:
login : async (root, {email, password}, context) => {
const { user } = await context.authenticate('graphql-local', { email, password });
if (!user) throw new Error ('??♂️ There was a problem with the user o the password ?')
context.login(user); //?
return { user }
},
После этого все мои другие распознаватели обертываются защищенной функцией, которая запрашивает контекст аутентификация:
export function secure (func, sudo = false, admin = false, patron = false) {
return (root, args, context) => {
if (!context.req.user) throw new AuthenticationError('Unauthenticated')
// sudo only
if(sudo && rol !== 'sudo' ) throw new ForbiddenError('Protected by Super User')
if(admin && rol !== 'admin') throw new ForbiddenError('Protected by admin')
return func(root, args, context)
}
}
И вот как я настроил клиент Apollo в приложении реагирования:
const Client = new ApolloClient({
link: ApolloLink.from([
onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.log(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
),
);
if (networkError) console.log(`[Network error]: ${networkError}`);
}),
new HttpLink({
uri: process.env.REACT_APP_API_URL,
credentials: 'same-origin'
})
]),
cache: new InMemoryCache()
});
Проблема в клиентской части, потому что аутентификация работает в PlayGround , но не в реакции. Что я могу сделать?
Клиент: https://github.com/josuevalrob/CLE Сервер: https://github.com/josuevalrob/cle_api
Проверка ответа на любой запрос: