Разделение пользовательских данных с помощью AWS Amplify

#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 достаточно умны, чтобы убедиться, что пользователь, запрашивающий данные, является тем же пользователем, которому принадлежат данные.