問題タブ [spring-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.
spring-security - Spring Boot Resource Server が oAuth 2 アクセス トークンでロールを承認できない
次の 3 つのマイクロサービスが用意されています
- 構成サーバー
- MongoDB 参照リンクを使用する認証サーバー。プロジェクトを 1.2.4 から 1.3.3 に正常に移行しました
- ユーザーサービス。Rest コントローラーと 3 つの Get メソッドを備えたリソース サーバー (それぞれ ADMIN、MERCHANT、CONSUMER 用)
ユーザーの役割に基づいて、REST コントローラーの GET メソッドへのアクセスを制限しようとしています。リソース構成は次のとおりです。
テストするために、ロール ADMIN を除くすべてのユーザーのユーザー サービスをロックしようとしています。ただし、401 Access Denied が表示されます。同じ結果で hasRole("ADMIN") も試しました。その承認基準を削除すると、ユーザーは正しく認証されます(間違ったアクセストークンを受け入れません)。認証サーバーのuserInfoUriからのレスポンスは以下の通り
役割ベースの承認が機能しない理由がわかりません。どんな助けでも親切に感謝します。
spring - /oauth/authorize と /oauth/token は Spring OAuth でどのように相互作用しますか?
私は Spring OAuth の詳細な調査を行っており、矛盾する情報がいくつか見つかりました。
具体的には、このチュートリアル/oauth/token
では、クライアント アプリに更新トークンを付与する前に、エンドポイントがユーザー名とパスワードを処理すると述べています。対照的に、Spring OAuth 開発者ガイド/oauth/authorize
ではエンドポイントとエンドポイントについて言及してい/oauth/token
ますが、それらがどのように機能するかについてはまだ具体的に説明していません。
/oauth/authorize
100% のusername/password/nOtherFactors
チェックを/oauth/token
行ってから、クライアントがリフレッシュ トークンをエンドポイントに送信するように、クライアントにリフレッシュ トークンを送信するようにエンドポイントに通知し/oauth/token
ますか?
それとも、すべて/oauth/token
エンドポイントで処理されますか?
助成金の種類によって/oauth/authorize
との関係は異なりますか? /oauth/token
どのように?
java - エラー HTTP ステータス 500 - WebApplicationContext が見つかりません: ContextLoaderListener が登録されていませんか?
こんにちは、Spring Security と Spring Oauth は初めてです。Spring Oauth サーバーとリソース サーバーを Java ベースで構成しています。しかし、サーブレットパラメーターを初期化する必要があるなど、xml に基づいて web mvc の一部を構成する必要があります。
以下は私のWeb.xmlです
および mvc-dispatcher-servlet.xml
エラーログは以下のとおりです。
SecurityConfiguration.java
****OAuth2ServerConfig.java****
java.security.Principal をインポートします。java.util.UUID をインポートします。
上記で私を助けてください。
spring - /oauth/token の XSRF トークンが無効です
多要素認証の Spring OAuth2 実装の完全なコードは、このリンクのファイル共有サイトにアップロードされています。わずか数分で任意のコンピューターで現在の問題を再現するための手順を以下に示します。
**現在の問題:**
ほとんどの認証アルゴリズムは正しく機能します。プログラムは、以下に示す制御フローの最後までブレークしません。具体的には、「http://localhost:9999/uaa/oauth/token に無効な CSRF トークンが見つかりました」というエラーが、以下の **2 回目のパス**の最後にスローされています。上記のリンクのアプリは、このSpring Boot OAuth2 GitHub サンプルの「authserver」アプリにカスタムの「OAuth2RequestFactory」、「TwoFactorAuthenticationFilter」、および「TwoFactorAuthenticationController」を追加することによって開発されました。**この CSRF トークン エラーを解決して 2 要素認証を有効にするには、以下のコードに具体的にどのような変更を加える必要がありますか?** 私の調査によると、`CustomOAuth2RequestFactory` (このリンクの API) は、 `AuthorizationRequest`および`TokenRequest`を管理する方法を定義しているため、ソリューションを構成する場所になる可能性があります。**公式の OAuth2 仕様のこのセクションは、認可エンドポイントに対して行われるリクエストの `state` パラメータが `csrf` トークンが追加される場所であることを示しています。** また、リンク内のコードは Authorization Code Grantを使用しています。これは、フローのステップ C が「csrf」コードを更新しないため、ステップ D でエラーが発生することを意味します (ステップ C とステップ D を含むフロー全体は、公式仕様。)
**現在のエラーを取り巻く制御フロー:**
現在のエラーは、以下のフローチャートの `TwoFactorAuthenticationFilter` を介して **2 回目のパス** でスローされています。制御フローが **SECOND PASS** に入るまで、すべてが意図したとおりに機能します。次のフローチャートは、ダウンロード可能なアプリのコードで使用される 2 要素認証プロセスの制御フローを示しています。 具体的には、一連の「POST」および「GET」に対する Firefox の「HTTP」ヘッダーは、シーケンス内のすべてのリクエストで同じ「XSRF」Cookie が送信されることを示しています。`XSRF` トークン値は、`/oauth/token` を使用して `/oauth/authorize` および `/oauth/token` エンドポイントでサーバー処理をトリガーする `POST /secure/two_factor_authentication` の後まで問題を引き起こしません。 `Invalid CSRF token found for http://localhost:9999/uaa/oauth/token` エラーをスローします。上記の制御フロー チャートと `/oauth/authorize` および `/oauth/token` エンドポイントとの関係を理解するには、上記のフローチャートを公式仕様の単一要素フローのチャートと並べて比較できます。別のブラウザー ウィンドウで。上記の **2 番目のパス** は、1 要素の公式仕様の手順を 2 回実行するだけですが、**2 番目のパス** ではより多くの権限が付与されます。
**ログの内容:**
HTTP リクエスト ヘッダーとレスポンス ヘッダーは次のことを示しています。 sGXQ4v` の後に `GET 9999/secure/two_factor_authenticated` が続きます。1 つの XSRF トークンは、これらの取引所全体で一定のままです。2.) 正しい PIN コードを使用した `9999/secure/two_factor_authentication` への POST は、同じ `XSRF` トークンを送信し、`POST 9999/oauth/authorize` に正常にリダイレクトされ、`TwoFactorAuthenticationFilter.doFilterInternal( )` に進み、`request 9999/oauth/token` に進みますが、同じ古い XSRF トークンが新しい `XSRF` トークン値と一致しないため、`9999/oauth/token` は要求を拒否します。ファーストパス**。公式スペック。しかし、これが問題を引き起こしているかどうかは明らかではありません。また、`TwoFactorAuthenticationController.POST` から完全に形成されたリクエストを送信するためにパラメータにアクセスする方法も明確ではありません。「POST 9999/secure/two_factor_authentication」コントローラー メソッドの「HttpServletRequest」で「パラメーター」「Map」の SYSO を実行しましたが、含まれているのは「pinVal」変数と「_csrf」変数だけです。このリンクをクリックすると、ファイル共有サイトですべての HTTP ヘッダーと Spring Boot ログを読み取ることができます。
**失敗したアプローチ:**
Spring Security 3.2環境で同様の問題に対する@RobWinchのアプローチを 試しました、しかし、このアプローチはSpring OAuth2のコンテキストには適用されないようです. 具体的には、以下に示す「TwoFactorAuthenticationFilter」コードで次の「XSRF」更新コード ブロックのコメントを外すと、ダウンストリーム リクエスト ヘッダーは異なる/新しい「XSRF」トークン値を示しますが、同じエラーがスローされます。if(AuthenticationUtil.hasAuthority(ROLE_TWO_FACTOR_AUTHENTICATED)){ CsrfToken トークン = (CsrfToken) request.getAttribute("_csrf"); response.setHeader("XSRF-TOKEN"/*"X-CSRF-TOKEN"*/, token.getToken()); } **これは、`/oauth/authorize` と `/oauth/token` が相互に通信できるように `XSRF` 設定を更新する必要があることを示しています。 `XSRF` トークン値。** おそらく、これを実現するには `CustomOAuth2RequestFactory` を変更する必要があります。しかし、どのように?
**関連コード:**
`CustomOAuth2RequestFactory` のコードは次のとおりです。public CustomOAuth2RequestFactory(ClientDetailsService clientDetailsService) { super(clientDetailsService); } @Override public AuthorizationRequest createAuthorizationRequest(Map authorizationParameters) { ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpSession セッション = attr.getRequest().getSession(false); if (session != null) { AuthorizationRequest 認可リクエスト = (AuthorizationRequest) セッション。getAttribute(SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME); if (authorizationRequest != null) { session.removeAttribute(SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME); 承認リクエストを返します。super.createAuthorizationRequest(authorizationParameters) を返します。} } `TwoFactorAuthenticationFilter` のコードは次のとおりです: //このクラスは次のように追加されます: https://stackoverflow.com/questions/30319666/two-factor-authentication-with-spring-security-oauth2 * 後で {@link com.example.CustomOAuth2RequestFactory} によって選択され、 * 承認フローを続行できるように、セッション内の authorizationRequest を使用します。*/ public class TwoFactorAuthenticationFilter extends OncePerRequestFilter { private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); プライベート OAuth2RequestFactory oAuth2RequestFactory; //これらの次の 2 つは、定義されていないときに発生したコンパイル エラーを回避するためのテストとして追加されます。public static final String ROLE_TWO_FACTOR_AUTHENTICATED = "ROLE_TWO_FACTOR_AUTHENTICATED"; public static final String ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED = "ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED"; @Autowired public void setClientDetailsService(ClientDetailsService clientDetailsService) { oAuth2RequestFactory = new DefaultOAuth2RequestFactory(clientDetailsService); } private boolean twoFactorAuthenticationEnabled(コレクション権限) { System.out.println(">>>>>>>>>>> 権限のリストには次が含まれます: "); for (GrantedAuthority 権限 : 権限) { System.out.println("auth: "+authority.getAuthority() ); anyMatch(権限 -> ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED.equals(権限.getAuthority())); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.out.println("------------------ INSIDE TwoFactorAuthenticationFilter. + twoFactorAuthenticationEnabled(authorizationRequest.getAuthorities()) ); System.out.println("======================= twoFactorAuthenticationEnabled(SecurityContextHolder.getContext().getAuthentication().getAuthorities()) は: " + twoFactorAuthenticationEnabled(SecurityContextHolder.getContext().getAuthentication().getAuthorities()) ); if (twoFactorAuthenticationEnabled(authorizationRequest.getAuthorities()) || twoFactorAuthenticationEnabled(SecurityContextHolder.getContext().getAuthentication().getAuthorities())) { // authenticationRequest をセッションに保存します。// これにより、CustomOAuth2RequestFactory は、 // ユーザーが 2 要素認証を正常に実行した後に、この保存されたリクエストを AuthenticationEndpoint に返すことができます。request.getSession().setAttribute(CustomOAuth2RequestFactory.SAVED_AUTHORIZATION_REQUEST_SESSION_ATTRIBUTE_NAME, authorizationRequest); // ユーザーが 2 要素認証コードを入力する必要があるページをリダイレクトします redirectStrategy.sendRedirect(request, response, ServletUriComponentsBuilder.fromCurrentContextPath() .path(TwoFactorAuthenticationController.PATH) .toUriString()); 戻る; //if(AuthenticationUtil.hasAuthority(ROLE_TWO_FACTOR_AUTHENTICATED)){ // CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); // これは、ヘッダーまたは HTTP パラメーターとして含まれるトークンの値です // response.setHeader("XSRF-TOKEN", token.getToken()); //} filterChain.doFilter(リクエスト、レスポンス); } プライベート Map paramsFromRequest(HttpServletRequest リクエスト) { Map params = new HashMap(); for (エントリエントリ: request.getParameterMap().entrySet()) { params.put(entry.getKey(), entry.getValue()[0]); パラメータを返します。} } } プライベート Map paramsFromRequest(HttpServletRequest リクエスト) { Map params = new HashMap(); for (エントリエントリ: request.getParameterMap().entrySet()) { params.put(entry.getKey(), entry.getValue()[0]); パラメータを返します。} } } プライベート Map paramsFromRequest(HttpServletRequest リクエスト) { Map params = new HashMap(); for (エントリエントリ: request.getParameterMap().entrySet()) { params.put(entry.getKey(), entry.getValue()[0]); パラメータを返します。} }
**コンピュータで問題を再現:**
次の簡単な手順に従って、数分で任意のコンピューターで問題を再現できます。 1.)このリンクをクリックして、ファイル共有サイトからアプリの圧縮バージョンをダウンロードします。. 2.) 「tar -zxvf oauth2.tar(2).gz」と入力してアプリを解凍します。 3.) 「oauth2/authserver」に移動し、「mvn spring-boot:run」と入力して「authserver」アプリを起動します。 . 4.) 「oauth2/resource」に移動してから「mvn spring-boot:run」と入力して、「resource」アプリを起動します。 5.) 「oauth2/ui」に移動してから「mvn」と入力して、「ui」アプリを起動します。 spring-boot:run` 6.) Web ブラウザーを開き、`http : // localhost : 8080` に移動します。クリックして送信します。8.) 「PIN コード」として「5309」を入力し、送信をクリックします。**これにより、上記のエラーが発生します。** 完全なソース コードを表示するには、a.) maven プロジェクトを IDE にインポートするか、b.) 解凍したディレクトリ内を移動してテキスト エディターで開きます。
このリンクをクリックする と、ファイル共有サイトですべての HTTP ヘッダーと Spring Boot ログを読み取ることができます。
spring - Spring セキュリティ、リフレッシュ トークン、NotSerializableException
次のエンティティがあります。
関連するドライバーの表:
トークンを更新しようとすると (/oauth/token?grant_type=refresh_token&client_id=abc&client_secret=abcd&refresh_token=...)、次のエラー メッセージが表示されます。
どうすれば修正できますか?そして、この問題の原因は何ですか?
Helpers.geometry 関数:
java - WebSecurityConfigurerAdapter と ResourceServerConfigurerAdapter の間に HttpSecurity をセットアップする方法
WebSecurityConfigurerAdapter
とResourceServerConfigurerAdapter
定義configure(HttpSecurity http)
メソッドの両方。ただし、同じようには動作しないようです。たとえば、 を使用する場合、 で使用する場合とは異なり、 forWebSecurityConfigurerAdapter
を定義する必要はありません。このため、私は でメソッドを使用することを好みますが、セットアップに両方のコンフィギュアラーがあると、いくつかの Bean が既にビルドされていることを示す例外が発生します (私はそれが だと思います)。この競合を解決するにはどうすればよいですか?AuthenticationProvider
UsernamePasswordAuthenticationToken
ResourceConfigurerAdapter
configure
WebSecurityConfigurerAdapter
springSecurityFilter
java - simpleJavaコードを使用してSpring Oath2のクライアント側からaccessTokenを取得するにはどうすればよいですか?
私はSpring Oauthが初めてで、単純なOauthServerとResource Serverを構成しています。
コードを使用してアクセス トークンを取得するにはどうすればよいですか?
以下の curl コマンドを使用します。
以下の応答が得られます。
クライアント Java コードを使用して上記の応答を取得するにはどうすればよいですか? 私が試したことは以下ですが、DefaultTokenService Null Pointer Exceptionとしてエラーが発生しますが、正しい方法を使用しているかどうかはわかりません。
java - swaggerでaccess_tokenを渡す方法は?
access_token なしですべての API をブロックする oauth 2 を構成しました。swagger ui に長い有効期間を持つ access_token を追加して、swagger からの API 呼び出しが正常に機能するようにします。私はこれについてグーグルで検索しましたが、最善の解決策が見つかりませんでした。以下は、言われたこれからのコードスニペットです。
しかし、それは機能していません。上記で私を助けてください