使用通过 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作为默认的身份验证模式绑定,您可以通过管理控制台的设置 > 默认身份验证模式来进行设置。
假设通过 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操作”。
请参考下面提供的更详细用例。