Auth0のAuthenticationAPIを使ってサインアップ、サインインを実装する

June 19th, 2020

IDaaS触っときたいな感があって、もともと認証はいらないと思ってた個人PJに認証やっぱいるじゃんみたいな雰囲気が出てきたのでこのタイミングで使ってみることにした。

RoR APIモード向けのドキュメントはこちら。

なんだけどこれは使いません。

ちなみにAPIモードじゃないフルスタックWebアプリケーション向けのRoRドキュメントもあります。

もちろんこれも使いません。

普通にAPIを叩いて使いたい

ので

を使います。

なんでAPIを叩きたいかというとjwt周りのコードを入れ込みたくなかったし、IDaaSで認証周りのコストを下げたいのにコード量は結構ボリュームが有る & 読むの大変そうだったので避けたい感じでした。

このライブラリを使えばManagementAPI(管理用のやつ)とAuthenticationAPI(ユーザ認証周りのやつ)のどちらも使えるので、雑にこういうサービスクラスを書いちゃえばそれだけで動きます。

# frozen_string_literal: true

class Auth0::Signer
  def signup!(email:, password:)
    client.signup(email, password)
  end

  def signin!(email:, password:)
    client.login_with_resource_owner(email, password)
  end

  private

  def client
    @client ||= Auth0Client.new(
      client_id: Rails.application.credentials.dig(:auth0, :client_id),
      client_secret: Rails.application.credentials.dig(:auth0, :client_secret),
      # If you pass in a client_secret value, the SDK will automatically try to get a
      # Management API token for this application. Make sure your Application can make a
      # Client Credentials grant (Application settings in Auth0 > Advanced > Grant Types
      # tab) and that the Application is authorized for the Management API:
      # https://auth0.com/docs/api-auth/config/using-the-auth0-dashboard
      #
      # Otherwise, you can pass in a Management API token directly for testing or temporary
      # access using the key below.
      # token: ENV['AUTH0_RUBY_API_TOKEN'],
      domain: Rails.application.credentials.dig(:auth0, :client_domain),
      api_version: 2,
      timeout: 15 # optional, defaults to 10
    )
  end
end

以下ソースが主にAPIのラッパーなので参考になります。

ただこのやり方にするとユニバーサルログインとかが使えなくなると思うので、もし必要になった場合は認証周りのIFを書き直す必要がありそう。

Authorization server not configured with default connection.

普通にやってるとこのエラーが出ます。

この問題クソわかりづらくて、アカウント設定の Default Directory を変更すれば通るようになります。

Screen Shot 2020-06-20 at 10.02.21

この値はデフォだと空なんだけど、Auth0はデータを格納するDBを複数作ったり自前で用意できたりしていて、APIを通して使う場合は「どれを使うの」っていうのを明示しないとだめみたい。

APIを通してっていうか、このライブラリ自体がそこのサポートが弱いからっぽい?

Auth0どう?

まだ実装しただけなのでろくに理解してないんだけど、良かったのはこの辺。

  • ユニバーサルログイン、もし必要になったら自前実装死ぬと思うのでかなり有益っぽい
  • アクティビティ(ログインとか)を可視化してくれるの便利
  • ユーザにメタデータをつけられるの良さそう
  • フルスタックWebアプリケーションの場合はとくに実装が簡単そうだった

    • 社内システムとかで認証と権限を統合したい場合とかはかなり使い物になりそう
  • APIをラップした薄いgemがあるのでかなり実装が楽だった、コード量もめちゃくちゃ少なく済んで嬉しい。

困ったのはこのくらい。

  • without emailでログインができない

    • これはまあしょうがないんだけど、認証を雑にしていいPJなのでメールアドレスを入力させたくないなという気持ちがあったんだけど技術的に無理とのことなので諦めて従うことにした
    • Can you login without an email?
    • ユーザの負担は増えるけどまあバックエンドで吸収できるレベルなので良いかなという感じ。
  • Gemのドキュメントがほぼ無いに等しい
  • この記事にもいくつか貼ったドキュメントのページが糞重い、Reactの実装ぽいけど実装時が悪いのか?

    • メモリ32GB積んでるMBPのChromeでガクガクになるレベルで重い
    • ただこれはFirebaseAuthのドキュメントもそうだった、このPCが悪いのか?

少なくとも自前実装よりは実装コストが減ったのでやっぱりIDaaSは1回触る価値あるなって思った。 他のプラットフォームもどんなもんなのか知見ほしいところ。

そういやAuth0からFirebaseAuthに人が流れまくってるらしいですね、この辺は動向追っとか無いとProduction Readyの経験値にならないのでこれからも追っておきたい。

AUTHOR

Daisuke Tsuji
Daisuke Tsuji@dim0627

フリーのWeb Developer。

RubyとかRailsを触ってる時間が多い。コーディングもマークアップもライティングもデザインもSEOもやるタイプ。

だいたいどれもだめ。