実務でLaravelで複数のアプリを作成し、アプリ同士でログイン連携をさせるという機能が実務であったため、メモします。
例えばhttp://example.comという売上管理のアプリでログイン認証をしており、ログイン後、http://customer.examle.comにもそのログイン状態が引き継ぎたいという状態です。
例えば顧客管理のアプリを別管理していて、売上管理アプリの内部からリンクで繋げたい場合などがそうです。
どちらかというとメインとなるアプリがあり(この場合でいうと売上管理)、そこでログインした後、サブのアプリ(この場合、顧客管理)にもログインを引き継ぐというケースが多いかと思います。
Contents
やるべきこと
sessionはdatabase
当たり前ですが、sessionはDBでないと引き継げないのでDBにしましょう。
具体的には.envで
1 |
SESSION_DRIVER=database |
と設定してあげれば大丈夫です。
APP_KEYを同一にする
内部はブラックボックス化されており、どういう連携を取っているかはわかりませんが、ログイン連携をするにはLaravelのAPP_KEYを同一にする必要があります。
私が試したケースではメインのAPP_KEYにサブのAPP_KEYを書き換えて合わせました。(*メインは通常のphp artisan key:generate
で生成)
SESSION_DOMAIN
サブのアプリはサブドメインで運用していますので、ドメイン間でクッキーを共通化できるようにしておきましょう。
おそらくドメインが共通でないと無理かと思います。
今回のドメインの例だとサブのアプリの.envに
SESSION_DOMAIN=example.com
と設定してあげればOKです。
認証テーブルはconnectionを切り替えて設定
Laravelではconnectionを切り替えることで複数のデータベース間に接続をすることができますので、認証で使うモデルにメインのアプリのconnecitonを設定してあげればOKです。
.env
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'connections' => [ 'default' => 'mysql', 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], //下記がサブの接続 'sub_connection' => [ 'driver' => 'mysql', 'host' => env('SUB_HOST', 'localhost'), 'database' => env('SUB_DATABASE', 'forge'), 'username' => env('SUB_USERNAME', 'forge'), 'password' => env('SUB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], |
User.php(例えばこのモデルを認証で使う場合)
1 2 3 4 5 6 |
class User extends Authenticatable { use Notifiable; protected $connection = 'sub_connection'; protected $table = 'users'; |
注意点
Laravelのバージョンにより認証方法のロジックが変わるようで、2つのアプリのバージョンに注意しましょう。
メイン 5.4.36
サブ 5.5.41
はOKだったのですが、サブを5.5.44にあげたら認証ロジックが変わったようでunserialize(): Error at offset 0 of 40 bytes
なるエラーが発生してログイン連携ができませんでした。
[…] Laravelでのアプリ間でのログイン連携 […]