Добавьте JWT ко всем запросам GraphQL / AppSynce при входе в AWS Amplify - PullRequest
0 голосов
/ 01 мая 2018

У меня есть приложение AppSync, которое использует аутентификацию IAM (подключается к Cognito User и пулам удостоверений). При использовании аутентификации IAM $ event.context.identity - это объект Cognito Identity Pool, в котором нет информации о пользователе (без имени пользователя, имени пользователя, адреса электронной почты и т. Д.)

Я считаю, что мне нужно передавать JPT UserPoolID (который доступен на стороне клиента через Amplify) в AppSync всякий раз, когда я делаю запрос graphQL. Но я не смог понять, как добавить JWT (предположительно) в заголовок.
-------------РЕДАКТИРОВАТЬ-------------- AppSyncClient является клиентом (построен на Apollo). App.js выглядит как

import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
import appSyncConfig from "./AppSync";
import { ApolloProvider } from "react-apollo";
import AWSAppSyncClient from "aws-appsync";
import { Rehydrated } from "aws-appsync-react";
import { Auth } from 'aws-amplify'
import AWS from'aws-sdk';

import AllPosts from './Components/AllPosts';
// more routes

const Home = () => (
  <div > <AllPosts /> </div>
);

const App = () => (
  <div> <Router> <div> 
        <Route exact={true} path="/" component={Home} /> 
        //more routes
   </div> </Router> </div>
);

const client = new AWSAppSyncClient({
  url: appSyncConfig.graphqlEndpoint,
  region: appSyncConfig.region,  
  auth: {
    type: appSyncConfig.authenticationType,  //AWS_IAM
    apiKey: appSyncConfig.apiKey,  
    credentials: () => Auth.currentCredentials(),
});

const WithProvider = () => (
  <ApolloProvider client={client}>
    <Rehydrated>
      <App />
    </Rehydrated>
  </ApolloProvider>
);

export default WithProvider;

1 Ответ

0 голосов
/ 01 мая 2018

Предполагая, что вашим клиентом GraphQL является Apollo, ключом является использование setContext в качестве вашего authLink из библиотеки apollo-link-context.

Пример:

import ApolloClient from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { setContext } from 'apollo-link-context';
import { HttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { withClientState } from 'apollo-link-state';
import { clientState } from './clientState';
import { Auth } from 'aws-amplify';

const cache = new InMemoryCache();

//TODO:  need to cache token
const authLink = setContext((request) => new Promise( (resolve, reject) => {
  Auth.currentSession()
  .then(session => {
    const token = session.idToken.jwtToken;
    resolve({
      headers: { Authorization: token }
    });
  })
}));

const stateLink = withClientState({ ...clientState, cache });

const client = new ApolloClient({
  cache,
  link: ApolloLink.from([
    authLink,
    stateLink, //near end but before HttpLink
    new HttpLink({uri: process.env.REACT_APP_GRAPHQL_ENDPOINT })
  ])
});

export default client;

(код от: https://github.com/aws/aws-amplify/issues/434#issuecomment-372349010)

...