AmplifyのAdmin Queries APIを使ってみる
ゲバラです。最近AmplifyのAdmin Queries APIを使う機会があったので、使い方をまとめてみました。
Admin Queries APIとは
Admin Queries APIはAmplify CLIのAuthenticationで提供されているCognito ユーザプールのユーザやグループをクエリで取得したり、操作をするためのAPIです。公式からは「これは高度な機能であり、基本的なアーキテクチャを理解していないとお勧めできません。」と書いてあり、使うのが難しそうですが、Cogntioユーザプールやそれに関わる認証まわりが理解できていればなんなく使えます。今回は複数のユーザグループとユーザ作成を画面上で操作できるようにAdmin Queries APIを利用しました。
導入方法
いたって簡単
authのコマンドから
$ amplify add auth
もしくは
$ amplify update auth
以下の流れで回答します。APIを特定のユーザグループで制限する場合は、事前にユーザグループを作っておいてください。
? Do you want to add an admin queries API? Yes
? Do you want to restrict access to the admin queries API to a specific Group Yes
? Select the group to restrict access with: (Use arrow keys)
❯ Admins
Editors
Enter a custom group
Successfully added AdminQueriesXXXX function locally
Successfully added AdminQueries API locally
Successfully updated auth resource アプリ名 locally
完了すると./amplify/backend/function/AdminQueriesXXXにAPIのソースが作成されます。すばら。これをamplify pushすることで指定したユーザグループに所属するユーザのみが実行できるAdmin Queries APIを利用できるようになります。Admin Queries API自体はAPI Gatewayでエンドポイントが作成され、Lambda内でユーザプールに対する操作が可能となります。
API各種説明
APIには11種類の操作が用意されています。ここでは私が使ってみた操作をご紹介します。言っても文字通りなんでシンプルです。
・addUserToGroup
指定したユーザを指定したグループに追加します。
・confirmUserSignUp
指定したユーザのサインアップを確認します。
・enableUser、disableUser
指定したユーザを有効・無効化します
・listUsersInGroup
指定したグループのユーザ一覧を取得します。一度に取得する件数のlimitとNexttokenが発行されるのでとのtokenをパラメータとして指定します。
使い方
コードで書くとこんな感じになります。Amplify Librariesで提供されているAPIを使って簡単に操作できるのがいいところです
import { Auth, API } from 'aws-amplify'
import {
CognitoAccoutsInfo,
CognitoAccount,
} from '@/models/CognitoAccountsInfo'
const API_NAME = 'AdminQueries'
const LIST_LOOP_LIMIT = 10
export const listUsersInGroup = async (
groupName: string,
items: CognitoAccount[],
nextToken: string
): Promise<CognitoAccount[]> => {
const path = '/listUsersInGroup'
const myInit = {
queryStringParameters: {
groupname: groupName,
limit: LIST_LOOP_LIMIT,
token: nextToken,
},
headers: {
'Content-Type': 'application/json',
Authorization: `${(await Auth.currentSession())
.getAccessToken()
.getJwtToken()}`,
},
}
const rest: CognitoAccoutsInfo = await API.get(API_NAME, path, myInit)
const tmp: CognitoAccount[] = items.concat(rest.Users)
if (rest.NextToken) {
return listUsersInGroup(groupName, tmp, rest.NextToken)
}
return tmp
}
export const confirmUserSignUp = async (email: string) => {
const path = '/confirmUserSignUp'
const myInit = {
body: {
username: email,
},
headers: {
'Content-Type': 'application/json',
Authorization: `${(await Auth.currentSession())
.getAccessToken()
.getJwtToken()}`,
},
}
const { ...rest } = await API.post(API_NAME, path, myInit)
return rest
}
ユーザ情報のレスポンスは自分で型を作りました。
export type CognitoAccoutsInfo = {
Users: CognitoAccount[];
NextToken: string;
};
export type CognitoAccount = {
Username: string;
UserStatus: string;
UserCreateDate: string;
UserLastModifiedDate: string;
Enabled: boolean;
Attributes?: CognitoAccoutAtrribute[];
};
type CognitoAccoutAtrribute = {
Name: string;
Value: string;
}
Createできない
ここまでくると気付く方もいるかもしれませんが、実はcreate系の操作がAdmin Queries APIでは提供されていません。これで一番困るのがユーザ作成です。ただAdmin Queries API改修すればユーザ作成することも可能なようです。amplify-cliのissueで話されています。
試してませんが、以下の2点を行うとユーザ作成ができるようになるようです。CreateUserを実行するためのコードと権限をつけています。
1. ./amplify/backend/function/AdminQueriesXXX/src の cognitoActions.js と app.jsに必要なコードを追加する。
2. amplify/backend/function/AdminQueriesXXX-cloudformation-template.jsonのResources.lambdaexecutionpolicy.Properties.PolicyDocument.Statement[1].Actionに"cognito-idp:AdminCreateUser"を追加する
使ってみて
簡単です。もちろん最初の学習で多少時間を使いますが、使い方を把握できれば実現したいビジネスフローに合わせてユーザ管理を行うことができます。GraphQLの@authの設計にも合わせることができるので便利です。
最後に
POLでは新しい仲間、エンジニア、デザイナーを絶賛募集中です。!他にも職種あります!!お話しだけでも構いませんのでご興味あればぜひお声がけください!!私のTwitterからでもお気軽に!!