Rails API + React で作る SPA の認証方法について考えてみた
結論
Devise Token Auth
を使うのが良いと思う。
無理に cognito とか使うとかえって辛いかもしれない。
何を考えたか
Rails API モード + React フロントエンド っていう構成は結構あると思うのですが、その際の認証方法について気になりました。
Railsは RDB を使うのが前提で、大体 User モデルとかがあったりしますよね。
cognito などを使って認証をしたとしても、RDB の方には User モデルが必要になることには変わり無いと思います。
user に紐づいた投稿などが存在するからです。
cognito はあくまでも認証用のサービスなので、ここに保存されているメールアドレスなどのユーザ情報をアプリケーションの機能として使うのは微妙です。
確か cognito 公式としても推奨してなかったと思います。
調べていると cognito が払い出した認証トークンをRails側で別のトークンに交換して使うようなのも見かけました。
ちょっとめんどくさいですね。。。
確かに devise は認証方法として email & password を前提にしていて、電話番号などの幅広い認証情報に対応しにくいというのが課題ではあるのですが、そこが許容できるのであれば Devise Token Auth
を使うのがシンプルで結局楽なのかなと思いました。
OmniAuth
を使って Google などの IDプロバイダを使った認証機能を追加することもできますしね。
いつものRailsの感覚で認証機能を扱えます。
Devise Token Auth って?
みんな大好き devise をトークンベースで利用できるようにしたものです。
普通の devise ならサインアップ画面から情報を入力してメールが飛んできて。。。みたいなことになると思います。ビューのカスタマイズもできましたね。
それがこの Devise Token Auth
だと API エンドポイントに対してリクエストを送ることによってサインアップやログイン、ログアウトなどができるというものです。
なのでフロントでビューを作成して、サインアップボタンを押された時には API を叩くように実装すればOKです。
セットアップや概念も似ています。
普通の devise で使えるヘルパーメソッドなどは大体使えるようです。
before_action :authenticate_user!
current_user
らへんも使えるということです🙌
まとめ
私が分かっていないだけかもしれませんが、 cognito はやっぱりサーバーレスアーキテクチャにぴったりなサービスであって、あまりRailsとの相性は良くないのかな?という印象を受けました🧐
無理に cognito などを使うよりも、 Devise Token Auth
を使った方が早そうです。
Devise Token Auth
についての詳しい解説は、こちら の記事が非常に参考になりました😊
Discussion