#ios #swift #aws-amplify #aws-appsync
Вопрос:
Я следую учебникам AWS Amplify по API и аутентификации. Хотя я добился прогресса в том, чтобы заставить работать оба (!), мне неясно, как я мог бы соединить две функции Amplify, чтобы разделить/разделить (?) пользовательские данные…
Например, возьмем эту модель задач GraphQL:
type Todo @model @auth(rules: [{allow: public}]) {
id: ID!
name: String!
description: String
completed: Boolean!
}
Я могу сохранить и извлечь эти Todo
файлы с помощью ViewModel:
import Amplify
class TodoListViewModel: ObservableObject {
@Published var todos = [Todo]()
@Published var completedTodos = [Todo]()
func loadToDos() {
Amplify.DataStore.query(Todo.self) { result in
switch result {
case .success(let todos):
self.todos = todos.filter { !$0.completed }
self.completedTodos = todos.filter { $0.completed }
case .failure(let error):
print("Could not query DataStore: (error)")
}
}
}
func createTodo(name: String, description: String?) {
let item = Todo(name: name, description: description, completed: false)
todos.append(item)
Amplify.DataStore.save(item) { result in
switch result {
case .success(let savedItem):
print("Saved item: (savedItem.name)")
case .failure(let error):
print("Could not save item with error: (error)")
}
}
}
}
Но эти методы, по-видимому, позволяют любому пользователю получить доступ к данным любых других пользователей (?)
Читая документы, я думаю, что мне нужно настроить правила авторизации (?)
Если я правильно читаю это, чтобы убедиться, что произвольный пользователь может видеть только свои данные, действительно ли это так просто, как изменить модель GraphQL Todo на:
type Todo @model @auth(rules: [{allow: owner}]) {
id: ID!
name: String!
description: String
completed: Boolean!
}
Этого не может быть?
…какие еще изменения мне нужно будет реализовать, чтобы «Алиса» могла сохранять и извлекать свои данные и быть уверенной, что я не смешиваю их с данными «Боба»?
Был бы признателен за полностью проработанный пример, в котором используется аутентифицированный (вошедший в систему) пользователь!
Ответ №1:
Это действительно так просто. В этом и заключается ценность использования Amplify. Каждая запись, сохраненная в базе данных, имеет столбец с именем owner
. Значение owner
-это идентификатор пользователя Cognito, создавшего запись.
Автоматически сгенерированные распознаватели AppSync достаточно умны, чтобы убедиться, что пользователь, запрашивающий данные, является тем же пользователем, которому принадлежат данные.