web-dev-qa-db-ja.com

プライベートアプリのOAuth2プロセスとベストプラクティス

私の問題と私が見つけた解決策/ガイドを説明する間、私と一緒に我慢してください。

説明:私の会社では、1つの製品に複数のモジュールがあります。各モジュールは、個別のバックエンドとフロントエンドです。バックエンドスタックとしてJAX-RSを使用したJavaEE/JakartaEEと、フロントエンドとしてReactを使用しています。これまで、Basic Authenticationを使用してセッションを介したJavaEEセキュリティ。ただし、製品は進化しており、モバイルクライアントが必要であり、サードパーティがデータにアクセスできるようにするため、OAuth2/OpenID Connectをアプリケーションに統合することにしました。

OAuth2機能を提供する複数の実装があるため、現在利用可能なオプションをいくつか検討しています。 ( Keycloak および ORY Hydra など)。どちらを選択するかは、データベース内のユーザーをどのように処理するか、アプリケーションの既存の構造をどの程度変更するかによって異なります。しかし、どの実装を選択するかに関係なく、今後同様の質問があります。

質問

  1. 反応アプリケーションはログインプロセスとトークンストレージをどのように処理しますか?

    すべてのドキュメントは言う:ユーザーがログインしていない場合は、ログインページにリダイレクトされます。ログインして同意した後、リソースサーバーのアクセス/ 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はどのように役立ちますか?

  2. 上記の記述が正しいと仮定すると、ユーザーが自分のアプリまたはサードパーティのアプリからログインするときに、異なるログインフローが必要になります。ただし、これは、クライアントIDを確認するか、サードパーティのクライアントのパスワードフローを無効にすることで判断できます。

  3. 同じことがリフレッシュトークンフローにも当てはまります。私自身のアプリではCookieを設定する必要があるため、サードパーティの場合、これはOAuthサーバーから直接取得する必要があります

私が読んだ/調査したリソース:

https://Gist.github.com/mziwisky/10079157

OAuthはどのように機能しますか?

編集:読んだリンクをさらに追加

暗黙の付与の目的は何ですか

セッション管理のベストプラクティス

RESTful認証

そしてもちろん、KeycloakとORY Hydraによるさまざまな文書や例も含まれています。

私は現在、KeycloakとORY Hydraの両方を試してみて、どちらが私たちのニーズにより適しているかを理解しています。

よろしくお願いします!

3
Kapil

OAuth 2.0 Security Best Current Practice を参照してください。それはまだ「インターネットドラフト」ですが、成熟しており、いくつかのベンダーの実装によって実装されています。

一般的にOAuth 2.0 PKCEフローを使用した承認コードは、ベアラートークンまたはJWTの使用に関係なく推奨されます。

WebAuthn について読むことも検討する必要があります(パスワードがない場合)

1
jwilleke