✏️

【Rails7】【Sorcery_Externalモジュール】Google認証・LINE認証などの外部認証を実装する時の注意点

2024/10/03に公開

はじめに

Railsの認証ライブラリであるSorceryのExternalモジュールを用いて、外部認証であるGoogle認証とLINE認証を両方実装する機会がありました。
実装する中で感じた、注意点をまとめます。

前提:SorceryのExternalモジュールとは

"external"を英語に訳すと、「外部の」という意味です。
Sorceryをベースに、Google認証、LINE認証などの外部認証を取り入れることができる機能です。
具体的な実装方法は、Railsの認証ライブラリであるSorceryの公式ドキュメントのwikiに記載されています。
https://github.com/Sorcery/sorcery/wiki/External

ざっくりした流れをまとめると、下記の通りです。


①SorceryのExternalモジュールをインストールする
②Authenticationテーブルと、中身のカラムを作成する(wikiに記載の通り)
config/initializers/sorcery.rb内にて、使用する外部認証それぞれに関するキー、コールバックURL等の記載をする(使用する外部認証の例:Google, LINE. Facebook, Twitterなど)
app/models/user.rb, app/models/authentication.rbそれぞれでhas_manyやbelongs_toの設定を行い、UserモデルとAuthenticationモデルを紐づける
⑤Viewページで、外部認証をするためのリンクを設置する
⑥oauthsコントローラーを作成し、外部認証の情報を受け取ってからログイン処理が完了するまでの処理を記述する(wikiに記載の通り)
⑦config/routes.rbに、今回の実装で関連するルーティングを記載する(wikiに記載の通り)

③の部分では、各外部認証の開発者向けサイト経由で、登録・キーの取得・コールバックURLの設定等を行う必要があります。
Google認証、LINE認証のそれぞれの設定に関しては下記記事を参考にさせていただきました。

Google認証
https://zenn.dev/yoiyoicho/articles/c44a80e4bb4515#google-apiの設定を行う
LINE認証
https://qiita.com/tarakish/items/a4c73104375878ad61c5


実装する上で気をつけるべき点

①メールアドレス・パスワードを用いた基本ログイン機能(Simple Password Authentication)を実装した上でないと、Externalモジュールは使用できない

In this tutorial we will build upon the app created at Simple Password Authentication so make sure you understand it.

wikiに上記の記載がある通り、Externalモジュールは、Simple Password Authenticationを用いたアプリであることが前提となっています。
Simple Password Authenticationで作成したuserテーブルとカラムは残しておく必要があります。

Simple Password Authentication
https://github.com/Sorcery/sorcery/wiki/Simple-Password-Authentication

②複数の外部認証を設定する時は、config.external_providersの値に気をつける

config/initializers/sorcery.rb内では、config.external_providersで使用する外部認証の種類を指定する必要があります。
ここでの指定が抜けていると、ログインがうまくいかない原因になるので注意が必要です。
下記のように、デフォルトのコメントアウトでも記載例が載っているので参考にしましょう。

# config/initializers/sorcery.rb

# -- external --
# What providers are supported by this app
# i.e. [:twitter, :facebook, :github, :linkedin, :xing, :google, :liveid, :salesforce, :slack, :line].
# Default: `[]`
#
config.external_providers = [:google, :line]

③外部認証の設定をする際は、コメントアウトされた設定例を活用する

config/initializers/sorcery.rbで外部認証の設定をする際、主要な外部認証の種類は、下記のようにデフォルトのコメントアウトで記載されています。
使用する外部認証の種類を見つけて、コメントアウトを外すことで設定を進めることができます。
設定でのミスを減らすためにも、コメントアウトの内容を活用しましょう。

#下記に記載の外部認証以外にも、googleやlineなど多数記載

