Как работает аутентификация cook ie с клиентом Apollo и graphQl от React - PullRequest
0 голосов
/ 11 апреля 2020

Я не могу понять, что я не так с сервером 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

Проверка ответа на любой запрос: Cheking the response for any request :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...