gpt4 book ai didi

react-native - 如何配置 Amplify 以使用多个 AppSync 端点?

转载 作者:行者123 更新时间:2023-12-04 01:48:38 24 4
gpt4 key购买 nike

我需要在 React Native 应用程序中支持经过身份验证和未经身份验证的 AppSync 请求。由于 AppSync 只允许每个 API 使用一种授权类型,因此我设置了两种 API:一种用于经过身份验证的用户(Cognito 用户池),一种用于访客(API key )。

我认为要完成这项工作,我需要有两个不同的 AWSAppSyncClient配置在同一个应用程序中。

  // authenticated user    
const appSyncAuthenticatedClient = new AWSAppSyncClient({
url: Config.APPSYNC_AUTHENTICATED_ENDPOINT,
region: Config.APPSYNC_REGION,
auth: {
type: 'AMAZON_COGNITO_USER_POOLS',
jwtToken: async () =>
(await Auth.currentSession()).getAccessToken().getJwtToken()
}
});

// guest
const appSyncUnauthenticatedClient = new AWSAppSyncClient({
url: Config.APPSYNC_UNAUTHENTICATED_ENDPOINT,
region: Config.APPSYNC_REGION,
auth: {
type: 'API_KEY',
apiKey: Config.APPSYNC_API_ID
}
});

然后根据他们是否登录来决定使用哪个
    Auth.currentAuthenticatedUser()
.then(user => this.appSyncRunningClient = appSyncAuthenticatedClient)
.catch(err => this.appSyncRunningClient = appSyncUnauthenticatedClient);

const App = props => {
return (
<ApolloProvider client={this.appSyncRunningClient}>
<Rehydrated>
<RootStack/>
</Root>
</Rehydrated>
</ApolloProvider>
);
};

export default App;

这失败了,因为 currentAuthenticatedUser返回一个 promise ,我被困在如何在应用程序的这个顶级实例化中解决一个 promise 。我还需要在身份验证事件期间更换此配置。

我可以通过什么方式动态选择和更改 ApolloProvider在启动和身份验证事件中配置?

最佳答案

这是目前不可能的。在正式支持顶级 await 之前,您应该创建两个 Apollo 客户端,一个用于 API,另一个用于 Cognito。

例如:在你的 App.js 中

export default function App(props) {
const [client, setClient] = useState(null);

useEffect(() => {
checkAuth()
}, []);

function checkAuth() {
Auth.currentSession().then(session => {
const token = session.getIdToken();
const jwtToken = token.getJwtToken();
if (typeof jwtToken == "string") {
const authClientConfig = {
url: awsmobile.aws_appsync_graphqlEndpoint,
region: awsmobile.aws_appsync_region,
disableOffline: true,
auth: {
type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
jwtToken: jwtToken
}
}
const link = ApolloLink.from([createAuthLink(authClientConfig), createSubscriptionHandshakeLink(authClientConfig)]);
const authClient = new ApolloClient({ link, cache: new InMemoryCache({ addTypename: false }) });
setClient(authClient);
} else {
throw "error";
}
}).catch(e => {
console.log(e);
const config = {
url: awsmobile.aws_appsync_graphqlEndpoint,
region: awsmobile.aws_appsync_region,
disableOffline: true,
auth: {
type: AUTH_TYPE.API_KEY,
apiKey: awsmobile.aws_appsync_apiKey
}
}
const link = ApolloLink.from([createAuthLink(config), createSubscriptionHandshakeLink(config)]);
const authClient = new ApolloClient({ link, cache: new InMemoryCache({ addTypename: false }) });
setClient(authClient);
})
}

if (!client) {
return "Loading..."
}

return (
<ApolloProvider client={client}>
...
</ApolloProvider>
);
}`

关于react-native - 如何配置 Amplify 以使用多个 AppSync 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54273144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com