# Twitter will not accept any requests nor redirect uri containing localhost,
  # Make sure you use 0.0.0.0:3000 to access your app in development
  #
  # config.twitter.key = ""
  # config.twitter.secret = ""
  # config.twitter.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=twitter"
  # config.twitter.user_info_mapping = {:email => "screen_name"}
  #
  # config.facebook.key = ""
  # config.facebook.secret = ""
  # config.facebook.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=facebook"
  # config.facebook.user_info_path = "me?fields=email"
  # config.facebook.user_info_mapping = {:email => "email"}
  # config.facebook.access_permissions = ["email"]
  # config.facebook.display = "page"
  # config.facebook.api_version = "v2.3"
  # config.facebook.parse = :json
  #
  # config.instagram.key = ""
  # config.instagram.secret = ""
  # config.instagram.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=instagram"
  # config.instagram.user_info_mapping = {:email => "username"}
  # config.instagram.access_permissions = ["basic", "public_content", "follower_list", "comments", "relationships", "likes"]
  #
  # config.github.key = ""
  # config.github.secret = ""
  # config.github.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=github"
  # config.github.user_info_mapping = {:email => "name"}
  # config.github.scope = ""

user_info_mappingでは、userテーブルの各カラムに割り当てる値を指定する

config/initializers/sorcery.rbの中で、user_info_mappingの値を設定する箇所があります。
user_info_mappingの部分では、emailカラムに、メールアドレス以外の情報を割り当てることが可能です。

今回LINE認証では下記のように記載し、LINEアカウントから取得したユーザーIDをemailカラムに割り当てました。

config.line.user_info_mapping = { name: 'displayName', email: 'userId' }

※今回自分が実装していたアプリではemailカラムにnull: falseを設定していたため、emailカラムを空にするとエラーが出てしまうという理由もあります。

各外部認証のユーザープロフィールからどのような種類の値が取得できるかは、開発者向けサイトで確認ができます。
例:LINE認証 ユーザープロフィールを取得した時のレスポンス一覧
https://developers.line.biz/ja/reference/line-login/#get-profile-response

email:の部分にメールアドレスを割り当てたい場合は、各外部認証の開発者向けサイトで「メールアドレスを取得するための申請」が必要な場合があります。例として、LINE認証におけるメールアドレス取得申請方法は下記ドキュメントに記載されていました。

例:LINE認証 メールアドレス取得申請
https://developers.line.biz/ja/docs/line-login/integrate-line-login/#applying-for-email-permission

まとめ

SorceryのExternalモジュールを用いた外部認証の実装では、
①SorceryのExternalモジュール自体の設定を、公式wikiを確認しながら実装
②Google・LINE等、各外部認証の開発者向けサイトにて、認証機能を使うための設定(キーの取得、コールバックURLの設定等を含む)を行う

上記2点を行う必要があります。

また、外部認証を実装する際は、「自分はどの認証ライブラリを使用しているか(orそもそも使用していないのか)」を把握することも大切です。
今回はSorceryのExternalモジュールを用いる際の実装方法について記述しましたが、DeviseやOmniAuthなど、他の認証ライブラリを使用している場合は各ライブラリの公式ドキュメントを参照して実装する必要があります。

また、各外部認証の開発者向けサイトにも実装方法が記載されていますが、その場合は「認証ライブラリを使用しない場合の実装方法」を記載している場合が多いと思います。
認証ライブラリを使用せずに、開発者向けサイトのドキュメントに沿ってLINE認証を実装した例がありましたので、参考として記載します。
https://zenn.dev/yoiyoicho/articles/974c73ac75c100

最後までお読みいただき、ありがとうございました。

参考資料・引用資料

Sorcery Externalモジュール 公式wiki
【Rails7】Googleログインを公式ドキュメントに沿って実装する
【Rails】Sorceryで外部認証 〜LINE編〜
Sorcery Simple Password Authentication 公式wiki
LINEログイン v2.1 APIリファレンス ユーザー情報を取得する
ウェブアプリにLINEログインを組み込む メールアドレスの取得権限を申請する
【Rails7】LINEログインを公式ドキュメントに沿って実装する

Discussion