Laravel JetstreamにSNS認証を3分で導入する
はじめに
LaravelにSNS認証(以降はOAuthと呼ぶ)を導入するときに必要なパッケージといえば、Socialite一択で、どのOAuthの解説記事もこのパッケージを導入した上で、ログイン機能を実装する方法を紹介して終わりです。たぶん。
しかし実際にやってみると、それだけでは一般的なOAuthの要件を満たしていないことに気づきます。会員登録は?SNSとの連携を切りたい場合は?などなど。
そうした面倒な実装を全て不要にし、OAuth周りの機能を一通り提供してくれるパッケージ、それが今回紹介するjoelbutcher/socialstreamです。
環境
- PHP 8.1.2
- Laravel 9.0.2
本記事で解説しないこと
- Jetstreamの導入方法
- 各サービスの連携キーの取得方法
Socialstreamをインストールする
インストールは、composerでインストールしてartisanコマンドを実行しアセット関連のファイルをビルドするだけです。
composer require joelbutcher/socialstream
php artisan socialstream:install
npm install && npm run dev
DBを更新する
Socialstreamでは認証時に、usersテーブルのパスワード欄にnullがセットされます。しかし、デフォルトのusersテーブルのパスワードはnullを許容していません。このため、usersテーブルの設定を変更します。実はSocialstreamインストール時に、usersテーブルのmigrationファイルは更新されていて、以下のような差分が生まれています。
ちなみにクラス名まで変わってしまったのは、Laravel8のマイナーアップデートで入ったmigrationの無名クラス実装がSocialstreamではまだ反映されていないせいです。
-return new class extends Migration
+class CreateUsersTable extends Migration
{
/**
* Run the migrations.
・・・
- $table->string('password');
+ $table->string('password')->nullable();
$table->rememberToken();
$table->foreignId('current_team_id')->nullable();
- $table->string('profile_photo_path', 2048)->nullable();
+ $table->foreignId('current_connected_account_id')->nullable();
+ $table->text('profile_photo_path')->nullable();
$table->timestamps();
データが消えてしまっても問題ない場合は、以下のコマンドを実行するだけで良いです。この時にSocialstreamが必要とする create_connected_accounts
テーブルも追加されます。
php artisan migrate:refresh
もし、usersテーブルを作り直したくないということであれば、テーブル定義変更用のmigrationファイルを自作するか、一度データをdumpしてからテーブルを作り直し、流し込む必要があります。
GitHub認証を設定する
インストールとテーブルの再構築が完了した後は、使用するサービスプロバイダに応じて設定を追加していくことになります。
config/services.php
を編集する
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => env('APP_URL') . '/github/callback',
],
.env
に上記設定から参照する GITHUB_CLIENT_ID
と GITHUB_CLIENT_SECRET
を追記する
GITHUB_CLIENT_ID="xxxxx"
GITHUB_CLIENT_SECRET="xxxxx"
以上です。たったこれだけで以下のように会員登録画面からGitHubのアイコンをクリックするだけで、GitHubとの連携が行われ登録が完了するようになります。
また、マイページでは以下のように、GitHubと連携していることが一目でわかるパネルが追加されています。
Twitter認証を追加する
デフォルトではGitHubのみですが、海外ではメジャーなOAuthは網羅されています。今回はTwitterを追加する流れを解説します。
config/services.php
と.env
を編集する
GitHubの時と同じく、services.php
に以下のように設定を追加します。また.env
に各環境変数を追加し値をセットします。
'twitter' => [
'client_id' => env('TWITTER_CLIENT_ID'),
'client_secret' => env('TWITTER_CLIENT_SECRET'),
'redirect' => env('APP_URL') . '/twitter/callback',
],
TWITTER_CLIENT_ID="xxxxx"
TWITTER_CLIENT_SECRET="xxxxx"
config/socialstream.php
を編集する
Twitter用のProviderを追加するため、以下のように行を追加します。これはGitHubの設定をしたときには必要なかった手順です。
'providers' => [
Providers::github(),
+ Providers::twitter(),
],
Email無しでもアカウントを作成できるよう設定を変更する
TwitterはAPIの設定次第ではメールアドレスを取得できないため、メールアドレス無しでもアカウントを作成できるようsocialstream.php
の設定を変更します。 具体的には、Features::generateMissingEmails()
のコメントアウトを外します。
'features' => [
// Features::createAccountOnFirstLogin(),
// Features::generateMissingEmails(),
Features::rememberSession(),
Features::providerAvatars(),
],
以上で、Twitterアカウントでも登録が可能となります。
プロフィール画面では、Twitterとの連携が可能となるようアイコンとconnectボタンが追加されます。
2つ以上連携した状態だと、REMOVEボタンが表示されます。
対応しているSNS
今回はデフォルトのGitHubとTwitterへの接続のみでしたが、Socialstreamではその他に以下のようなサービスと連携可能です。
- GitLab
- Bitbucket
さいごに
個人開発やポートフォリオ作成時には、会員登録やログインを簡略化する意味でOAuth周りの機能はあったほうが良いです。しかし、Socialiteを用いた従来の方法では、導入後の手間が大きく気軽に導入するのは厳しいです。その点、本パッケージなら本当に少ない手間でOAuth周りの機能を導入できてしまうので、 ぜひ覚えておいて欲しいです。
Discussion