Как сделать уровень поля @auth для двунаправленного @ one-to-many @connection с помощью AppSync GraphQL Transform? - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь выяснить, как вы можете защитить на уровне поля один-ко-многим @connection с @auth от мутаций, которые не должны быть разрешены.(то есть: запретить конкретному пользователю запускать мутацию, которая в конечном итоге будет вставлять сообщения как другой пользователь.)

Начиная с примера защиты мутации на уровне поля: https://aws -amplify.github.io / docs / cli / graphql # field-level-authorization

Я попытался сделать что-то вроде этого:

type User @model @auth(rules: [{ allow: owner, ownerField: "id" }]) {
  id: ID!
  posts: [Post]
    @connection(name: "UserPosts")
    @auth(rules: [{ allow: owner, ownerField: "id" }])
}

type Post @model {
  title: String!
  user: User!
    @connection(name: "UserPosts")
    @auth(rules: [{ allow: owner, ownerField: "userPostId" }])
}

Затем скажите, что уже есть пользователь сid regular-user-id Очевидно, мои правила авторизации не останавливают другого пользователя, скажем, с id: malicious-user-id для запуска этой мутации:

mutation {
  createPost(input:{
    title:"Oh this is BAD!"
    postUserId: "regular-user-id"
  }) {
    title
  }
}

Выполнение простого запроса, чтобы убедиться, что это действительно произошло:

query {
  getUser(id:"regular-user-id"){
    posts{
      items
      {
        title
      }
    }
  }
}
=> 
{
  "data": {
    "getUser": {
      "posts": {
        "items": [
          {
            "title": "Regular User title"
          },
          {
            "title": "Oh this is BAD!"
          },
        ]
      }
    }
  }
}

Я попробовал различные способы, чтобы выяснить это, и не смог найти никакой документации по двунаправленной аутентификации на уровне поля.Я довольно новичок в AppSync, поэтому думаю, что я что-то не понимаю, но тогда это настолько распространенный сценарий использования, что я действительно удивлен, что документации по этому поводу больше нет.

Некоторая помощьбыл бы очень признателен.

1 Ответ

0 голосов
/ 01 июля 2019

Должен ли злоумышленник обновить заголовок Post?Я знаю, что это не точный ответ на ваш вопрос, поскольку вы сосредотачиваетесь на поле отношений, но, пытаясь понять, как делать такие вещи самостоятельно, я прочитал несколько вещей о введении некоторой формы группы «все»так что вы можете определить аутентификацию для пользователя, который не является владельцем.Тогда вы могли бы поставить аутентификацию для всей модели Post, чтобы только владельцы могли обновлять любое поле;

type Post 
  @model 
  @auth(rules: [
    { allow: owner, ownerField: "userPostId" },
    { allow: groups, groups: ["everyone"], operations: [read] }
  ]) {
  title: String!
  user: User!
    @connection(name: "UserPosts")
}

Я супер новичок для усиления (сейчас я оцениваю, использовать ли его для проекта, который яЯ начинаю), поэтому я могу быть совершенно не прав здесь.Если вы действительно хотите полуоткрытую модель, в которой только поле ссылки имеет аутентификацию, я не уверен, как это сделать :(

...