AppSync订阅授权问题

Posted

技术标签:

【中文标题】AppSync订阅授权问题【英文标题】:AppSync subscription authorization problem 【发布时间】:2019-02-08 14:03:40 【问题描述】:

您好,我是 aws AppSync 和 GraphQl 的新手。我有订阅问题。我想在发布新帖子时实时收到通知

这是我的 graphql 架构 ``

type Mutation 
    addPost(
        id: ID!,
        author: String!,
        title: String,
        contennt: String,
        url: String
    ): Post!
    updatePost(
        id: ID!,
        author: String!,
        title: String,
        content: String,
        ups: Int!
    ): Post!
    deletePost(id: ID): Post!


type Post 
    id: ID!
    author: String!
    title: String!
    url: String
    content: String
    ups: Int!


type Query 
    allPost: [Post]
    getPost(id: ID!): Post


type Subscription 
    newPost: Post
        @aws_subscribe(mutations: ["addPost"])


schema 
    query: Query
    mutation: Mutation
    subscription: Subscription

``

这是我的潜艇查询:

subscription NewPostSub
  newPost
    __typename
    title
    content
    author
    url
  

我收到错误,提供的关键元素与模式不匹配,在 dynamodb 表中 pk 是 id 并且我生成了映射模板。 谢谢

【问题讨论】:

我需要更多信息来提供帮助。您能否提供 Mutation.addPost 突变的请求和响应映射模板。如果您在 Subscription.newPost 字段上有解析器,请也提供这些解析器。订阅查询不应该关心您的 DynamoDB 架构,所以我怀疑这个错误实际上来自突变。如果您有更多信息,请告诉我。 您好,这里是 addPost 突变的请求: "version" : "2017-02-28", "operation" : "PutItem", "key" : $util.dynamodb.toDynamoDBJson($ ctx.args.id) "id": $util.dynamodb.toDynamoDBJson($util.autoId()), , "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 这里是响应:$ util.toJson($ctx.result) 这里用于订阅: "version": "2017-02-28", "operation": "GetItem", "key": "id": $util.dynamodb.toDynamoDBJson ($ctx.args.id), 这里是响应:$util.toJson($ctx.result) 谢谢@mparis 【参考方案1】:

感谢您的信息。

首先,您的订阅字段根本不需要解析器。您需要将解析器添加到订阅字段的唯一原因是在连接时根据调用身份进行授权检查。您无需添加解析器即可使订阅正常工作。要修复它,请从订阅 (Subscription.newPost) 字段中删除解析器。

要解决您的用例并使其仅订阅具有特定 ID 的帖子,请将您的 newPost 订阅字段更改为 newPost(id: ID!)。当您进行订阅查询时,提供id 并且该订阅只会收到由订阅到具有该 ID 的突变返回的推送帖子。这是 AppSync 中的一项功能,当您将参数添加到订阅字段时,参数相等检查会自动发生。

其次,当您将其粘贴到评论中时,您目前拥有Mutation.addPost 的此请求映射模板:

 
  "version" : "2017-02-28", 
  "operation" : "PutItem", 
  "key" :  
    $util.dynamodb.toDynamoDBJson($ctx.args.id) 
    "id": $util.dynamodb.toDynamoDBJson($util.autoId()), 
  , 
  "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 
 

有一个错字,应该是这样的:

 
  "version" : "2017-02-28", 
  "operation" : "PutItem", 
  "key" :  
    "id": $util.dynamodb.toDynamoDBJson($util.autoId()), 
  , 
  "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 
 

【讨论】:

太棒了!您能否将问题标记为已回答,以供将来的查看者使用。

以上是关于AppSync订阅授权问题的主要内容,如果未能解决你的问题,请参考以下文章

AppSync GraphQL 订阅以分组数据

AWS AppSync - 订阅握手期间出错

AWS Appsync 订阅 - “连接失败:连接握手错误”

筛选 AppSync 订阅

AppSync/Amplify - 如何定义 GraphQL 订阅

放大未捕获的 AppSync 订阅(承诺中)