私は3つの異なるlaravel Webサイトを持っています。1つのWebサイトにユーザーをサインインさせたい場合、他の2つのWebサイトに自動的にログインします。たとえば、あなたが自分でログインした場合 stackoverflow 次に開く stackexchange StackOverflowアカウントでログインします。多くのパッケージを試しましたが、それらは無限の例外で終了するか、単に機能しません。SAMLベースのほとんどのパッケージ、なぜ私と一緒に動作しなかったのか分かりませんか?何が欠けているのかわかりませんか?これが機能するための設定はありますか?laravel 5.6。すべてのアプリは同じサーバー上にあります。
私はSAML、OpenID、共有セッションに基づく多くのソリューションを試しましたが、それらすべてが私と一緒に機能しませんでした。私は何かを逃したかどうかわかりません。 これが最後の例です 試してみましたが、うまくいきませんでした
これは私のコードです
サイトA
$site_b = 'http://s_sesstion_2.test/';
Route::get('/', function (Request $request) use ($site_b) {
$session_id = Session::getId();
try {
$http = new Client();
$response = $http->post($site_b . 'api/sessions/server', [
'form_params' => [
'session_id' => $session_id,
],
'headers' => [
'Accept' => 'application/json',
]
]);
} catch (Exception $e) {
dd($e->getMessage());
}
return view('welcome');
});
サイトB(route/api.php)
Route::post('/sessions/server', function (Request $request) {
Storage::disk('local')->put('file.txt', $request->get('session_id'));
});
サイトB(route/web.php)
Route::get('/', function () {
$session_id = Storage::disk('local')->get('file.txt');
Session::setId($session_id);
Session::start();
//return Session::getId();// will return the same session id
return \auth()->user();//this should return the auth user but it did not!!
});
サイトAにサインインしてからサイトBを開くだけですサインインします。その目的を達成するソリューションを受け入れます
SAMLを使用せずにSSOソリューションを実装しました。ここで私の解決策を共有します。
1つのアプリケーションが_auth.domain
_でメイン認証サーバーとして実行されます。他のアプリケーションは異なるドメインで実行されます_app1.domain
_、_app2.domain
_、...
すべてのユーザーはSSOトークンでリンクされています。これらのトークンの有効期限は非常に短いです。すべての認証プロセス(サインイン、パスワードのリセット、登録など)は_auth.domain
_アプリケーションでonlyで行われます。
ユーザーがアプリケーションにアクセスしたとき、たとえば、_app-1.domain
_:
auth.domain/login
_にリダイレクトします。auth.domain
_覚えているcookieを応答に添付します。app-1.domain/sso/{sso_token}
_へのリダイレクト応答を返します。app-1.domain
_アプリケーションがデータベースを読み取ります。 SSOトークンが有効で期限が切れていない場合は、そのトークンに関連付けられているユーザーを見つけます。app-1.domain
_は、前の手順で見つかったユーザーをAuth::login($user)
メソッドで認証します。app-1.domain
_データベースから受信したSSOトークンをクリアします。このステップの後、ユーザーは_app-1.domain
_に対して認証されます。
すべての共有セッション変数はデータベースに保存する必要があります。新しいセッションドライバーを実装しました。
両方のアプリケーションが同じデータベースを共有している場合は、アプローチに従うことができます。
->データベースで、最初にfalseとマークされるデフォルトのセッションIDを作成します
->ユーザーがいずれかのサイトにログインするとすぐに、新しいハッシュを生成してデフォルト値に置き換えます。
オプションで
->ハッシュをキーとして、値としてnullを使用して、ブラウザのローカルストレージに保存することもできます。
->ユーザーがいずれかのサイトにログインまたは切り替えているときに、そのハッシュを確認します->ハッシュがデフォルトと一致する場合は、ログインページを表示します。それ以外の場合は、プロファイルページを表示します。
ログインに共通データベースを使用している場合にのみ、私の回答は有効です。それ以外の場合は、このためのマッピングが必要です。
あるいは、Cookieを使用してハッシュを保存し、クロスドメインでそれらにアクセスできます。 Cross-Domain Cookies で例を見つけることができますBy @ludovic