Ошибка Amplify GraphQL не авторизована для доступа к созданию - PullRequest
1 голос
/ 06 августа 2020

В моем приложении у пользователей есть возможность начинать беседу с другими пользователями, и после создания беседы они могут отправлять друг другу сообщения. Однако после попытки наладить диалог между двумя пользователями я получаю сообщение об ошибке:

 Failed to create graphql GraphQLResponseError<Conversation>: GraphQL service returned a successful response containing errors: [Amplify.GraphQLError(message: "Not Authorized to access createConversation on type Conversation", locations: Optional([Amplify.GraphQLError.Location(line: 2, column: 3)]), path: Optional([Amplify.JSONValue.string("createConversation")]), extensions: Optional(["data": Amplify.JSONValue.null, "errorType": Amplify.JSONValue.string("Unauthorized"), "errorInfo": Amplify.JSONValue.null]))]
Recovery suggestion: The list of `GraphQLError` contains service-specific messages 

Это мой первый раз, когда я использую GraphQL, и, вероятно, это видно. Я бы хотел дать members модели Conversation возможность создавать свои конво. Может ли кто-нибудь направить меня в правильном направлении? Ниже приведена моя схема GraphQL

type User 
  @model 
  @auth(rules: [{ allow: owner, operations: [create, delete, update]}]) {
  id: ID!
  userSub: String!
  fullName: String!
  profileImageFileName: String!
  conversations: [ConvoLink] @connection(name: "UserLinks")
  messages: [ChatMessage] @connection(name: "UserMessages", keyField: "authorId")
  createdAt: String
  updatedAt: String
}

type Conversation
  @model
  @auth(rules: [{ allow: owner, ownerField: "members", operations: [create, delete, update] }]) {
  id: ID!
  messages: [ChatMessage] @connection(name: "ConvoMsgs", sortField: "createdAt")
  associated: [ConvoLink] @connection(name: "AssociatedLinks")
  name: String!
  members: [String!]!
  createdAt: String
  updatedAt: String
}

type ChatMessage 
  @model
  @auth(rules: [{ allow: owner, ownerField: "authorId" }]) {
  id: ID!
  author: User @connection(name: "UserMessages", keyField: "authorId")
  authorId: String
  content: String!
  conversation: Conversation! @connection(name: "ConvoMsgs")
  messageConversationId: ID!
  createdAt: String
  updatedAt: String
}

type ConvoLink 
  @model(
    mutations: { create: "createConvoLink", update: "updateConvoLink" }
    queries: null
    subscriptions: null
  ) {
  id: ID!
  user: User! @connection(name: "UserLinks")
  convoLinkUserId: ID
  conversation: Conversation! @connection(name: "AssociatedLinks")
  convoLinkConversationId: ID!
  createdAt: String
  updatedAt: String
}

Swift-код

func createConvo(){
      let conversation = Conversation( messages: List<ChatMessage>.init(), associated: List<ConvoLink>.init(),name: "convo", members: [currentUserSub, recieverUserSub])
        _ = Amplify.API.mutate(request: .create(conversation)) { event in
            switch event {
            case .success(let result):
                switch result {
                case .success(let convo):
                  //  DispatchQueue.main.async {
                        
                        print("Successfully created the convo: \(convo)")
                       // self.messageButton.isHidden = true
                   // }
                case .failure(let graphQLError):
                    print("Failed to create graphql \(graphQLError)")
                    //  self.checkIfOffline()
                }
            case .failure(let apiError):
                print("Failed to create a todo", apiError)
                // self.checkIfOffline()
            }
        }
}

1 Ответ

1 голос
/ 06 августа 2020

Когда вы используете директиву auth для ваших типов моделей, ie. @auth(rules: [{allow: owner, operations: [create, delete, update]}) требует аутентифицированного пользователя для вызова API.

Входил ли пользователь с использованием Amplify.Auth.signIn до Amplify.API.mutate/query/subscribe?

Отладка

Поскольку вы используете директиву auth, подготовка API также должна была предоставить категорию auth. Вы можете открыть подготовленный ресурс аутентификации через amplify console auth и выбрать Пул пользователей Cognito. Вы можете создать пользователя через консоль, и он будет создан в состоянии, требующем нового пароля.

Затем вы можете запустить amplify console api, выбрать GraphQL, открыть консоль AppSyn c, затем перейдите на вкладку "Запросы", чтобы проверить свой API. При тестировании вашего API консоль запросов должна указать, какой у вас основной режим авторизации для API, и потребует от вас входа в систему. Получите идентификатор клиента веб-приложения из консоли Cognito User Pool, используя имя пользователя предыдущего созданного вами пользователя и пароль. Как только вы попытаетесь войти в систему, вам будет предложено ввести новый пароль. После аутентификации пользователя через консоль запросов вы можете проверить свои вызовы API

в приложении

Если вы можете пройти ошибку NotAuthorized, включив Amplify.API.signUp/confirmSignUp/signIn перетекает в ваше приложение, но по-прежнему видны другие проблемы с вызовом API, не стесняйтесь предоставить более подробную информацию в выпуске в репозитории Github здесь: https://github.com/aws-amplify/amplify-ios/issues, так как репо активно отслеживается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...