複数のドメインでのシングルサインオンを実装しようとしています。概念は非常に単純です。つまり、一意のユーザートークンを送信し、これらのトークンを確認してユーザーを見つけ、ログインします。
トークンを確認してユーザーを取得した後、次のようにします
$loggedInUser = Auth::loginUsingId($user->id, true);
これで、ログインしたユーザーを最初にチェックするカスタムミドルウェアができました。
Auth::Check()
上記は初めて正常に動作します。ただし、更新時にAuth :: check()は検証されません。また、すべての異なるセッションドライバーを使用してみましたが、それでも機能しません。
laravel 5.2で同様のコードを使用しましたが、機能しましたが、laravel 5.3では、永続的なリクエストでは検証されません。
編集:コードを表示させてください AuthServiceProviderまたはその他のガードを変更していません。ディレクトリ内にユーザーモデルがありますが、auth.phpのパスを変更しました。
Domain1が指すルートは次のとおりです。
http://domain2.com/ {{$ role}}/{{$ route}}/singlesignon/{{$ token}}
次に、これは、loginController内のverifySingleSignOnメソッドによって取得されます。このメソッドは、ユーザーが他のドメインからアクセスした役割、ルート、およびトークンを引き受けます。その後、ユーザーは同じルートにリダイレクトされますが、domain2になります。ここでは、手動でログインする前にユーザーIDを正常に受信できます。
public function verifySingleSignOn($role, $route, $token)
{
// Fetch Single Signon
$userRepository = new UserRepository();
$user = $userRepository->checkForSingleSignOnToken($token, ['id']);
// Check if Token Exists
if (isset($user->id) && is_int($user->id) && $user->id != 0) {
// Manually Logging a user (Here is successfully recieve the user id)
$loggedInUser = Auth::loginUsingId($user->id);
if (!$loggedInUser) {
// If User not logged in, then Throw exception
throw new Exception('Single SignOn: User Cannot be Signed In');
}
$redirectTo = $role . '/' . $route;
return redirect($redirectTo);
} else {
return Auth::logout();
}
}
それから私はこのGlobalAdminAuthミドルウェアを持っています
// Check if logged in
if( Auth::Check() ){
$user = Auth::User();
// Check if user is active and is a globaladmin
if( !$user->isGlobalAdmin() || !$user->isActive() ){
return redirect()->guest('login');
}
}else{
return redirect()->guest('login');
}
return $next($request);
これで、初めてすべてが正常に機能し、ユーザーはミドルウェアを正常に移動します。ただし、2回目にelseステートメントがトリガーされます。
編集:checkForSingleSignOnTokenのコード
public function checkForSingleSignOnToken($token, $columns = array('*'))
{
return User::where('single_signon', $token)->first($columns);
}
Cookieはドメインごとに制限されています。 domain1.com
のアプリケーションは、domain2.com
によって設定されたCookieを取得できません。
Cookie以外のメカニズムを使用するようにガードをカスタマイズする必要があります。クエリパラメータでトークンを使用するかもしれません。
ミドルウェアでauth:checkを使用しない
request-> user()またはauth :: user()を使用する
これをprotected $middleware
のapp\Http\Kernel.php
配列に追加します
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class
フレームワークの更新と関係があると思います
以下のコード構造を確認してください。laravel 5.0で手動認証を行いました。
routes.php
Route::get('login_user_by_id/{id?}', ['as' => 'login_user_by_id', 'uses' => 'UsersController@login_user_by_id']);
Route::post('user_login_post_for_admin',['as'=>'user_login_post_for_admin','uses'=>'LoginController@user_login_post_for_admin']);
Route::get('user_logout', ['as' => 'user_logout', 'uses' => 'UsersController@user_logout']);
LoginController.php
public function user_login_post_for_admin(){
$this->set_email($_POST['email']);
$this->set_password($_POST['password']);
$this->set_login_requested_role(['Admin','Moderator']);
return $this->user_login_post();
}
public function user_login_post(){
$User = new User();
if(isset($this->email) && !empty($this->email)){
$User->set_email(trim($this->email));
$User->set_password(Hash::make(trim($this->password)));
$user_login_data = $User->check_email_password_for_login();
if(isset($user_login_data) && !empty($user_login_data)){
if (Hash::check(trim($this->password), $user_login_data[0]->password)) {
$response['user_id']=$user_login_data[0]->id;
$response['name']=$user_login_data[0]->name;
$response['surname']=$user_login_data[0]->surname;
$response['profile_picture']=$user_login_data[0]->profile_picture;
$response['SUCCESS']='True';
$response['MESSAGE']='Login Success.';
return Redirect::route('login_user_by_id',[$user_login_data[0]->id]);
}else{
Session::put('SUCCESS','FALSE');
Session::put('MESSAGE', 'Invalid Credential.');
return redirect()->back();
}
}else{
Session::put('SUCCESS','FALSE');
Session::put('MESSAGE', 'Invalid Credential.');
return redirect()->back();
}
}else{
Session::put('SUCCESS','FALSE');
Session::put('MESSAGE', 'Invalid Credential.');
return redirect()->back();
}
}
sersController.php
public function login_user_by_id($id=''){
if(isset($_GET['id'])&&!empty($_GET['id'])){
$id = $_GET['id'];
}
$User = new User();
$Log=new Log();
$user_for_auth = $User->find($id);
Auth::login($user_for_auth, true);
$User->id=AUTH::user()->id;
$auth_user_role=$User->auth_user_role();
$rl_title=$auth_user_role[0]->rl_title;
return Redirect::route('admin_home');
}
public function user_logout(User $user){
$User=new User();
$login_user_id = AUTH::user()->id;
$User->id=AUTH::user()->id;
$auth_user_role=$User->auth_user_role();
$login_user_role=$auth_user_role[0]->rl_title;
$response['user_id']=$login_user_id;
$response['SUCCESS']='TRUE';
$response['MESSAGE']='Successfully Logout.';
Auth::logout();
return Redirect::route('admin_login');
}