どないブログ

なんでも書く

Cognito Workshop と追加お試しのメモ

やること

Cognito を触ったことがないので、このワークショップをやる。

dcj71ciaiav4i.cloudfront.net

メモしながら手を動かしていく。

サインインオプション

  • ユーザー名, email, tel を選べる。
  • パスワードポリシーの設定可能文字数、特殊文字(アルファベット、記号を含む) etc...
  • MFA の強制も可能

  • ユーザー自身がパスワードリセット可能かどうかも設定可能。

  • ユーザーがサインインページからサインアップ(アカウント登録)できるかどうかのハンドリングもできる。
    • 社内サービスとかだと、管理者が作るような運用がありそう。

属性検証

このページが参考になる。

docs.aws.amazon.com

メールアドレスが正しいかどうか、メールを送って検証するという文脈(だと思う)

属性変更の確認の 「未完了の更新があるときに元の属性値をアクティブに保つ - 推奨」について

昔 Cognito メールアドレス(属性)の変更は以下の仕様だったらしい。

  • メールアドレスを変更するように API を叩くと、その瞬間にユーザープールが更新される。
  • つまり前のメールアドレスでログインはできない。
  • 更新メールアドレスを間違えると、メールアドレスが正しいかどうかの検証メールが届かない。
  • 検証が完了していないので、新しいメールアドレスでログインできなくて詰む。(管理者がなんとかできる?)

zenn.dev

今はこの問題に対応されていて、このチェックボックスが存在しているという経緯のように見える。

必須の属性

必須の属性が色々と選択できる。

address, birthdate, picture, profile, etc…

メッセージ配信の設定

SES, Cognito のどちらからメールを送信するか選択できる。

Cognito は一日最大50件しか送信できない。

どちらも SES で検証済みのメールアドレスを指定できる。

アプリケーションを統合

Cognito が用意してくれる UI を使わない Option もある。

Cognito の UI を使う場合、ドメインについては xxx.amazoncognito.com か、カスタムドメインを利用できる。

JWT に関する設定

ID Token, Access Token, Refresh Token の有効期限を設定可能。

docs.aws.amazon.com

トークンの取り消し有効化

docs.aws.amazon.com

OpenID Config

https://cognito-idp.{region}.amazonaws.com/{userpoolid}/.well-known/openid-configuration にアクセスすると、

Config 一覧が見られる。

Postman での認証

Postman でも、ここから HostedUIのログイン画面を呼び出して認証できる

  • Auth URL

    • https://{your-cognito-domain}.auth.{your-region}.amazoncognito.com/oauth2/authorize
  • AccessTokenURL

    • https://{your-cognito-domain}.auth.{your-region}.amazoncognito.com/oauth2/token

API Gateway で作った Pets API に認証を追加する

API Gateway に Authorizers という機能がある。

  • Authorizer type に Lambda, Cognito が選択できた。(今回はもちろんCognito)

  • Test Authorizer

    • Authorization に Postman で取得した id_token を使って Bearer {id_token} とすることで、認証のテストができる。

URL ごとに認証を追加することができる。

↓ GET /pets にだけ追加している時

Postman でテスト

ok

ワークショップ外のお試し

気になること

  • 管理者がユーザーを作成し、作成されたユーザーの verify なしでユーザー作成・ログインできるか
  • 利用者にパスワード変更を行わせず、管理者がパスワードを変更できるか。

やってみる

セルフサービスのアカウントの復旧を有効化 を OFF にすることで、利用者がパスワード変更を行えなくなる。

自己登録の有効化 を OFF にすることで、利用者がアカウントを作成できない。(Cognito の UI に signup リンクが表示されない。 )

「Cognito アシスト型の検証および確認」 でメッセージを自動的に送信しないを選択することで、アカウント作成時にメールが送信されない。

ユーザー作成

Cognito の JS の SDK を使って作成する形で検証する。

(実際には AWS コンソールを使わず、サービスの管理画面を作成することになるはずなので)

AdminCreateUserCommand が使える。

docs.aws.amazon.com

使ったコードがこれ。

const createUser = async () => {
  const input = {
    UserPoolId: "...",
    Username: "...", // email にした
    TemporaryPassword: "...", // パスワード
    MessageAction: "SUPPRESS", // SUPPRESS にすると作成完了メールが送信されない
  };
  const command = new AdminCreateUserCommand(input);
  const response = await client.send(command);
};

上記のようにすることで、パスワードを管理者が設定し、ユーザーを作成することができる。

ログイン後、パスワード変更を求める画面が表示される。

(管理者が設定したパスワードを再度使うことも可能。)

パスワードを変更すると、「確認済み」、変更前は「パスワードを強制的に変更」というステータスになる。


作ったリソースを全部消して終わり。

FastAPI で自動生成されるドキュメントの json を取得する

[結論]

/openapi.json にアクセスすると自動生成されたドキュメントの json が取得できる。


FastAPI では自動的に API ドキュメントを生成してくれる機能がある。

fastapi.tiangolo.com

/docs もしくは /redoc にアクセスすると自動生成されたドキュメントを確認することができる。

