🔑

Laravel JetstreamにSNS認証を3分で導入する

2022/02/12に公開

はじめに

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 を編集する

services.php
    'github' => [
        'client_id' => env('GITHUB_CLIENT_ID'),
        'client_secret' => env('GITHUB_CLIENT_SECRET'),
        'redirect' => env('APP_URL') . '/github/callback',
    ],

.envに上記設定から参照する GITHUB_CLIENT_IDGITHUB_CLIENT_SECRET を追記する

.env
GITHUB_CLIENT_ID="xxxxx"
GITHUB_CLIENT_SECRET="xxxxx"

以上です。たったこれだけで以下のように会員登録画面からGitHubのアイコンをクリックするだけで、GitHubとの連携が行われ登録が完了するようになります。

また、マイページでは以下のように、GitHubと連携していることが一目でわかるパネルが追加されています。

Twitter認証を追加する

デフォルトではGitHubのみですが、海外ではメジャーなOAuthは網羅されています。今回はTwitterを追加する流れを解説します。

config/services.php.envを編集する

GitHubの時と同じく、services.phpに以下のように設定を追加します。また.envに各環境変数を追加し値をセットします。

services.php
    'twitter' => [
        'client_id' => env('TWITTER_CLIENT_ID'),
        'client_secret' => env('TWITTER_CLIENT_SECRET'),
        'redirect' => env('APP_URL') . '/twitter/callback',
    ],
.env
TWITTER_CLIENT_ID="xxxxx"
TWITTER_CLIENT_SECRET="xxxxx"

config/socialstream.php を編集する

Twitter用のProviderを追加するため、以下のように行を追加します。これはGitHubの設定をしたときには必要なかった手順です。

socialstream.php
     'providers' => [
         Providers::github(),
+        Providers::twitter(),
     ],

Email無しでもアカウントを作成できるよう設定を変更する

TwitterはAPIの設定次第ではメールアドレスを取得できないため、メールアドレス無しでもアカウントを作成できるようsocialstream.phpの設定を変更します。 具体的には、Features::generateMissingEmails()のコメントアウトを外します。

socialstream.php
    'features' => [
        // Features::createAccountOnFirstLogin(),
        // Features::generateMissingEmails(),
        Features::rememberSession(),
        Features::providerAvatars(),
    ],

以上で、Twitterアカウントでも登録が可能となります。

プロフィール画面では、Twitterとの連携が可能となるようアイコンとconnectボタンが追加されます。

2つ以上連携した状態だと、REMOVEボタンが表示されます。

対応しているSNS

今回はデフォルトのGitHubとTwitterへの接続のみでしたが、Socialstreamではその他に以下のようなサービスと連携可能です。

  • google
  • facebook
  • LinkedIn
  • GitLab
  • Bitbucket

さいごに

個人開発やポートフォリオ作成時には、会員登録やログインを簡略化する意味でOAuth周りの機能はあったほうが良いです。しかし、Socialiteを用いた従来の方法では、導入後の手間が大きく気軽に導入するのは厳しいです。その点、本パッケージなら本当に少ない手間でOAuth周りの機能を導入できてしまうので、 ぜひ覚えておいて欲しいです。

Discussion