web-dev-qa-db-ja.com

シングルサインオン(sso)laravel

私は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を開くだけですサインインします。その目的を達成するソリューションを受け入れます

9
Moauya Meghari

SAMLを使用せずにSSOソリューションを実装しました。ここで私の解決策を共有します。

シングル・サインオン

1つのアプリケーションが_auth.domain_でメイン認証サーバーとして実行されます。他のアプリケーションは異なるドメインで実行されます_app1.domain_、_app2.domain_、...

すべてのユーザーはSSOトークンでリンクされています。これらのトークンの有効期限は非常に短いです。すべての認証プロセス(サインイン、パスワードのリセット、登録など)は_auth.domain_アプリケーションでonlyで行われます。

ユーザーがアプリケーションにアクセスしたとき、たとえば、_app-1.domain_:

  1. ユーザーを_auth.domain/login_にリダイレクトします。
  2. ユーザーが以前にシステムにログインした場合は、手順6に進みます。
  3. サインインフォームを表示し、有効な入力を待ちます。
  4. 有効期限が3分未満の新しいSSOトークンを生成します。
  5. _auth.domain_覚えているcookieを応答に添付します。
  6. _app-1.domain/sso/{sso_token}_へのリダイレクト応答を返します。
  7. _app-1.domain_アプリケーションがデータベースを読み取ります。 SSOトークンが有効で期限が切れていない場合は、そのトークンに関連付けられているユーザーを見つけます。
  8. _app-1.domain_は、前の手順で見つかったユーザーをAuth::login($user)メソッドで認証します。
  9. _app-1.domain_データベースから受信したSSOトークンをクリアします。

このステップの後、ユーザーは_app-1.domain_に対して認証されます。

セッション共有

すべての共有セッション変数はデータベースに保存する必要があります。新しいセッションドライバーを実装しました。

  • 共有セッション変数名のリストを保持する
  • セッションの読み取り/書き込みを行うときは、セッション変数の名前を確認してください。その名前が前のリストである場合、データベースから値を読み書きします。それ以外の場合は、各アプリケーションのプライベートセッションを使用します。
1
Hieu Le

両方のアプリケーションが同じデータベースを共有している場合は、アプローチに従うことができます。

->データベースで、最初にfalseとマークされるデフォルトのセッションIDを作成します

->ユーザーがいずれかのサイトにログインするとすぐに、新しいハッシュを生成してデフォルト値に置き換えます。


オプションで

->ハッシュをキーとして、値としてnullを使用して、ブラウザのローカルストレージに保存することもできます。


->ユーザーがいずれかのサイトにログインまたは切り替えているときに、そのハッシュを確認します->ハッシュがデフォルトと一致する場合は、ログインページを表示します。それ以外の場合は、プロファイルページを表示します。


ログインに共通データベースを使用している場合にのみ、私の回答は有効です。それ以外の場合は、このためのマッピングが必要です。


あるいは、Cookieを使用してハッシュを保存し、クロスドメインでそれらにアクセスできます。 Cross-Domain Cookies で例を見つけることができますBy @ludovic

0
Rnayak