chenming1337 / keycloak
Keycloak OAuth2 提供商用于 Laravel Socialite
dev-master / 1.0.x-dev
2020-06-29 04:39 UTC
Requires
- php: ^7.1.3
- firebase/php-jwt: ^5.0
- league/oauth2-client: ^2.4
- socialiteproviders/manager: ^3.3
This package is auto-updated.
Last update: 2024-09-29 05:29:50 UTC
README
安装
clone : git clone https://github.com/chenming1337/keycloak.git
installing package : composer require chenming1337/keycloak
需求
Download latest keycloak server repository from https://keycloak.com.cn/ and setup keycloak server at admin console.
环境设置
在 '/config/services.php' 文件中添加以下键数组。
'keycloak' => [ 'authServerUrl' => env('KEYCLOAK_AUTHSERVERURL'), 'realm' => env('KEYCLOAK_REALM'), 'clientId' => env('KEYCLOAK_CLIENTID'), 'clientSecret' => env('KEYCLOAK_CLIENTSECRET'), 'redirectUri' => env('KEYCLOAK_REDIRECTURI'), 'encryptionAlgorithm' => env('KEYCLOAK_ENCRYPTIONALGORITHM'), 'encryptionKeyPath' => env('KEYCLOAK_ENCRYPTIONKEYPATH'), 'encryptionKey' => env('KEYCLOAK_ENCRYPTIONKEY'), ]
Laravel AppServiceProvider
在 /app/Providers/AppServiceProvider.php 文件中添加以下代码,该代码有助于将 keycloak 作为社交提供者执行。
use Avdevs\Keycloak\KeycloakProvider;
在 boot() 方法中,添加以下代码
$this->bootKeycloakSocialite();
添加函数
private function bootKeycloakSocialite() { $socialite = $this->app->make('Laravel\Socialite\Contracts\Factory'); $socialite->extend( 'keycloak', function ($app) use ($socialite) { $config = $app['config']['services.keycloak']; return new KeycloakProvider($config); } ); }
Laravel 函数和路由
use Socialite;
Route::get('/redirect/{provider}', 'ProviderAuthController@redirectToProvider'); /** * Redirect to keycloak server. * @provider * @return */ public function redirectToProvider($provider) { /* where $provider = 'keycloak' */ return Socialite::driver($provider) ->stateless() ->scopes([]) // Array ex : name ->redirect(); }
Route::get('/callback/{provider}', 'ProviderAuthController@CallbackFunction'); /** * retrieve user information which is located at keycloak serve. * @provider * @return */ public function CallbackFunction($provider) { /* where $provider = 'keycloak' */ $userData = Socialite::driver($provider) ->stateless() ->user(); /* Note : */ /* 1) Callback url is same for login and logout request. so this function executed twice. */ /* 2) Must add below code, Because user data not retrieved while logout calls is requested. */ if(!isset($userData->email)){ return redirect()->back(); } /* your logic for add or get user detail */ }
Route::get('/logout/{provider}', 'ProviderAuthController@ProviderLogout'); /** * Log the user out of the application. * @provider * @return void */ public function ProviderLogout($provider) { /* where $provider = 'keycloak' */ /* logout from laravel auth */ Auth::logout(); /* redirect to keycloak logout url */ return redirect( Socialite::driver($provider) ->getLogoutUrl() ); }