使用通过 AWS AppSync 的 Cognito UserPools 进行身份认证的用户执行 GraphQL API

首先

如果使用GraphQL API,则需要使用API_KEY进行API密钥认证,具体的请求方法已经说明了。

$ $ curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:ABC123" -d '{ "query": "query { movies { id } }" }' https://YOURAPPSYNCENDPOINT/graphql

如果您在Cognito UserPools上进行身份验证,那么需要的具体信息示例很少。本文将进行详细说明。

回覆

以下是手順概述的內容。

    • ログイン可能な Cognito UserPools を作成する (この用途であれば Cognito フェデレーティットアイデンティティは不要)

 

    • GraphQL API と作成した Cognito UserPools を紐づける

 

    • Cognito UserPools にログインして ID トークンを取得する

 

    • GraphQL API にアクセスする際の Authorization ヘッダに ID トークンを載せてアクセスする。

公式の説明では Authorization ヘッダには Amazon Cognito ユーザープールによって提供される OIDC トークンが使用されます、と説明されている が、Cognito UserPools を利用する場合は ID トークンが OIDC トークンに該当する

Cognito に保存されているユーザー情報による制御を行いたい場合、Resolver 内で ID トークンの内容が参照できるため、これを使って解決する

如果将Cognito UserPools作为默认的身份验证模式绑定,您可以通过管理控制台的设置 > 默认身份验证模式来进行设置。

SnapCrab_NoName_2021-10-20_9-58-29_No-00.png

假设通过 Cognito UserPools 登录并获得以下结果(通过执行 cognito-idp admin_initiate_auth 获得)。本文不涉及对 Cognito UserPools 的设置和登录方法进行说明。

{
  "ChallengeParameters": {},
  "AuthenticationResult": {
    "AccessToken": "eyJraWQiOiJpSlp........",
    "ExpiresIn": 3600,
    "TokenType": "Bearer",
    "RefreshToken": "eyJjdHkiOiJKV1QiLCJlbm......",
    "IdToken": "eyJraWQiOiJ3RU9......"
  },
  "ResponseMetadata": {
    "RequestId": "ed5aaa19-92a4-439f-b686-8a0525818e99",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Wed, 20 Oct 2021 00:26:58 GMT",
      "content-type": "application/x-amz-json-1.1",
      "content-length": "4098",
      "connection": "keep-alive",
      "x-amzn-requestid": "ed5aaa19-92a4-439f-b686-8a0525818e99"
    },
    "RetryAttempts": 0
  }
}

在这个时间点,将获得的AuthenticationResult.IdToken设置到请求时的Authorization头文件中进行访问。具体步骤如下所示。

$ curl -s -X POST -H "Context-Type: application/graphql" -d '{"query": "{ hello }"}' -H "Authorization: eyJraWQiOiJ3RU9......" https://********.appsync-api.ap-northeast-1.amazonaws.com/graphql

# {"data":{"hello":"This is a fixed string!"}}

如果只需进行初始设置,只要在Cognito上登录并拥有有效的ID令牌,即可进行访问。但是,如果希望限制每个用户的访问权限,在解析器中,可以通过$context.identity访问并获取包含在ID令牌中的信息,然后进行利用。

例如,通过$context.identity.claims.get(”cognito:groups”)可以获取用户所属的组列表,可以使用这个信息来编写一个解析器映射模板,比如说”如果用户属于Administrator组,则可以执行PutItem操作”。

请参考下面提供的更详细用例。