Ory Kratosをセルフデプロイ＆SSO設定(GitHub)

# はじめに

はじめまして。あかこうです。

最近Ory Kratosを使っているのですが、
その備忘録をここに書きなぐっておきます。

本記事でまとめられているのは、以下の内容です。

1. Ory Kratosをセルフホストする
2. Ory KratosにGithubでSSOする

（※本番用のデプロイではないです。）

# 1. Ory Kratosをセルフホストする

以下のコマンドで、Ory Kratosをセルフデプロイできます。。
[参考にした公式サイト](https://www.ory.sh/docs/kratos/quickstart#clone-ory-kratos-and-run-it-in-docker)

```sh
git clone https://github.com/ory/kratos
cd kratos
docker-compose -f quickstart.yml -f quickstart-standalone.yml up --build --force-recreate
```

うまく動けば、http://0.0.0.0:4455/ からアカウント登録・ログインなどの操作ができるはずです。

# 2. GitHub SSOの設定

次にGitHubでSSOする設定を書きます。

## a. GitHubの設定

以下の流れでGitHub側を設定する。

1. Githubにログインする
1. [GitHubのサイト](
https://github.com/settings/developers)にアクセスする。
1. `New OAuth App`と書かれたボタンをクリックする。
1. 各項目を適当に埋める。
    ただし、`Authorization callback URL`には以下のURLを設定する。
    >  http://127.0.0.1:4455/self-service/methods/oidc/callback/github
1. `Client ID`を保管する。
1. `Generate a new client secret`と書かれたボタンをクリックする。
1.  `Client secret`を安全に保管する。

## b. Kratosの設定

以下の流れでKratos側を設定する。

1. 以下の内容を `github.data-mapper.jsonnet` として保存する。

    ```jsonnet
    local claims = std.extVar('claims');
    
    {
      identity: {
        traits: {
          email: claims.email, // If email isn't set the Jsonnet snippet will fail with an error.
        },
      },
    }
    ```

2. `github.data-mapper.jsonnet` をbase64化する
    ```sh
    base64 -w 0 github.data-mapper.jsonnet
    # bG9jYWwgY2xhaW1zID0gc3RkLmV4dFZhcignY2xhaW1zJyk7Cgp7CiAgaWRlbnRpdHk6IHsKICAgIHRyYWl0czogewogICAgICBlbWFpbDogY2xhaW1zLmVtYWlsLCAvLyBJZiBlbWFpbCBpc24ndCBzZXQgdGhlIEpzb25uZXQgc25pcHBldCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci4KICAgIH0sCiAgfSwKfQo=
    ```


3. `./contrib/quickstart/kratos/email-password/kratos.yml` を開き、
以下のように修正する。

    ```yaml
    version: v0.7.1-alpha.1
    
    dsn: memory
    
    serve:
      public:
        base_url: http://127.0.0.1:4433/
        cors:
          enabled: true
      admin:
        base_url: http://kratos:4434/
    
    selfservice:
      default_browser_return_url: http://127.0.0.1:4455/
      allowed_return_urls:
        - http://127.0.0.1:4455
    
      methods:
        password:
          enabled: true
    
        oidc:
          config:
            providers:
              - id: github # this is `<provider-id>` in the Authorization callback URL. DO NOT CHANGE IT ONCE SET!
                provider: github # This defines the app type used for integration. Use 'github' for GitHub OAuth app. Use 'github-app' for GitHub App.
                client_id: <client_id> # 保管したClient IDを貼り付ける
                client_secret: <secret> # 保管したClient secretを貼り付ける
                
                mapper_url: "base64://<2.で作ったbase64>"
                # mapper_url: "base64://bG9jYWwgY2xhaW1zID0gc3RkLmV4dFZhcignY2xhaW1zJyk7Cgp7CiAgaWRlbnRpdHk6IHsKICAgIHRyYWl0czogewogICAgICBlbWFpbDogY2xhaW1zLmVtYWlsLCAvLyBJZiBlbWFpbCBpc24ndCBzZXQgdGhlIEpzb25uZXQgc25pcHBldCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci4KICAgIH0sCiAgfSwKfQo="
                # Alternatively, use an URL:
                scope:
                  - user:email
          enabled: true
    
      flows:
        error:
          ui_url: http://127.0.0.1:4455/error
    
        settings:
          ui_url: http://127.0.0.1:4455/settings
          privileged_session_max_age: 15m
    
        recovery:
          enabled: true
          ui_url: http://127.0.0.1:4455/recovery
    
        verification:
          enabled: true
          ui_url: http://127.0.0.1:4455/verification
          after:
            default_browser_return_url: http://127.0.0.1:4455/
    
        logout:
          after:
            default_browser_return_url: http://127.0.0.1:4455/login
    
        login:
          ui_url: http://127.0.0.1:4455/login
          lifespan: 10m
    
        registration:
          lifespan: 10m
          ui_url: http://127.0.0.1:4455/registration
          after:
            password:
              hooks:
                -
                  hook: session
            oidc:
              hooks:
                -
                  hook: session
    
    log:
      level: debug
      format: text
      leak_sensitive_values: true
    
    secrets:
      cookie:
        - PLEASE-CHANGE-ME-I-AM-VERY-INSECURE
      cipher:
        - 32-LONG-SECRET-NOT-SECURE-AT-ALL
    
    ciphers:
      algorithm: xchacha20-poly1305
    
    hashers:
      algorithm: bcrypt
      bcrypt:
        cost: 8
    
    identity:
      default_schema_id: default
      schemas:
        - id: default
          url: file:///etc/config/kratos/identity.schema.json
    
    courier:
      smtp:
        connection_uri: smtps://test:test@mailslurper:1025/?skip_ssl_verify=true
    
    ```

1. 以下のコマンドでサーバを起動する

    ```sh
    docker-compose -f quickstart.yml -f quickstart-standalone.yml up --build --force-recreate
    ```

うまく動けば、http://127.0.0.1:4455/login から、GitHubでSSOできるはずです。

# まとめ

本記事では、以下の内容についてまとめました。

1. Ory Kratosをセルフホストする
2. Ory KratosにGithubでSSOする


Ory Kratos便利ですね！