web-dev-qa-db-fra.com

signe unique sur (sso) laravel

J'ai trois sites Web laravel différents, je souhaite que les utilisateurs se connectent à un site Web, puis il sera automatiquement connecté aux deux autres sites Web. Si vous vous êtes connecté à votre stackoverflow then open stackexchange , vous serez connecté avec le compte StackOverflow . La plupart des paquets basés sur SAML, je ne sais pas pourquoi cela ne fonctionnait pas avec moi? Je ne sais pas ce qui me manque? Existe-t-il une configuration pour que cela fonctionne? Je suis en utilisant laravel 5.6. Toutes les applications sont sur le même serveur.

J'ai essayé de nombreuses solutions basées sur SAML, OpenID et la session de partage, mais toutes ne fonctionnaient pas avec moi . Je ne sais pas si quelque chose me manque . ceci est le dernier exemple j'ai essayé et ça n'a pas marché

c'est mon code 

SITE 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');
});

SITE B (route/api.php)

    Route::post('/sessions/server', function (Request $request) {
    Storage::disk('local')->put('file.txt', $request->get('session_id'));
});

SITE 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!!
});

Tout ce que je veux, c'est me connecter sur site A puis ouvrir site B. Je serai connecté. J'accepterai toute solution permettant d'atteindre ce but.

7
Mo'auya Meghari

J'ai implémenté une solution SSO sans utiliser SAML. Je vais partager ma solution ici, espérons que cela aide. 

Authentification unique

Une application s'exécute en tant que serveur d'authentification principal à auth.domain. D'autres applications fonctionnent dans différents domaines app1.domain, app2.domain, ... 

Chaque utilisateur est lié à SSO tokens. Ces jetons ont des délais d'expiration très courts. Tous les processus d'authentification (connexion, réinitialisation des mots de passe, enregistrement, ...) se produisent uniquement dans l'application auth.domain.

Lorsqu'un utilisateur visite une application, par exemple, app-1.domain:

  1. Rediriger l'utilisateur vers auth.domain/login.
  2. Si l'utilisateur s'est déjà connecté à notre système auparavant, passez à étape 6.
  3. Afficher le formulaire de connexion, en attente d'une entrée valide.
  4. Générez un nouveau jeton SSO avec un délai d'expiration inférieur à 3 minutes.
  5. Joignez le cookie auth.domain Remember me à la réponse.
  6. Renvoie une réponse de redirection au app-1.domain/sso/{sso_token}.
  7. app-1.domain application a lu la base de données. Si le jeton SSO est valide et n'expire pas, recherchez l'utilisateur associé à ce jeton.
  8. app-1.domain authentifie l'utilisateur trouvé à l'étape précédente avec la méthode Auth::login($user).
  9. app-1.domain efface le jeton SSO reçu de la base de données.

Après cette étape, l'utilisateur est authentifié auprès de app-1.domain.

Partage de session

Toutes les variables de session partagées doivent être enregistrées dans des bases de données. J'ai mis en place un nouveau pilote de session:

  • Conserver la liste des noms de variables de session partagées
  • Lors de la lecture/écriture dans les sessions, vérifiez le nom de la variable de session. Si ce nom est la liste précédente, lisez/écrivez la valeur de la base de données. Sinon, utilisez la session privée de chaque application.
1
Hieu Le

Si vos deux applications partagent les mêmes bases de données, vous pouvez suivre l'approche:

-> Dans votre base de données, créez un identifiant de session par défaut qui sera marqué comme faux initialement

-> Dès que l'utilisateur se connecte à l'un des sites, générez un nouveau hachage et remplacez-le par la valeur par défaut.


éventuellement

-> Vous pouvez également enregistrer le hachage sur la mémoire de stockage locale du navigateur avec hash comme clé et null comme valeur.


-> Maintenant, lorsque l'utilisateur se connecte/passe sur un site, vérifiez que le hachage -> Si le hachage correspond à la valeur par défaut, affichez la page de connexion, sinon affichez la page de profil.


Ma réponse est valide uniquement si vous utilisez une base de données commune pour la connexion, sinon vous avez besoin d'un mappage pour cela.


Vous pouvez également utiliser des cookies pour stocker du hachage et y accéder de manière transversale . Vous trouverez des exemples à l'adresse Cookies interdomaines De @ludovic.

0
Rnayak