fosite を使って IdP を建てようとすると、Storage の実装とかどうしているんだろう?とか思うので fosite を使っている(というか同じ Org が開発している)Hydra を動かしてみた。
IdP をたてる
QuickStartを参考に以下を実行する。
今回は PostgreSQL (dev)を選んでみた。(MySQL はなぜかエラーが出て動かなかった)
$ docker compose -f quickstart.yml \
-f quickstart-postgres.yml \
up \
--build
...ここから先は無限のログ...
Client をつくる
$ code_client=$(docker compose -f quickstart.yml exec hydra \
hydra create client \
--endpoint http://127.0.0.1:4445 \
--grant-type authorization_code,refresh_token \
--response-type code,id_token \
--format json \
--scope openid --scope offline \
--redirect-uri http://127.0.0.1:5555/callback)
- ↑ を実行すると
code_clientに Client ID やら Secret が入ってくるのでいい感じに剝がしておく
$ code_client_id=$(echo $code_client | jq -r '.client_id')
$ code_client_secret=$(echo $code_client | jq -r '.client_secret')
Authorization Code Flow をデモする
- ↓ をすると ory/fosite-example みたいなサンプルクライアントが立ち上がる。
$ docker compose -f quickstart.yml exec hydra \
hydra perform authorization-code \
--client-id $code_client_id \
--client-secret $code_client_secret \
--endpoint http://127.0.0.1:4444/ \
--port 5555 \
--scope openid --scope offline
Setting up home route on http://127.0.0.1:5555/
Setting up callback listener on http://127.0.0.1:5555/callback
Press ctrl + c on Linux / Windows or cmd + c on OSX to end the process.
If your browser does not open automatically, navigate to:
http://127.0.0.1:5555/

- ぽちぽちして
Allow Accessを押すとトークンが発行される。

- 発行されると勝手にサンプルクライアントも終了する
Token Rotation してみる
- サンプルクライアントが終了しただけで Hydra はまだ起動状態なのでそのまま Refresh Token で Rotation してみる
$ curl -X POST http://127.0.0.1:4444/oauth2/token \
-u 435344bd-a7bc-45c0-aa44-1af6044daea0:e8iT1XJA1af1AO.TBXTrw4AO__ \
-d "grant_type=refresh_token" \
-d "refresh_token=ory_rt_sq54kJ-ciJ6x1iv9SLMbW6bACBrDOHP5Yi5fqHgIXF4.7jpQff8e5lttZaxVfQpEfqPbKyCtc46TNP6m3dR_Im8"
{"access_token":"ory_at_PEJUHuqWyGT28sSBHzKFRKJJms8mcPwGuYKtbAsevcQ.FcnKwH8NbKxAwBfiOLRp63VK4U8Qeihf4bRMeOWsc6o","expires_in":3600,"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjAyNWJjYmZmLTU4MWYtNDNlYi1hM2E1LTE4ODEzZmYxYWZhNyIsInR5cCI6IkpXVCJ9.eyJhY3IiOiIwIiwiYXRfaGFzaCI6IlNRX2h1eXFHajc5UnZtb2hqMV91enciLCJhdWQiOlsiNDM1MzQ0YmQtYTdiYy00NWMwLWFhNDQtMWFmNjA0NGRhZWEwIl0sImF1dGhfdGltZSI6MTc1OTQwMDU5OCwiZXhwIjoxNzU5NDA0MzY1LCJpYXQiOjE3NTk0MDA3NjUsImlzcyI6Imh0dHA6Ly8xMjcuMC4wLjE6NDQ0NCIsImp0aSI6ImVmYjQ0ZmJkLTkxYjUtNDI4ZS05ZWU5LTI2OTBmYWUyOTcyMyIsInJhdCI6MTc1OTQwMDU5Mywic2lkIjoiNDFhMGViOTMtNjkxNy00MjM5LTlmMTctZjVmZTdmNTkzY2I1Iiwic3ViIjoiZm9vQGJhci5jb20ifQ.0egwXzkxZObl9dCfZeijL61mZNdgkkZwrjJx-XzSg1FVb4a0SKwgyqPP6hwg32vrzT3yRpFciSpo0FlZteVoxvuf9VPpygUu8NynO8Nz73jxBS9fuJqKvEqIPlo7kw8b6n3Yc17p_etPkH1v8W-E3nsRCtHutd662DbBc9qHKm3RbmvqdmNiX4iXHmMvoAxYvyEpW38pUkiTUmOCh3ih_tX_BFgjbQVHCimgRx7nkWPwZaxO1TeIP0Gb0waEo-DQ5_m19Pqmi_YtOjUQ2J8sZJVvwTmDbPWo2t-Nzhwytxb2m1jdJYRr6TaiPAJuR-GsSR4X-m1tmty2o1tsEVfKJRY1gO-yM10Y17YAeopdoGEMzi098-UdPuM-6OG4t0kSHaiH7Gd7h9qrLewtsVnS3ALTRQaiAJpYE1-o-Loailat6ZYeH4pljU3cp77sWVYDp0iDHiYVkb3C4eqJz3Var4SsrEuVQ1J-PV6D00bEN6dpoU_U3i5z7w_CD9JpE4P9UlLo5yg4Ac6QU6OGFnpy4PxThQ2-dh_salmW8iSQP5yIAnWYmxZ1az5fMTeWRRds-A1QN38RBIQpuE6TAzG_c8Q3cqZ8b5_qlbt3I_OT37XGepp3dLI6tgCSte9UsKk8jCmcES1AZFL2y6HQAqLfTTVLQdeZShZsuIrDkJiaSBA","refresh_token":"ory_rt_uq1b7HAmKDr-LPHD83EU5tRkN-1z8U_9U-hpmZTKPRo.DIZu6NKU4xiJkYM4pPj75kVQgtZmHIAqOg4mQlk1XJc","scope":"openid offline","token_type":"bearer"}
ちゃんとかえってきた めでたしめでたし
その他
- DB も Docker で動いているので中身をみれる
$ docker compose -f quickstart.yml -f quickstart-postgres.yml exec postgresd ps
ql -U hydra -d hydra
psql (16.10 (Debian 16.10-1.pgdg13+1))
Type "help" for help.
hydra=# \dt
List of relations
Schema | Name | Type | Owner
--------+------------------------------------------------+-------+-------
public | hydra_client | table | hydra
public | hydra_jwk | table | hydra
public | hydra_oauth2_access | table | hydra
public | hydra_oauth2_authentication_session | table | hydra
public | hydra_oauth2_code | table | hydra
public | hydra_oauth2_device_auth_codes | table | hydra
public | hydra_oauth2_flow | table | hydra
public | hydra_oauth2_jti_blacklist | table | hydra
public | hydra_oauth2_logout_request | table | hydra
public | hydra_oauth2_obfuscated_authentication_session | table | hydra
public | hydra_oauth2_oidc | table | hydra
public | hydra_oauth2_pkce | table | hydra
public | hydra_oauth2_refresh | table | hydra
public | hydra_oauth2_trusted_jwt_bearer_issuer | table | hydra
public | networks | table | hydra
public | schema_migration | table | hydra
(16 rows)
- ローカルのコードを動かしているのであとは焼くなり煮るなりできる
diff --git i/persistence/sql/persister_oauth2.go w/persistence/sql/persister_oauth2.go
index 7a1da7a2..8013b439 100644
--- i/persistence/sql/persister_oauth2.go
+++ w/persistence/sql/persister_oauth2.go
@@ -98,6 +98,8 @@ func (p *Persister) sqlSchemaFromRequest(ctx context.Context, signature string,
}
}
+ p.l.Infof("table: %s, claims: %+v", table, rr.Claims)
+
session, err := json.Marshal(rr)
hydra-1 | time=2025-10-02T10:44:38Z level=info msg=table: access, claims: &{JTI: Issuer:http://127.0.0.1:4444 Subject:[email protected] Audience:[435344bd-a7bc-45c0-aa44-1af6044daea0] Nonce:ndkdzfwhydgearulfmcdxbdg ExpiresAt:0001-01-01 00:00:00 +0000 UTC IssuedAt:2025-10-02 10:44:38 +0000 UTC RequestedAt:2025-10-02 10:44:32 +0000 UTC AuthTime:2025-10-02 10:44:37 +0000 UTC AccessTokenHash: AuthenticationContextClassReference:0 AuthenticationMethodsReferences:[] CodeHash: Extra:map[sid:13abfb7a-0552-491c-86ef-2d7eafad329c]} audience=application service_name=Ory Hydra service_version=master
hydra-1 | time=2025-10-02T10:44:38Z level=info msg=table: refresh, claims: &{JTI: Issuer:http://127.0.0.1:4444 Subject:[email protected] Audience:[435344bd-a7bc-45c0-aa44-1af6044daea0] Nonce:ndkdzfwhydgearulfmcdxbdg ExpiresAt:0001-01-01 00:00:00 +0000 UTC IssuedAt:2025-10-02 10:44:38 +0000 UTC RequestedAt:2025-10-02 10:44:32 +0000 UTC AuthTime:2025-10-02 10:44:37 +0000 UTC AccessTokenHash: AuthenticationContextClassReference:0 AuthenticationMethodsReferences:[] CodeHash: Extra:map[sid:13abfb7a-0552-491c-86ef-2d7eafad329c]} audience=application service_name=Ory Hydra service_version=master
hydra-1 | time=2025-10-02T10:44:38Z level=info msg=completed handling request http_request=map[headers:map[accept-encoding:gzip authorization:Value is sensitive and has been redacted. To see the value set config key "log.leak_sensitive_values = true" or environment variable "LOG_LEAK_SENSITIVE_VALUES=true". content-length:183 content-type:application/x-www-form-urlencoded user-agent:Go-http-client/1.1] host:127.0.0.1:4444 method:POST path:/oauth2/token query:<nil> remote:127.0.0.1:43362 scheme:http] http_response=map[headers:map[cache-control:no-store content-type:application/json;charset=UTF-8 pragma:no-cache] size:1542 status:200 text_status:OK took:17.034ms]
どうでもいいこと
IdPをたてるという表現で正しいのかいまいちわからないのであった- もっというと今回は
OpenID Connect Providerとかが正しそう というひとりごと
- もっというと今回は