1

我有一个在配置 Redux 存储后立即运行的函数:

function configureApollo(store) {

  return new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {

    credentials: async () => {//...code that returns valid credentials}

    }
  })
}

我正在使用 react-cognito 来管理凭据,并将它们存储在 redux 商店中store.getState().cognito.creds。我的问题是,当凭据过期并需要刷新时,react-cognito 会导出一个函数,该函数performLogin返回一个“COGNITO_LOGIN”操作的承诺,该操作具有带有刷新凭据的有效负载。

我觉得我应该分派返回的操作并在更新后从商店中提取新凭据,但分派没有回调。

我想我可以从 COGNITO_LOGIN 操作中读取凭据,调度操作,而不必担心从 COGNITO_LOGIN 操作中读取凭据store.getState()

const resultAction = await performLogin(user, config, group);

store.dispatch(resultAction);
return new AWSCredentials(
  {
    accessKeyId: resultAction.creds.accessKeyId,
    secretAccessKey: resultAction.creds.secretAccessKey,
    sessionToken: resultAction.creds.sessionToken
  })

...但这似乎是错误的。如果 reducer 将凭证保存到 store 中出现错误怎么办?然后我的 AWSAppSyncClient 的凭证与我的应用程序的其余部分不同步。

这里有更好的方法吗?

4

1 回答 1

3

如果你使用这些aws-amplify库,那就容易多了。查看https://github.com/aws/aws-amplify#2-add-authentication-to-your-app的 README.md 中有关身份验证的部分,以使用它将 AWS Cognito 身份验证添加到您的应用程序. 之后,您可以通过以下方式配置 AWS AppSync 的凭证

import { Auth } from 'aws-amplify';
import AWSAppSyncClient from 'aws-appsync';
import { AUTH_TYPE } from 'aws-appsync/lib/link/auth-link'
import AppSync from './AppSync.js';

const client = new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {
        type: AUTH_TYPE.AWS_IAM,
        credentials: () => Auth.currentCredentials()
    },
    complexObjectsCredentials: () => Auth.currentCredentials(),
});
于 2018-05-09T02:10:53.733 回答