关于无法与Amplify DataStore同步的问题
这篇文章所写的内容
我已经记录了关于对AWS Amplify DataStore进行多种认证方法的访问限制时遇到的问题和解决方法。
无法同步DataStore的问题
如标题所示,这是一个关于本地和云端之间无法进行数据存储同步的问题。
当我们开发了一个在智能手机和网络上共享同一数据存储的应用程序时,发生了一件事件。智能手机使用API_KEY进行身份验证,而网络使用AMAZON_COGNITO_USER_POOLS进行身份验证,因此需要分别设置访问级别。为了解决这个问题,我们根据以下URL添加了schema.graphql配置,但是本地的更改不再同步到云端的DataStore中。
type Store @model @auth(rules: [
// Cognito Userpoolで認証されたモデルのownerはフルアクセス可能
{ allow: owner }
// APIkeyで認証された利用者は閲覧のみ可能
{ allow: public, operations: [read] }
]) {
}
在本地环境中,当Datastore的更新顺利完成并且应用程序没有出现错误时,很难察觉到问题,并且最令人困扰的是没有调试线索。
问题出在哪里?
在 Amplify GraphQL 中,支持以下身份验证方法,但是还有关于默认身份验证的配置。
-
- API_KEY
-
- AWS_IAM
-
- OPENID_CONNECT
-
- AMAZON_COGNITO_USER_POOLS
- AWS_LAMBDA
这个案例中,默认认证是API_KEY。
由于在从web应用程序访问GraphQL API时未指定身份验证方法,并且默认使用了API_KEY,导致无法将数据写入DataStore。
解决的办法
关于Amplify DataStore的更新,可以使用DataStore API或GraphQL API两者之一,但根据文档的阅读,似乎DataStore API中没有相关选项,并且只能通过GraphQL API指定认证方法。
因此,通过使用GraphQL API来重写原本的DataStore API实现,并指定authMode:’AMAZON_COGNITO_USER_POOLS’,我们现在能够将数据写入到云端的DataStore中。
/// Create
const todoDetails = {
text: 'This is a pen'
}
await API.graphql({
query: createToDo,
variables: {
input: todoDetails
},
/// API認証にAMAZON_COGNITO_USER_POOLSを使用
authMode: 'AMAZON_COGNITO_USER_POOLS'
});
/// Update
const todoDetails = {
id: 'some_id'
text: 'This is a apple'
/// Updata・Delete時は対象バージョンを指定する必要がある
_version: 'target_version'
}
await API.graphql({
query: updateToDo,
variables: {
input: todoDetails
},
authMode: 'AMAZON_COGNITO_USER_POOLS'
});
这就是全部了。