そうすると、この OpenAPI の json, yaml が欲しくなる。

https://github.com/tiangolo/fastapi/issues/2712

に書いてあった。

/openapi.json にアクセスすると良い。

VSCode で Pylance のエラーメッセージが日本語で表示されてしまう

MacOS を使っている。

FastAPI での開発で VSCode を使っていた。

Pylance が表示するエラーメッセージを英語で表示してほしいのに、

日本語で表示されてしまうので困っていた。

解消したのでメモ

github.com

こちらの通りに

システム環境設定 > 一般 > 言語と地域 > アプリケーション

ここに VSCode を追加し、 English に設定する。

これで解決。

Makefile の .PHONY について

まとめ

Docker を使った開発をしていていて

docker compose up etc をイチイチ書くのが面倒なので、

Makefile を使おうとしたら

make: 'hoge' is up to date と怒られちゃった時の話。

(結論)

実行したいコマンドと同名のディレクトリ, ファイルが存在している時は、

.PHONY をつけよう。

(参考) sumito.jp

ファイル構成は以下のような形

.
├── Makefile
├── backend
 |             └── Dockerfile
└── docker-compose.yml

🙅‍♀️ make backend で怒られる Makefile

up:
  docker compose up -d

backend:
  docker compose exec backend bash

🙆 make backend が通る Makefile

up:
  docker compose up -d

.PHONY: backend
backend:
  docker compose exec backend bash

詳しく

Makefile はそもそも、

[作りたいもの]: [材料]
(-----TAB-----) [作り方]

今回で言うと、 backend を作るために

docker compose exec backend bash を実行すると言う書き方。

C, C++ のプログラムのコンパイル等に使われている。

なので、 make backend とすると backend を作ろうとして

「すでにあるよ」って怒られちゃう。

(参考) omilab.naist.jp

そこで .PHONY

.PHONY は target はファイル名じゃないと言うことを示すための記法。

(参考) www.gnu.org

なので

.PHONY: backend
backend:
  docker compose exec backend bash

とすることで、 backend と言うファイルを作ろうとしているわけではない

と示すことができ、コマンドを実行することができる。

VSCode で分割した editor の group 間を移動するショートカット

PyCharmから徐々にVSCodeへの乗り換えを進めている。

開発時に左右の分割をよく使う。

↓こんな感じ

f:id:r_h_0706:20210118194756p:plain
VSCodeスクショ

分割した時に左右を移動するショートカットが見つからずに困っていた。

PyCharmで言う所の Goto Next SplitterGoto Previous Splitter

見つけたので誰かの役に立てることを願ってメモ。

View: Focus Left Editor GroupView: Focus Right Editor Group だった。

f:id:r_h_0706:20210118195126p:plain

個人的にはそれぞれ

command + shift + ;command + shift + ' をあてている。

おしまい。

httpsでcloneしたリポジトリへのpushで起きるエラーの解消

httpsを使って git clone したリポジトリへのpushでusernameとpasswordの入力を求められた。

>> git push -u origin head

Username for 'https://github.com': 
Password for 'https://donaisore@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/donaisore/my-app.git/'

ここで GitHub の username と password を入力してもpush出来ない。

どうやら二段階認証の設定をしていると起こるっぽい。

docs.github.com

↑このページを参考に token を発行した。

>> git push -u origin head
Username: ${username}
Password: ${token}

で完了。

macでNEologdのインストール

このリンクの本を購入して勉強中。

以下でここに書いてあるサンプルコードが少し登場します。

github.com

Neologdってなに?

簡単に言えば、新語が登録されているMecab用の辞書らしい。

例えば、以下のようにMaCabで辞書を指定せずに形態素解析実行した時に

import MeCab

m_t = MeCab.Tagger('-Ochasen')
text = '機械学習が好きです。'

print(m_t.parse(test))

機械学習 という単語が上記で言う所の 新語 に当たり、 機械学習 に分けられてしまう。

そこで、NEologd を使う。

macでNEologdのインストール(本題)

github.com

ここに全部書いてあるんだけど、実行したものだけ抽出。

動作に必要なライブラリのインストール
$ brew install mecab mecab-ipadic git curl xz

NEologdのGitHubのプロジェクトをclone(よく分からないところにcloneしたくないので、 user root に移動)
$ cd
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

辞書のインストール
$ ./bin/install-mecab-ipadic-neologd
途中でyesを入力

で完了。

ちなみに

以下のコマンドでインストール時のオプション一覧が取得できる。

$ ./bin/install-mecab-ipadic-neologd -h

-p オプションを使うことで、インストール先のpathを指定出来るらしい。

↓で書いているが、毎度インストール先の確認をするもの面倒なので、指定しちゃうのはアリかも。

インストール後に困ったこと

MeCabで使う辞書を指定する時に、

import MeCab
m_t = MeCab.Tagger('-Ochasen - d {dict_path}')

と、辞書をインストールしたpathを書いて上げる必要があった。

どこか分からん...

となった。

以下のコマンドでインストール先が分かる。

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

(出力) /usr/local/lib/mecab/dic/mecab-ipadic-neologd