Auth0めも

IDaaSと呼ばれる認証・認可を自前で作り込まなくても良くなるやつ
SaaSの一種?なので利用料取られる(7000ユーザーぐらいまでは無料らしいけど)
結構機能豊富なのと最初にとりあえずで入れるならサクッと行けるので割と選択肢としてありな気もする(障害点が増えるのを許容できない or コストを許容できないとかだと厳しいかも)
あとRailsだけじゃなくReactとかネイティブアプリとかにも簡単に組み込める
概念的なやつ:
- tenant:アカウントの下に紐づく、影響範囲を分離したいレベルで切り分けることができるぽい、よくありそうなのは環境別(dev、prod)とかユーザー種類別(普通のユーザー、admin)とか?
- 環境を分離したいときはテナント分けるのが推奨されてるぽい
- application:テナントに紐づく、iosアプリとかwebアプリとかの単位で作れば良さそう(基本webだけかな
- connection: SNSログインとか各種プロバイダーを使いたい時に作る(めっちゃ種類ある
railsの場合:
https://auth0.com/docs/quickstart/webapp/rails/01-login
↑をなぞるだけで基本いける
チュートリアルの通りやると、InvalidAuthenticityTokenがずっと出てるけどcsrf_meta_tagついてるしなあっていうエラーが出て困ったけどこれで解決した(パスつけるだけ)
https://github.com/cookpad/omniauth-rails_csrf_protection/issues/8#issuecomment-659603672
ログイン時の見た目を変えたい時:
https://auth0.com/docs/brand-and-customize/universal-login-page-templates#using-the-auth0-cli-
liquidでhtml書けば色々できるっぽい、cli使うのが楽そう
ちょろっとした修正なら管理画面からもいける(ロゴ変えるだけとか
memo:
- クライアント側の管理にはorganizationが使えそう
- https://auth0.com/docs/organizations
- 最初にowner roleの人にアカウント作ってもらってその後誰をどんな権限で追加するかはその人にお任せする
- 管理画面上でorganization別で参照できるのでどの会社の人かを判断しやすくなる
- 本運用の時はRBAC有効化して管理した方が良さそう
- 設定項目なかなかに多いので運用破綻しないためにterraform or 公式のcli使ってコード管理した方が良さそう
- https://auth0.com/docs/deploy/deploy-cli-tool
- cliの方はdry runできないっていうのがあるらしい、使い慣れてるしterraformの方がいいかも
- 必要なベストプラクティスチェックしとく
- SLA:https://auth0.com/docs/support/services-level-descriptions
- 匿名認証は自前で作る?
悩んだこと
-
railsに一般的なサーバーからレスポンスを返す感じでauth0を組み込もうとすると複数テナントを設定するのが難しかった
- 具体的にはinitializers/auth0.rb側で複数のテナントを読み込めなさそう ⇒ これはランタイムで設定可能ぽいので回避できるかも?
- buttonタグを置いて/auth/auth0にリクエストを投げた時に自動でリダイレクトが走るぽいがここの制御をコントロールできなそう(どのタイミングでテナントの設定読み込んでるのかわからなかった
- ポップアップで開くオプションが用意されてなさそう
-
reactを組み込んでる場合はreact側でauth0の認証を完結させるのが良さそう
- reactの場合はAuth0Providerコンポーネントで括った範囲はそのテナントの設定が適用される感じになりそう(複数テナント共存可能)
- loginWithPopupメソッドがある
- getAccessTokenSilentlyはaccess token周りを理解してないとjwt形式ではなくopaque tokenというやつが取得され、rails側のjwt検証が無限に弾かれてしまう、具体的にはaudience周りの設定をすることでjwtで取得できる
-
https://stackoverflow.com/questions/63247622/access-token-appears-to-be-incorrect-format-using-auth0-react-library
- ↑はProvider時点でaudienceを渡しているgetAccessTokenSlilently実行時に渡すのでもいける
-
https://stackoverflow.com/questions/63247622/access-token-appears-to-be-incorrect-format-using-auth0-react-library
- ローカル開発の時にリソースサーバーへのアクセスでConsent Requiredで怒られる、popupでリクエストするようにして回避
- reactのフルドキュメントらしい
-
最終的なApplication周りの設定イメージ
- Applications側で設定するのはreactから呼び出すやつ+Rails APIから呼び出すやつ(あとterraformのやつも一応いる)
- Application分割することで権限も分けれる(フロントとAPI
- APIs側で設定するのは↑のRails APIが利用するものだけ、audienceの設定はこいつを参照する
- ↑がsellerとbuyerでそれぞれあるイメージ(なのでrails側のjwtの検証処理も二つある
- Applications側で設定するのはreactから呼び出すやつ+Rails APIから呼び出すやつ(あとterraformのやつも一応いる)