CognitoをNode.jsから使ってTokenを手に入れる
AWS勉強しといて(自腹)という死ぬほど雑な指示を会社から受けて、数日が経ちました
どうも、6月の請求額が0円で安心したゆずです
cognitoとは
Amazon Web Serviceが提供する認証サービス
モバイルだったりWebサービスだったり色々なもので使えるもので ユーザー名/メールアドレス&パスワードの認証のみならず、Google, Facebookなどのログインもやってくれるすごいやつ*1
MAUが50,000までは無料なので、気軽に試せますね
実は認証以外にもユーザーデータの端末間同期取ってくれる機能とかあるっぽいですがそこらへんは別の機会に*2
今回のゴール
ユーザー名・パスワードで認証してJsonWebTokenを取得する
conitoの設定をする
ユーザープール作成
cognitoの設定画面に行って、「ユーザープール管理」から「ユーザープール作成」でユーザープールを作成。今回はデフォルト設定を基本そのまま使う。
パスワードの制約が面倒だったので、テスト用だしとポリシーページで自分は緩めました(画像はデフォで作った所の写真なので緩くなってません)
作成したら「プールID」というのを後で必要になるのでメモ帳か何かにメモっておいてください
ユーザー作成
「ユーザーとグループ」をクリックして、APIからもユーザーは作れるのですが面倒なので手動でユーザー作ります
アプリクライアントの発行
ユーザーの作成が完了したらアプリクライアントIDを発行します 左のメニューから「アプリクライアント」を選択して、「アプリクライアントを追加」するとアプリクライアントIDが発行されます
このアプリクライアントIDも後で使用するためメモ
フェデレーティッドアイデンティティの設定
フェデレーティッドアイデンティティの設定画面に移動し、IDプールを作成します
ここで認証プロパイダのCognitoタブに、メモしたプールIDとアプリクライアントIDを設定し「プール作成」を選択します
ロールの設定は今回は特に変更せず次へ
IDプールが作成されたら作成したIDプールを開き、右上の「IDプールの編集」をクリックし「IDプールのID」をメモします
認証が通ることを確認する
認証が通ることを確認するコードを書きます
aws-cognito-identity-js
前はあったっぽいですが、今はAWS-Amplifyを使うべきみたいです
コードを書く前に
書き始める前に以下の項目が必要です*3
- identityPoolId
- 作成したフェデレーティッドアイデンティティを開いて、右上の「IDのプールの編集」をクリックしたら出てくるページに書いてる
- region
- cognitoを作成したリージョン
- userPoolId
- 作成したユーザープールの全般設定の1番上に「プールID」として定義されている
- userPoolWebClientId
- 作成したユーザープールのアプリクライアントページに「アプリクライアントID」として定義されている
書いていく
AWS Amplifyに書いてるコードを使ってログインできることを確認する*4
yarn add aws-amplify isomorphic-fetch
isomorphioc-fetch
はNodeで試したいため導入しています
以下はtokenが取れることを確認するためのサンプルコード
(実際に使うときはusername
とか入力値使えばいい)
require("isomorphic-fetch") const Amplify = require("aws-amplify") Amplify.default.configure({ Auth: { // 以下の項目にメモったものを書く identityPoolId: "", region: "", userPoolId: "", userPoolWebClientId: "" } }) // 作成したユーザーのユーザーネーム const userName = "nogi" // パスワード const pw = "hogehoge" Amplify.Auth.signIn(userName, pw) .then(user => { // 初期ログインのユーザーはパスワードの変更を求められる if (user.challengeName === "NEW_PASSWORD_REQUIRED") { // パスワードの変更(今回は同じものを設定している) return Amplify.Auth.completeNewPassword(user, pw, {}) } return user }) .then(user => console.log(user.signInUserSession.idToken.jwtToken)) //tokenを表示 .catch(e => console.error(e))
これでトークンが取得できて表示されるはず
まとめ
challengeName
にNEW_PASSWORD_REQUIRED
と書かれていたので
パスワードを変更しないと行けないのはわかったけど、completeNewPassword
使うってのが気づけなくて大変だった
自分の探し方が下手なのかcognitoの使い方よくわからん問題 とりあえずログインできたので、次api gatewayあたりと連携して認証してるユーザーがapi叩けるみたいなのやる