Keycloakを使ってLaravelでSSOを実現

# LaravelでKeycloakを用いてSSOを実現する

以下のように、KeycloakとLaravelとを別のPCで構築し、SSOで連携の上で、Laravel側でログインユーザの属性（カスタム属性を含む）情報を取得するまでの動作を確認した。この記事ではKeycloak側の構築手順も記載しているが、主となるのはLaravel側の手順となる。
* Keycloak
    * Windows10
    * WSL2
* Laravel
    * Windows11
    * WSL2

# Keycloak設定

以下Keycloak用のPCでの作業となる。

## ダウンロードと起動

以下に記述があるようにWSL2上でKeycloakコンテナを開始する。執筆時点で最新は25.0.2であった。docker desktopでも同様のことはできると思うが、使ったことがないのでわからない。

https://www.keycloak.org/getting-started/getting-started-docker

	docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:25.0.2 start-dev

コンテナを停止してもデータを残したい（永続化する）ならば、例えば以下のようにvolumeを指定して、Keycloakコンテナを開始する。

    docker run -v keycloak:/opt/keycloak/data -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:25.0.2 start-dev

以下のようなメッセージがでたら起動している。

	2024-08-19 05:59:47,197 WARN  [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.

## admin ログイン
ブラウザで http://localhost:8080 にアクセスする。

![FireShot Capture 238 - Sign in to Keycloak - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/49bb27b3-02d6-b536-e68a-d0cc2da34f84.png)

`Username or email`/`Password`に`admin`/`admin`をセットして`Sign in`する。

![FireShot Capture 239 - Sign in to Keycloak - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/ae3a8cd0-bba9-013a-787b-f9603bcb0b75.png)

ログイン（Sign in）できた。

![FireShot Capture 240 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/1a02a96f-09c3-6fed-3ecc-55510f89f956.png)

## realm作成

ナビゲーションメニューの`Keycloak`ドロップリストを展開して`Create Realm`ボタンをクリックする。ちなみにRealmはレルムと読むらしい。

![FireShot Capture 241 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/1b365add-1ee7-1069-4366-b8b40206ab1a.png)

Create realm画面に遷移する。`Realm name`テキストボックスに`myrealm`と入力し`Create`ボタンをクリックする。

![FireShot Capture 242 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/8e00e87a-132f-418b-9645-8f6529085f70.png)

## realm設定の変更

ナビゲーションメニューの `Realm settings`項目をクリックしてrealm settings画面を開く。

![FireShot Capture 277 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/8a922e82-db10-b730-0339-e36577790c09.png)

### User profile

ページ内のタブ上の`<`, `>`ボタンを使って`User profile`タブを探し、選択する。

![FireShot Capture 278 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/aa177b0d-8d5e-6eec-2793-340c3db82ef0.png)

#### user_address

`Create attribute`ボタンをクリックして、Create attribute画面を表示する。

以下のように項目をセットし`Create`ボタンをクリックする。

- `Attribute [Name]:` user_address
- `Display name:` ${user_address}
- `Multivalued:` Off
- `Attribute group:` None
- `Enabled when:` Always
- `Required field:` Off
- `Permission Who can edit?` `User:` Off, `Admin:` On
- `Permission Who can view?` `User:` On, `Admin:` On

![FireShot Capture 279 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/8d14afcc-12d3-4d5e-3323-474385ea69e5.png)

### gender_code

前項と同様に`Create attribute`ボタンをクリックして、Create attribute画面を表示する。

以下のように項目をセットし`Create`ボタンをクリックする。

- `Attribute [Name]:` gender_code
- `Display name:` ${gender_code}
- `Multivalued:` Off
- `Attribute group:` None
- `Enabled when:` Always
- `Required field:` Off
- `Permission Who can edit?` `User:` Off, `Admin:` On
- `Permission Who can view?` `User:` On, `Admin:` On

### birth_date

前項と同様に`Create attribute`ボタンをクリックして、Create attribute画面を表示する。

以下のように項目をセットし`Create`ボタンをクリックする。

- `Attribute [Name]:` birth_date
- `Display name:` ${birth_date}
- `Multivalued:` Off
- `Attribute group:` None
- `Enabled when:` Always
- `Required field:` Off
- `Permission Who can edit?` `User:` Off, `Admin:` On
- `Permission Who can view?` `User:` On, `Admin:` On

## Client作成

ナビゲーションメニューの`Clients`要素をクリックする。

![FireShot Capture 243 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/b8e995fc-0f69-4d9b-96f6-47bec6175e2d.png)

Clients画面に遷移する。

![FireShot Capture 244 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/2c61d669-8168-6738-d6da-0a3b221b2b02.png)

`Create client`ボタンをクリックして、Create client画面General Settingsページに遷移する。

![FireShot Capture 245 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/fd94bc21-3770-bf5f-f0b0-4e13914076db.png)

`Client ID`テキストボックスに「sample-client」と入力して`Next`ボタンをクリックする。Capability configページに遷移する。

![FireShot Capture 291 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/0f1758fc-0f8e-1c58-3c45-60231b1ea87d.png)

- `Client authentication:` On
- `Standard flow:` On
- `Direct access grants:` Off

として`Next`ボタンをクリックする。Login settingsページに遷移する。

![FireShot Capture 248 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/0166f78a-bd4c-7ec9-666d-3bf76f71f3c8.png)

`Valid redirect URIs`テキストボックスおよび`Web origins`にも「\*」と入力し`Save`ボタンをクリックする。Client details(sample-client)画面に遷移する。

### Credentialの確認

Client details(sample-client)画面で、`Credential`タブを選択しタブ内容を表示する。
`Client Authenticator`が、「Client id and Secret」であることを確認するとともに、`Client Secret`の値を別途保存しておく。

![FireShot Capture 293 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/f621c0cc-61f7-603d-baf2-cfe70f150c38.png)

なお、ここで設定した `sample-client` が後に使う`KEYCLOAK_CLIENT_ID`で、取得した`Client secret`が`KEYCLOAK_CLIENT_SECRET`となる。

### mapperを構成

Client details(sample-client)画面で、`Client scopes`タブを選択すると、client scopeの一覧を表示する。

![FireShot Capture 299 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/1b01cadb-5bd9-6c5b-4a2b-91c465331f8f.png)

`sample-client-dedicated`をクリックして、sample-client-dedicatedスコープのMapper一覧画面を表示する。

![FireShot Capture 300 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/07567d20-0d39-c33d-c87d-1f5aed645ac0.png)

#### user_address

`Configure a new mapper`ボタンをクリックして、mapper構成ダイアログを表示する。

![FireShot Capture 301 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/ee5a1df5-e15f-6863-bf8f-fd304b6b39c5.png)

`User Attribute`マッパーを選択して、mapper追加画面を表示し以下のように入力する。`Save`ボタンで保存する。

![FireShot Capture 302 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/290fc1ff-8a45-9360-9f5c-e2c8843aba5a.png)

- `Name:` user_address
- `User Attribute:` user_address（ドロップリストから選択）
- `Token Claim Name:` user_address
- `Claim JSON Type:` String
- `Add to ID token:` On
- `Add to Access token:` On
- `Add to lightweight access token:` Off
- `Add to userinfo:` On
- `Add to token introspection:` On
- `Multivalued:` Off
- `Aggregate attribute values:` Off

Save後、画面上部のパンくずリスト（`Clients` > `Client details` > `Dedicated scopes` > `Mapper details`）の`Dedicated scopes`リンクをクリックして、dedicated scopes(sample-client-dedicated)のMapper一覧画面を表示する。

#### gender_code

dedicated scopes(sample-client-dedicated)のMapper一覧画面で、`Add mapper`ドロップリストから`By configuration`を選択したのち、前節と同様に、`User Attribute`マッパーを選択し、mapper追加画面で以下のように入力した後に、`Save`ボタンで保存する。

![FireShot Capture 303 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/3e792011-283e-087f-293f-df03f4dbe48a.png)

- `Name:` gender_code
- `User Attribute:` gender_code（ドロップリストから選択）
- `Token Claim Name:` gender_code
- `Claim JSON Type:` String
- `Add to ID token:` On
- `Add to Access token:` On
- `Add to lightweight access token:` Off
- `Add to userinfo:` On
- `Add to token introspection:` On
- `Multivalued:` Off
- `Aggregate attribute values:` Off

Save後、画面上部のパンくずリスト（`Clients` > `Client details` > `Dedicated scopes` > `Mapper details`）の`Dedicated scopes`リンクをクリックし、dedicated scopes(sample-client-dedicated)のMapper一覧画面を表示する。

#### birth_date

dedicated scopes(sample-client-dedicated)のMapper一覧画面で、`Add mapper`ドロップリストから`By configuration`を選択したのち、前節と同様に、`User Attribute`マッパーを選択し、mapper追加画面で以下のように入力した後に、`Save`ボタンで保存する。

![FireShot Capture 304 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/6573d23b-565d-fdff-d136-e67e3c30d50c.png)

- `Name:` birth_date
- `User Attribute:` birth_date（ドロップリストから選択）
- `Token Claim Name:` birth_date
- `Claim JSON Type:` String
- `Add to ID token:` On
- `Add to Access token:` On
- `Add to lightweight access token:` Off
- `Add to userinfo:` On
- `Add to token introspection:` On
- `Multivalued:` Off
- `Aggregate attribute values:` Off

## User作成

ナビゲーションメニューの`Users`項目をクリックする。

![FireShot Capture 270 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/508b5073-06dd-8801-8085-0acd09e24b97.png)

Users画面に遷移する。

![FireShot Capture 271 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/39a40b6b-0b48-abae-65a1-b2d1c494fb6f.png)

`Create new user` ボタンをクリックしてCreate user画面に遷移する。例えば以下のように項目を入力する。

* `Required user actions:` （空欄）
* `Email verified:` On
* `Username:` test000
* `Email:` test000@example.com
* `First name:` t000
* `Last name:` test000
* `user_address:` 札幌市中央区北1条西3丁目3番地 敷島北一条ビル6階
* `gender_code:` 0
* `birth_date:` 2002-04-15

![FireShot Capture 281 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/16bae8a5-a7e8-ded6-e86e-7fbe04b4ad35.png)

`Create`をクリックして、User details画面に遷移する。

![FireShot Capture 282 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/a2fb6372-ceda-60e9-54d7-7b37998b9ca7.png)

次に、User details画面の`Credentials`タブをクリックしてパスワードを追加する。ここでは、`Temporary`スイッチはOffにしておく。

![FireShot Capture 284 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/6fa2cd48-6cba-010d-4e06-47aca0dfef53.png)

`Save`ボタンをクリックすると確認ダイアログが出現するので、`Save password`を選択する。

![FireShot Capture 285 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/b42d27e5-f033-f179-c982-a783f36b280c.png)

## ログアウト

`admin`ドロップリストをクリックし`Sign out`を選択、ログアウトする。

![FireShot Capture 286 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/0b25c095-d149-108a-ced5-da39c4e5359d.png)

## ログイン

http://localhost:8080/realms/myrealm/account/

上述のURLにアクセスするとログインダイアログが出現する。画面上部のロゴ領域が`MYREALM`になっている。

![FireShot Capture 288 - Sign in to myrealm - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/b8fdffb2-f787-8a87-a756-5782bdc5619f.png)

`test000`/`yourpassword`を入力して`Sign in`をクリックすると、先ほど設定した個人情報を確認できる。

![FireShot Capture 289 - Account Management - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/c1c208de-8230-af2d-e79a-91354b832b1d.png)

またプライベートウィンドウ（シークレットウィンドウ）などで、別途admin console（ http://localhost:8080 ）にアクセスし、test000ユーザーの`Sessions`タブを確認すると、セッションができていることを確認できる。

![FireShot Capture 290 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/d0d58585-4fce-b4b9-f585-b536546074c0.png)

## 別PCからアクセス

以下記事にならって、Keycloakを起動したPCに外部（Laravelを起動するPC）からアクセスできるように設定しておく。

https://gunmagisgeek.com/blog/other/7171

なおこのPCの外部IPを`a.b.c.d`のように以下記載する。実際は`192.168.0.18`のようなものとなる。

# Laravel

## ダウンロードと初期設定

https://bootcamp.laravel.com/blade/installation#installation-via-docker

ここに記載の通り(docker)にすすめる（Breezeをインストールしてログインできるところまで）。

	> curl -s "https://laravel.build/chirper" | bash
	> cd chirper
	> ./vendor/bin/sail up -d
	> ./vendor/bin/sail artisan migrate
	> ./vendor/bin/sail composer require laravel/breeze --dev
	> ./vendor/bin/sail php artisan breeze:install blade
	> ./vendor/bin/sail npm run dev 
	# Ctfl + Cでキャンセル

キャンセル前にブラウザでlocalhostにアクセスすれば、以下のような画面を確認できる。

![FireShot Capture 294 - Laravel - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/4f2b6107-63f6-0938-0c6e-7536b84bfd55.png)

## Socialite Providersのインストール

https://socialiteproviders.com/Keycloak/

つづいてSocialiteProvidersをインストールする。

	vendor/bin/sail composer require socialiteproviders/keycloak

以降、Laravel側にコードを追加していく。

### `.env`に以下の項目を追加

```
KEYCLOAK_CLIENT_ID="sample-client"
KEYCLOAK_CLIENT_SECRET="xxxxxxxx"
KEYCLOAK_REDIRECT_URI="http://localhost/auth/keycloak/callback"
KEYCLOAK_BASE_URL="http://a.b.c.d:8080/"
KEYCLOAK_REALM="myrealm"
```
* `KEYCLOAK_CLIENT_SECRET`の`"xxxxxxxx"`は、実際の値に置き換える。
* `KEYCLOAK_BASE_URL`の`a.b.c.d`はKeycloakを立ち上げたPCのIPアドレスに置き換える。

### `config/services.php`に以下追加

```php:config/services.php
    'ses' => [
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    ],
    // ここから追加
    'keycloak' => [
        'client_id' => env('KEYCLOAK_CLIENT_ID'),
        'client_secret' => env('KEYCLOAK_CLIENT_SECRET'),
        'redirect' => env('KEYCLOAK_REDIRECT_URI'),
        'base_url' => env('KEYCLOAK_BASE_URL'),
        'realms' => env('KEYCLOAK_REALM'),
    ],
    // ここまで追加
```
### Laravel10以前の場合

<details><summary>Laravel10以前の場合の詳細を見る</summary>

#### `config/app.php`に以下追加

```php:config/app.php
    /* 前略 */
    'providers' => ServiceProvider::defaultProviders()->merge([
        /* 中略 */
        App\Providers\RouteServiceProvider::class,
        /* ここから追加 */
        //Laravel\Socialite\SocialiteServiceProvider::class,
        \SocialiteProviders\Manager\ServiceProvider::class,
        /* ここまで追加 */
    ])->toArray(),
    /* 後略 */
```

#### `app/Providers/EventServiceProvider.php`

以下を追加
```php:app/Providers/EventServiceProvider.php
    protected $listen = [
        /*　ここから */
        \SocialiteProviders\Manager\SocialiteWasCalled::class => [
            \SocialiteProviders\Keycloak\KeycloakExtendSocialite::class.'@handle',
        ],
        /*　ここまで */
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];
```
</details>

### Laravel11以上の場合
#### `bootstrap/provider.php`に以下追加

```php:bootstrap/provider.php
<?php

return [
    App\Providers\AppServiceProvider::class,
    /* ここから追加 */
    \SocialiteProviders\Manager\ServiceProvider::class,
    /* ここまで追加 */
];
```

#### `app/Providers/AppServiceProvider.php`に以下追加

```php:app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
/* ここから追加 */
use Illuminate\Support\Facades\Event;
/* ここまで追加 */
```

`boot`メソッドに以下コードを追加する。
```php:app/Providers/AppServiceProvider.php
    /**
      * Bootstrap any application services.
      */
    public function boot(): void
    {
        /* ここから追加 */
        Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) {
            $event->extendSocialite('keycloak', \SocialiteProviders\Keycloak\Provider::class);
        });
        /* ここまで追加 */
    }
```

### `app/Http/Controllers/KeycloakLoginController.php`

以下内容のコントローラを新規追加する。
```php:app/Http/Controllers/KeycloakLoginController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Socialite;
use App\Models\User;

class KeycloakLoginController extends Controller
{
    public function redirectToKeycloak()
    {
        return Socialite::driver('keycloak')->redirect();
    }
    public function handleKeycloakCallback()
    {
        $keycloakUser = Socialite::driver('keycloak')->stateless()->user();
        $user = User::where('email', $keycloakUser->email)->first();
        if ($user==null) {
            $user = $this->createUser($keycloakUser);
        }
        Auth::login($user, true);
        return redirect('/dashboard');
    }
    public function createUser($keycloakUser)
    {
        dd ( $keycloakUser );

        $user = User::create([
            'name'  => $keycloakUser->user['name'],
            'email' => $keycloakUser->user['email'],
            'password' => Hash::make(uniqid()),
        ]);
        return $user;
    }
}
```

### `routes/web.php`

以下ルートを追加する。

```php:routes/web.php
<?php

use App\Http\Controllers\ProfileController;
/* ここから */
use App\Http\Controllers\KeycloakLoginController;
/* ここまで */
use Illuminate\Support\Facades\Route;
```

```php:routes/web.php
// redirect to keycloak
Route::get('/auth/keycloak', [KeycloakLoginController::class, 'redirectToKeycloak'])
    ->name('login.keycloak');
// after authentication
Route::get('/auth/keycloak/callback', [KeycloakLoginController::class, 'handleKeycloakCallBack'])
    ->name('login.keycloak.callback');
```

### `resources\views\auth\login.blade.php`

以下コードを追加し、ログイン画面にKeycloakのアイコンを加える。
```html:resources\views\auth\login.blade.php
            <x-primary-button class="ml-3">
                {{ __('Log in') }}
            </x-primary-button>
        </div>
    </form>

    <!-- ここから -->
    <div class="flex items-center justify-end mt-4">
        <a href="{{ route('login.keycloak') }}" class="ml-3 inline-flex items-center">
            <img src="https://upload.wikimedia.org/wikipedia/commons/2/29/Keycloak_Logo.png" style="margin-left: 3em; width: 64px; height: 64px">
        </a>
    </div>
    <!-- ここまで -->
</x-guest-layout>
```

# SSO動作確認

## Keycloakログイン済みの場合

以下Laravelを立ち上げたPCにて操作する。

1. まず、Keycloakのセッション情報をブラウザに保存するため、Keycloakにログインする。
    * http://a.b.c.d:8080/realms/myrealm/account/
        * `a.b.c.d` はKeycloakを立ち上げているPCのIPアドレスに置き換える。
![FireShot Capture 296 - Account Management - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/fa1dce19-5594-99bb-5eb2-0ae33fcca0a0.png)

2. プライベートモードなどで別途ブラウザを立ち上げて、admin consoleにログインしてセッションがあることを確認する。
    * http://a.b.c.d:8080
        * `a.b.c.d` はKeycloakを立ち上げているPCのIPアドレスに置き換える。
    * レルム：myrealm
    * Clients --> sample-client --> Sessions
    * なにかセッションがあればOK
![FireShot Capture 298 - Keycloak Administration Console - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/a76b3c2d-aee6-a324-6ffe-a19fd4a2a75f.png)

3. 1項とおなじブラウザでローカルのLaravelにアクセスする。
    * http://localhost/
![FireShot Capture 305 - Laravel - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/c294be29-777a-6ebe-8ba2-65a7b1ea6568.png)

4. 画面上の`Log in`リンクからログイン画面に遷移し、`LOG IN`ボタン下のKeycloakアイコンを選択する（画面上の`Email`欄や`Password`欄にはなにも入力しない）。
![laravel_keycloak_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/4872b357-10e8-adec-89aa-bf98a5bf3721.png)

5. SSOすることで、Keycloakに格納してあるユーザ情報を、Laravel側で取得できていることがわかる。
![FireShot Capture 307 -  - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/03224dde-7ad0-30c7-762c-fea450c0aba6.png)

6. なお `app/Http/Controllers/KeycloakLoginController.php` に追加したコードから `dd ( $keycloakUser );` の行をコメントアウトすると以下の画面となる。
![FireShot Capture 308 - Laravel - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/971890de-db92-82be-d270-e71eb58c96dd.png)

7. メニューからprofileを選ぶと以下のように登録できていることがわかる。
![FireShot Capture 309 - Laravel - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/3e76fbda-046e-a75c-de72-ac2ee36d56b5.png)

8. Laravel側で`Log out`する。
    * ちなみに、Laravel側UIで`Log out`を操作しても（Laravel側で未実装のため）Keycloak側ではログアウトしていない。

9. 2項のブラウザのadmin consoleを使ってtest000ユーザをログアウト（`Sign out`）する。
![FireShot Capture 310 - Keycloak Administration Console - 192.168.0.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217260/51556700-6fc0-71da-a4f0-ab443adeefef.png)


## Keycloak未ログインの場合

1. Keycloak未ログインの状態で、ローカルのLaravelにアクセスする。
    * http://localhost/
2. 画面上のLoinリンクからログイン画面に遷移し、`LOG IN`ボタン下のKeycloakアイコンを選択する。
3. リダイレクトが発生し、Keycloakのログイン画面を表示する。
4. `test000`/`yourpassword`でログインし、前節5項（あるいは6項）と同様の画面を得ることができる。

# まとめ

この記事では、Keycloakを使ったSSOおよびユーザ情報の取得をLaravelで実現する方法をまとめた。
Keycloakの構成は、試行錯誤で行ったものであるので本格的に使う場合は別書を参考にしてほしい。