私の問題と私が見つけた解決策/ガイドを説明する間、私と一緒に我慢してください。
説明:私の会社では、1つの製品に複数のモジュールがあります。各モジュールは、個別のバックエンドとフロントエンドです。バックエンドスタックとしてJAX-RSを使用したJavaEE/JakartaEEと、フロントエンドとしてReactを使用しています。これまで、Basic Authenticationを使用してセッションを介したJavaEEセキュリティ。ただし、製品は進化しており、モバイルクライアントが必要であり、サードパーティがデータにアクセスできるようにするため、OAuth2/OpenID Connectをアプリケーションに統合することにしました。
OAuth2機能を提供する複数の実装があるため、現在利用可能なオプションをいくつか検討しています。 ( Keycloak および ORY Hydra など)。どちらを選択するかは、データベース内のユーザーをどのように処理するか、アプリケーションの既存の構造をどの程度変更するかによって異なります。しかし、どの実装を選択するかに関係なく、今後同様の質問があります。
質問
反応アプリケーションはログインプロセスとトークンストレージをどのように処理しますか?
すべてのドキュメントは言う:ユーザーがログインしていない場合は、ログインページにリダイレクトされます。ログインして同意した後、リソースサーバーのアクセス/ IDトークンおよび/またはアクセス/ IDトークンを更新するためのリフレッシュトークンを使用して、アプリにリダイレクトされます(oauth2ワークフローを完了した後)。
さて、ここで私には不明確な点があります。
これは私たち自身のReactアプリであるため、Microsoft/Googleなどのアプリのように、同意画面を表示しないようにします。これは、値を設定することで可能だと思いますリクエスト自体、またはクライアントIDに基づいて同意画面をスキップしますが、確認したいだけです。
次に、アクセストークンと更新トークンをどこに保存しますか?アクセストークンは、各リクエストでベアラートークンとして送信する必要があります。そのため、有効期間が短いためローカルストレージに保存できますが、更新トークンは安全に保存する必要があります。安全なhttp cookieのように。その場合は、サーバーで設定する必要があります。これが正しければ、フローはどのようになりますか?
Our React App (Not logged In)
-> Login Page (Another React Page)
-> User Enters Credentials
-> Java Backend
-> Authenticates the user
-> Initiate the OAuth2 process
-> Get the Access and Refresh Tokens
-> Set them as secure Cookies
-> Return the authenticated response to frontend with the cookies
-> Login Page redirects to the previous page
-> User continues with the app
これは正しくありません。この場合、PKCEはどのように役立ちますか?
上記の記述が正しいと仮定すると、ユーザーが自分のアプリまたはサードパーティのアプリからログインするときに、異なるログインフローが必要になります。ただし、これは、クライアントIDを確認するか、サードパーティのクライアントのパスワードフローを無効にすることで判断できます。
同じことがリフレッシュトークンフローにも当てはまります。私自身のアプリではCookieを設定する必要があるため、サードパーティの場合、これはOAuthサーバーから直接取得する必要があります
私が読んだ/調査したリソース:
https://Gist.github.com/mziwisky/10079157
編集:読んだリンクをさらに追加
そしてもちろん、KeycloakとORY Hydraによるさまざまな文書や例も含まれています。
私は現在、KeycloakとORY Hydraの両方を試してみて、どちらが私たちのニーズにより適しているかを理解しています。
よろしくお願いします!
OAuth 2.0 Security Best Current Practice を参照してください。それはまだ「インターネットドラフト」ですが、成熟しており、いくつかのベンダーの実装によって実装されています。
一般的にOAuth 2.0 PKCEフローを使用した承認コードは、ベアラートークンまたはJWTの使用に関係なく推奨されます。
WebAuthn について読むことも検討する必要があります(パスワードがない場合)