Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OAuth clientのconfidential clientのサポート #2402

Closed
kyosu-1 opened this issue May 5, 2024 · 2 comments · Fixed by #2426
Closed

OAuth clientのconfidential clientのサポート #2402

kyosu-1 opened this issue May 5, 2024 · 2 comments · Fixed by #2426
Assignees
Labels
kind/enhancement 機能改善に関するもの

Comments

@kyosu-1
Copy link
Member

kyosu-1 commented May 5, 2024

概要

OAuth2.0ではclientが機密情報を安全に扱えるかどうかでpublicconfidentialの2種類のclient_typeが定義されている。(https://datatracker.ietf.org/doc/html/rfc6749#section-2.1)

public clientとconfidential clientの区別はテーブル定義では含まれているが、defaultがfalse(public client扱い)になっている。このため、DB上で直接値を書き換えない限りはconfidential clientの作成が行えない

confidential clientの場合でのみ利用可能なclient credentials flow はサポートされているが(/tokenエンドポイントでgrant_type=client_credentialsとする)、これが事実上利用できなくなっている。(client credentials flowは特定のユーザーに紐づかないm2mのリソースアクセスで利用できる。)

また、tokenエンドポイントを叩くのがサーバーサイドであればconfidential clientとなるので、認可コードフローを使っている場合でもユースケースとしてconfidential_clientになっているものが多いはず。現状は恐らくconfidential_clientとpublic_clientの概念が意識されずに、運用されていそう。例えばpublic_clientの場合はclient認証は必須ではない。この仕様は実装レベルだと反映されている(public client ではclient認証を行っていない)が、利用者側からしたらclinet_secretが必ず発行されているので、client認証が必須と思われる可能性がある。public clientの場合はclient_secretを発行しない形としたいが、破壊的になるかも

方針

後方互換性を保つのであれば以下のような形で実装を行うのが良さそう

  • POST: /client でのOAuthクライアントの登録時にclientのtypeを設定する。enumで定義(publicconfidential)されたclient_type or booleanのconfidentialをリクエストボディに含める。いずれの場合でも後方互換性の観点からdefault値をpublic_clinetとしてnot requiredとする必要がある。
  • GET: /client/{client_id}のレスポンスにclientのtypeも返すように。(レスポンスフィールドの追加なのでreqired trueで問題ないはず。)

UIの対応

BE側の対応が完了したらUI側の対応も必要。client typeを設定可能なように

@kyosu-1 kyosu-1 changed the title confidential clientのsupport OAuth clientのconfidential clientのサポート May 5, 2024
@kyosu-1
Copy link
Member Author

kyosu-1 commented May 5, 2024

middlewareでtokenからuserIDを取っているが、client credential flowだとuuid.Nilとなる。

newToken, err := h.Repo.IssueToken(client, uuid.Nil, client.RedirectURI, validScopes, h.AccessTokenExp, false)

user, err := repo.GetUser(uid, true)

ここでuidがuuid.Nilだと500エラーが返されてしまう

client credentials flowを利用するにはここら辺の改修も必要

@kyosu-1 kyosu-1 added the kind/enhancement 機能改善に関するもの label May 5, 2024
@kyosu-1
Copy link
Member Author

kyosu-1 commented May 5, 2024

影響範囲が大きいのでclient credentials flowの完全対応はconfidential clientのサポートと切り分けてissueを立てた方が良さそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/enhancement 機能改善に関するもの
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant