SpringSecurity OpenIDConnectでOpenAMとの連携を試します。
/private
は認証を必要とするエンドポイントで、/public
は認証が不要なエンドポイントです。
また、ログは可能な限り出力する方針とします。SpringSecurityのデバッグログに加えてRestTemplateのリクエストとレスポンスもログに出力します。
OAuth 2.0とOpenID Connectについては以下の記事がとてもわかりやすいです。
https://logmi.jp/tech/articles/322839
1. OpenAMの実行と設定
まずはOpenAMを実行します。前回実行していたら不要です。
1 |
|
- パスワードの設定しTopLevelのレルムにOAuth2のアプリケーションを作成します。名前は
openid_test
、パスワードはpassword
としました。 Redirection URIs
にhttp://localhost:9000/login/oauth2/code/openam
を追加します。Scope
にemail
とopenid
を追加します。
2. アプリケーションの作成
application.yml
まずは設定ファイル。8080ポートはOpenAMが使っているので9000にしました。
1 |
|
CustomOidcUserService.java
ログを出力するように、OidcUserService
のOauth2UserService
を上書きします。
1 |
|
SecurityConfig.java
1 |
|
他
ほかは、前回のOAuth2と同じです。
処理の流れ
処理の流れは以下のとおりです。
- ブラウザで
http://localhost:9000/private
にアクセスする - アプリケーションからOpenAMへのリダイレクト指示が返るので、OpenAMのログインページにリダイレクトする
http://localhost:8080/openam/oauth2/authorize?response_type=code&client_id=openid_test&scope=email%20openid&state=SpFiRmKQyJG42n6HrTDr4E6aHBt3r5l7GDNEBikzM2s%3D&redirect_uri=http://localhost:9000/login/oauth2/code/openid_test&nonce=2mPPqOqM1fLpudfAnyUWMU3RKx4pCL1k12mEp9MTHoY
- ID、パスワードを入力しOpenAMにログインする
- OpenAMのレスポンスからアプリケーションへのリダイレクト指示が返るので、アプリケーションにリダイレクトする
http://localhost:9000/login/oauth2/code/openid_test?code=d009a213-a43c-4314-b6e8-9cb565eb5f2a&scope=openid%20email&iss=http%3A%2F%2Flocalhost%3A8080%2Fopenam%2Foauth2&state=SpFiRmKQyJG42n6HrTDr4E6aHBt3r5l7GDNEBikzM2s%3D&client_id=openid_test
- アプリケーションがOpenAMのAPIを呼び出してアクセストークンとIDトークンを取得する
1
2
3
4
5
6
7
8
9
10
11
12===========================request begin================================================
URI : http://localhost:8080/openam/oauth2/access_token
Method : POST
Headers : [Accept:"application/json;charset=UTF-8", Content-Type:"application/x-www-form-urlencoded;charset=UTF-8", Authorization:"Basic b3BlbmlkX3Rlc3Q6cGFzc3dvcmQ=", Content-Length:"152"]
Request body: grant_type=authorization_code&code=d009a213-a43c-4314-b6e8-9cb565eb5f2a&redirect_uri=http%3A%2F%2Flocalhost%3A9000%2Flogin%2Foauth2%2Fcode%2Fopenid_test
==========================request end================================================
============================response begin==========================================
Status code : 200 OK
Status text :
Headers : [X-Frame-Options:"SAMEORIGIN", Cache-Control:"no-store", Date:"Sat, 11 Jun 2022 08:34:13 GMT", Accept-Ranges:"bytes", Server:"Restlet-Framework/2.4.0", Vary:"Accept-Charset, Accept-Encoding, Accept-Language, Accept", Pragma:"no-cache", Content-Type:"application/json", Transfer-Encoding:"chunked", Keep-Alive:"timeout=20", Connection:"keep-alive"]
Response body: {"access_token":"c170e237-39ee-4901-941f-589d781f87b9","scope":"openid email","id_token":"eyJ0eXAiOiJKV1QiLCJraWQiOiJ6aEJvZmJadytqa1paalhzMjhmR2Z6eFpnTTg9IiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoidVZrSXRFZlpJQWJheGVJZW9mOTlWUSIsInN1YiI6IlRhcm8iLCJhdWRpdFRyYWNraW5nSWQiOiI1YzY1MWRkNC1hOTc2LTQ3YzAtOGE3Ni1mNWUyYjcyMWRjODgtMTAwMjAwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL29wZW5hbS9vYXV0aDIiLCJ0b2tlbk5hbWUiOiJpZF90b2tlbiIsIm5vbmNlIjoiMm1QUHFPcU0xZkxwdWRmQW55VVdNVTNSS3g0cENMMWsxMm1FcDlNVEhvWSIsImF1ZCI6Im9wZW5pZF90ZXN0IiwiY19oYXNoIjoiYkVqMnkwYngyRmhKOHpqblNDY0l2USIsIm9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5vcHMiOiI3NDE2YThkNC1kZjE1LTRhMWEtOWQ0Mi0xOWY4MjhiNDdlMjEiLCJhdXRoOnRpbWUiOjE2NTQ5MzUzODYsImF6cCI6Im9wZW5pZF90ZXN0IiwicmVhbG0iOiIvIiwiZXhwIjoxNjU0OTQwMDUzLCJ0b2tlblR5cGUiOiJKV1RUb2tlbiIsImlhdCI6MTY1NDkzNjQ1M30.fpIw-9ZaYqIteeyU2QVAh6yvpm1A-JxhihtIFXfRpPriSb1cdYh1glsH0LqVDL9TurPZX56rq0UFvgwfDI9O45j48aTIfslUumI5tVWyVm4E5H0vDVuvxVo7ZYHyTwPkAKn2BTfItS0c4-7Nf_RTGXewwbjZefPgQEYEzhtK4ycvOkNEXapR6lvXNTPMZiC9uT-wyWl3_IfEjQFaa7lY2H4kIf4ochuLENlwC4f7nOGDTYZLlu8AX62hL_HIb-Rf6J-8N7AeNHRQHjK_H4cslltQSMROdZ7SYibWTU7IOEx4ILG2bTnPyj-wGj0V9WAs6giCsBt-r-eIqplpwiymCg","token_type":"Bearer","expires_in":3599,"nonce":"2mPPqOqM1fLpudfAnyUWMU3RKx4pCL1k12mEp9MTHoY"}
=======================response end================================================= - アプリケーションがOpenAMのAPIを呼び出してトークン検証用のJWKを取得する
GET
http://localhost:8080/openam/oauth2/connect/jwk_uri
- アプリケーションがOpenAMのAPIを呼び出してユーザー情報を取得する
1
2
3
4
5
6
7
8
9
10
11
12===========================request begin================================================
URI : http://localhost:8080/openam/oauth2/userinfo
Method : GET
Headers : [Accept:"application/json", Authorization:"Bearer c170e237-39ee-4901-941f-589d781f87b9", Content-Length:"0"]
Request body:
==========================request end================================================
============================response begin==========================================
Status code : 200 OK
Status text :
Headers : [X-Frame-Options:"SAMEORIGIN", Date:"Sat, 11 Jun 2022 08:34:13 GMT", Accept-Ranges:"bytes", Server:"Restlet-Framework/2.4.0", Vary:"Accept-Charset, Accept-Encoding, Accept-Language, Accept", Content-Type:"application/json;charset=UTF-8", Transfer-Encoding:"chunked", Keep-Alive:"timeout=20", Connection:"keep-alive"]
Response body: {"sub":"Taro","email":"taro@example.com"}
=======================response end================================================= - もともとアクセスしようとしていた
http://localhost:9000/private
にリダイレクトする