問題タブ [spring-security-oauth2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 春の oauth を設定するには?
2 つの Web アプリケーションがあります。
- リソースサーバー (@EnableResourceServer)
- 認証アプリ (@EnableAuthorizationServer)
それらは 1 つのデータベースにマップされます。
データベースを 2 つに分割したいと思います。1 つはクライアント アプリ用、もう 1 つはトークン用です。
私の現在の流れ:
- Resource Server トークンを使用した get リクエスト
- データベース内の春のセキュリティチェックトークン
認証アプリとデータベースを分離することが最善のフローである可能性があり、フローは次のようになります。
- リソースサーバーはリクエストトークンを取得します
- リソース サーバーは、トークンを検証するために認証 Web アプリ (OAuth サーバー) に要求を行います。
- 認証アプリ (OAuth サーバー) データベース内の春のセキュリティ チェック トークン
?
oauth について誤解している点があれば教えてください。ありがとう。
spring - RemoteTokenService の使用中にクライアント権限/ロールを取得できない
独自の oauth サーバーとリソース サーバーを実装するために Spring-Security-OAuth2 を使用しています。OAuth サーバーで (/oauth/check_token)を使用して任意の accessToken を認証する ResourceServer でRemoteTokenService
as myを使用しています。ResourceServerTokenService
CheckTokenEndpoint
/data/list などの API URL に antMatcher を追加しました。これには、クライアント アプリケーションの Role / Authority: " ROLE_ADMIN "が必要です。.antMatcher('/data/list').access("#oauth2.clientHasRole('ROLE_ADMIN')")
しかし、それは機能していません。このエンドポイントでいくつかの試行錯誤を行いましたが、得られるものは次のとおりです:::
oauth 付与がクライアントのみの場合、つまり client_credential 付与。/oauth/check_token から得られるもの
私たちはクライアント権限を取得しません。では、春のセキュリティはどのようにして上記の認証チェックを実行できますか"#oauth2.clientHasRole('ROLE_ADMIN')"
oauth 付与がユーザー + クライアントの場合、つまり Authorization_code は /oauth/check_token から取得したものを付与します
そして、authorization_code grnat については、まだクライアントの権限/役割を取得していません。任意の API URL で clientHasRole 認証を実行する方法を教えてください。
spring-security - 複数のクライアント アプリケーションの RemoteTokenService
複数のクライアント アプリケーション ( client_id と secret が異なる) に RemoteTokenService を使用するにはどうすればよいですか?
アップデート
これが、RemoteTokenService のインスタンスを構成する方法です。別のリソース サーバーと認証サーバーの OAuth2AuthenticationManager に挿入します。それが正しいか?
したがって、他のクライアントがこのリソースにアクセスする必要がある場合、このクライアントの両方に対して RemoteTokenService を構成するにはどうすればよいですか。私が何か間違っているかどうか教えてください。
spring - Spring MVC アプリケーションと OAuth2 認証
oauth2 サービスを使用して承認を作成する必要があります。そこからトークンを取得し、リソース (REST サービス) にアクセスするときにこのトークンを使用する必要があります。どうすればそれを達成できますか?出発点は何ですか?例を見るのは素晴らしいことです。
spring - xmlなしの春のoauth2
oauth2 spring と spring boot を使用して、XML を使用せずにプロバイダーとクライアントを作成する方法を理解したいと思います。サービスを公開するプロバイダーがありますが、クライアントからアクセスするにはどうすればよいですか?
spring-mvc - Spring OAuth2がアクセストークンにリダイレクトしない
Spring OAuth2 を構成しようとしています。部分的に成功しています。
SOAPui を使用してリダイレクト URI を「urn:ietf:wg:oauth:2.0:oob」に設定していることをテストするために。
私のシステムの問題は、認証コードを取得するためにアクセスできるが、アクセス コードを取得するために認証サーバーにリダイレクトされないことです。ログを調べたところ、URL がそこで定義されていないことがわかりました。/app/oauth/token?code=OB05Cb を実行していません。代わりに、URL で ?code=OB05Cb を実行しているだけです。
DEBUG: org.springframework.web.servlet.DispatcherServlet - レンダリング ビュー [org.springframework.web.servlet.view.RedirectView: unnamed; URL [urn:?code=OB05Cb]]
次に、SoapUI で見つからないページを表示し、ワークフローを停止します。
それを行っていないインターセプターが欠けていると思います。なぜ前に進まないのかわからない。誰か私にヒントを教えてもらえますか?ありがとう!
Spring OAuth2 バージョン 2.0.3.RELEASE 4.0.5.RELEASE 3.2.5.RELEASE を使用しています
ここに私の設定ファイルがあります。
spring - アクセス トークン エントリ ポイント Oauth トークンへのリダイレクトに関する問題
トークン エントリ ポイント /oauth/token へのアクセスへのリダイレクトに問題があります。詳細は後述します。これを実装するのに多くの時間がかかったので、誰かが私に光を当ててくれることを願っています。
また興味深いのは、SoapUI 5.0 コミュニティ エディションでは、指示に従ってもテストできないことです。認証コードを取得しますが、リダイレクト URI を「urn:ietf:wg:oauth:2.0:oob」として設定する必要があるため、後で失敗します。
Spring-Security-Oauth2 には多くの優れたドキュメントがなく、作業のデバッグとドキュメント化に多くの時間を費やしたため、他の人にも役立つかもしれないコメントと構成コードをここで共有することにしました。
pom で次の依存関係バージョンを使用しています。
ここでのアイデアは、Cassandra を永続ストアとして使用して、すべての clientId オブジェクト、UserPrincipal、アクセス、ノンス、およびトークン ストアを実装することでした。これらのコンポーネントはすべて完全に機能しており、テスト済みです。実際、すべての認証/承認を取得し、承認コードを作成します。
最近、Spring Oauth2 github で JDBC ストアをテストする際にバグを見ましたが、これは実際の実装ではなく、特に JDBC を使用していないため、テストに関連していました。
ログイン用の OAuth2 サーバーと Spring Security に常駐する REST リソースにアクセスするためのクライアント Web アプリケーションを作成しました。/oauth/token へのアクセス トークンを要求するまでは、すべてうまくいきます。
安全なRestサービスを最初にヒットすると、リダイレクトが適切に開始され、true DefaultOAuth2RequestFactory createAuthorizationRequest() メソッドになります。ストアからシークレットなどを使用して ClientDetails オブジェクトを完全に読み込みます。したがって、Oauth2 クライアントのすべてのスコープ、許可などがあります。また、redirectURIParameter を適切に検証し、リダイレクトを解決します。次に、TokenStoreUserApprovalHandler に移動し、OAuth2Request オブジェクトを作成します。次に、もちろん、ワークフローにまだ存在しない既存のアクセス トークンを見つけようとします。authenticationKeyGenerator から authenticationkey を作成し、この時点で適切に null を返すストアにクエリを実行します。次に、/oauth/authorize に 2 回リダイレクトし、2 回目に認証コードがあり、approveOrDeny() メソッド内で承認済み (AuthorizationEndPoint) としてマークします。authorizationCodeServices はコードを作成し、Cassandra ストアに適切に保存します。
この時点で、( AuthorizationEndPoint
)を呼び出しgetSuccessfulRedirect()
て、状態パラメーターをテンプレートに追加します。
OAuth2RestTemplate
次に、( class)getAccessToken()
メソッドを呼び出します。アクセストークンは問題なく有効であるため、 with
acquireAccessToken()
を返す呼び出しが呼び出されます。次に、 を呼び出してでアクセス トークンを取得します。次に、メソッドで呼び出しが呼び出され
ます。そして で失敗します。は許可タイプで完全に作成され、ヘッダーとしてと の両方が
あります。はとして正しいです。isとis
の ID 。ヘッダーは次のように表示されますaccessTokenRequest
{code=[Q19Y6u], state=[1PyzHf]}
accessTokenProvider
obtainAccessToken()
OAuth2AccessTokenSupport
retrieveToken()
getRestTemplate
AuthorizationCodeResourceDetails
authorization_code
authorizationScheme
clientAuthenticationScheme
clientId
clientSecret
AuthorizationCodeResourceDetails
oAuth2ClientBean
userAuthorizationURI
http://myhost.com:8080/MyAPI/oauth/authorize
抽出器はorg.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport
. フォームは{grant_type=[authorization_code], code=[Xc7yni], redirect_uri=[http://myhost.com:8080/OAuthClient/support]}
その後、アプリケーションがフリーズし、ログに次のように表示されます。
次に、クライアント Web アプリケーションで次の例外があります。
さて、OAuth2 と Spring Security の xml 構成にいくつか問題があると思います。したがって、構成ファイルは次のとおりです。
それに関していくつか質問があるので、最初に質問します:
1)<oauth2:authorization-server>
これが正しく構成されているかどうかわかりません。私のxmlファイルにあるコメントを見てください。認証プロバイダー user-service-ref="userService" を取る認証マネージャーである userAuthenticationManager Bean を指す、authorization-request-manager-ref パラメーターを追加しました。
2) authentication-manager oauthClientAuthenticationManager は、「/oauth/token」がインターセプトされるときに使用されます。これは次のように定義されます。
3) sec:global-method-security で使用される次の methodSecurityExpressionHandler Bean を定義しています。これが正しいかどうかもわかりません。
4)推奨されていないと思われるBean「clientCredentialsTokenEndpointFilter」もあります。これをエントリ ポイント「/oauth/token」のカスタム フィルタとして使用していますが、これは間違っていると思います。
5) Oauth Token エンドポイントについて: ここで多くの質問があるため、これはエンドポイント /oauth/token です。
- これに到達することはありません。
- 好きなカスタムフィルターを用意
clientCredentialsTokenEndpointFilter
しますか? - http-basic エントリ ポイントが必要ですか?
- のようにアクセス属性を持たせるべきですか、それともオブジェクトに追加したような、オブジェクト
IS_AUTHENTICATED_FULLY
に定義した権限を使用できますか?UserPrincipal
OAUTH_CLIENT
- セッションはどうですか?「ステートレス」または「決して」と言うべきか
- も追加
corsFilter
しようかな。 - エントリーポイントは正しいですか?
OAuth2AuthenticationEntryPoint
クラスはどれですか? - csrf トークンを追加する必要がありますか? それはそれをより制限するので、私は信じていません。
- 式ハンドラは正しい
org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandle
ですか? - authentication-manager-ref を から
oauthClientAuthenticationManager
に変更できますuserAuthenticationManager
。
<sec:http use-expressions="true" create-session="stateless"
authentication-manager-ref="userAuthenticationManager"
entry-point-ref="oauthAuthenticationEntryPoint" pattern="/oauth/token">
<sec:intercept-url pattern="/oauth/token" access="hasAuthority('OAUTH_CLIENT')" />
<!-- <sec:intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" /> -->
<sec:http-basic entry-point-ref="oauthAuthenticationEntryPoint"/>
<!-- <sec:http-basic/> -->
<sec:anonymous enabled="false" />
<sec:custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
<sec:access-denied-handler ref="oauthAccessDeniedHandler" />
<sec:expression-handler ref="webSecurityExpressionHandler" />
<!-- <sec:custom-filter ref="corsFilter" after="LAST"/> -->
</sec:http>
ここに完全な構成ファイルを追加したいのですが、制限があります。
spring-security - 共有データソースなしでリソースサーバーと認可サーバーを分離
リソースサーバーと認可サーバーを別々に実装することに興味があります。ここから、これが機能するためには、「トークンがリソース サーバーによってローカルでデコード可能である必要があるか、認証サーバーとストレージを共有する必要がある」ことを理解してください。ほぼ 2 年半後、リソース サーバーがデータ ソースを承認サーバーと共有することなく、トークンをプリンシパルに解決できることを願っています。この質問で述べたように、 RemoteTokenServicesはこれを達成する唯一の手段ですか? もしそうなら、「/check_token」の応答はどうあるべきですか?
spring - @AuthenticationPrincipal オブジェクトがセッション値を返す
@AuthenticationPrincipal オブジェクトは、セッションに保存された以前の値を返します。
スプリング ブート + スプリング セキュリティ oauth REST サーバー。https://github.com/legshort/spring-boot-sample
これら 2 つの REST メソッドはコントローラーにあります。問題は、最後の引数である deleteUser() の userDetailsImpl が、テスト コードを実行したときに updateUser() の userDetailsImpl と同じ値であることです。
以下はコントローラーのテストコードです
方法はわかりませんが、testDeleteUser() である 2 番目のリクエストにはセッション値があり、以前のテストを使用したのと同じユーザーです。そのため、deleteUser() の開始時にアクセス トークンを検証し、正しい新しいユーザーをロードすることを考えても、userDetailsImpl の実際の値には、testUpdateUser() の開始時に作成された間違ったユーザーが含まれています。
これは UserDetailService の実装です。アクセス トークンを検証する loadUserByUserName() に関しては、データベースから適切なユーザーをロードし、すべてのテスト メソッド (signUpUser()) の最初に作成されたばかりの新しいユーザーを返します。
失敗したセッションを無効にしようとしましたが、構成とテストコードで問題ないようです。spring-security-oauth の実用的な例はありますか?
更新しました
mockMvc について私が理解している限りでは、すべての設定がクリアされ、 setUp() メソッドを使用して毎回ほとんど新しいモック サーバーが作成されます。したがって、アクセス トークン ストアは毎回クリアする必要がありますが、トークン ストアは認証されたトークンを維持します。
テスト中に省略した「/oauth/token」で要求されたアクセス トークンを要求すると、次のように InMemoryTokenStore が呼び出されます。
テスト プロセス ログ
testUpdateUser() -> POST: /oauth/token -> ストア トークン
トークン: 50b10897-9e15-4859-aeb0-43d0802ba42c
ユーザー: id=2testUpdateUser() -> PUT: /users/2 -> 読み取りトークン
token: 50b10897-9e15-4859-aeb0-43d0802ba42c
ユーザー: id=2testUpdateUserWithWrongUserId() -> GET: /oauth/token -> トークン
トークンを保存: 50b10897-9e15-4859-aeb0-43d0802ba42c -> 既にトークン
ユーザーに存在: id=2 -> id=4: ユーザーは新しいもので更新されましたtestUpdateUserWithWrongUserId() -> PUT: /users/0 -> 読み取りトークン
token: 50b10897-9e15-4859-aeb0-43d0802ba42c
ユーザー: id=2testDeleteUser() -> GET: /oauth/token -> トークンを保存するはずでしたが、トークンを保存しませんでした
testDeleteUser() -> DELETE: /users/5 -> read token
token: 50b10897-9e15-4859-aeb0-43d0802ba42c
user: id=2 -> userSignUp() で作成された id=5 であるはずのユーザー
質問
mockMvc を使用してすべてのテスト メソッドで InMemoryTokenStore をクリアするにはどうすればよいですか?