MicroProfile JWT RBAC を使用したマイクロサービスの認証・認可のデモのソースコードです.
.
├── README.md
├── auth [ユーザー認証用サービス(OIDC + FIDO)]
│ ├── Dockerfile
│ ├── README.md
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── me
│ │ │ └── shukawam
│ │ │ └── example
│ │ │ └── mp
│ │ │ └── auth
│ │ │ ├── AuthResource.java [ユーザー認証エンドポイント定義]
│ │ │ ├── AuthService.java [認証関連サービスクラス]
│ │ │ ├── IdcsResource.java [MicroProfile - REST Client]
│ │ │ ├── data
│ │ │ │ └── UserProfile.java [OpenID Connect UserInfo endpoint response def.]
│ │ │ ├── log
│ │ │ │ └── LoggerFactory.java
│ │ │ └── package-info.java
│ │ └── resources
│ │ ├── META-INF
│ │ │ ├── beans.xml
│ │ │ ├── microprofile-config.properties
│ │ │ └── native-image
│ │ │ └── reflect-config.json
│ │ ├── application.yaml [アプリケーションの設定ファイル]
│ │ └── logging.properties
│ └── test
│ └── java
│ └── me
│ └── shukawam
│ └── example
│ └── mp
│ └── auth
│ └── MainTest.java
├── deploy
│ └── kubernetes [Kubernetes デプロイメント用 Manifest]
│ ├── base
│ │ ├── auth.yaml
│ │ ├── event.yaml
│ │ ├── kustomization.yaml
│ │ ├── mandatory.yaml
│ │ └── mp-jwt-ingress.yaml
│ └── overlays
│ └── kustomization.yaml
├── event [認証・認可制御対象アプリケーション]
│ ├── Dockerfile
│ ├── README.md
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── me
│ │ │ └── shukawam
│ │ │ └── example
│ │ │ └── mp
│ │ │ └── event
│ │ │ ├── CreateEventRequest.java
│ │ │ ├── Event.java
│ │ │ ├── EventResource.java [Eventサービスに対するエンドポイント定義]
│ │ │ ├── EventService.java [Event関連処理のサービスクラス]
│ │ │ ├── exception
│ │ │ │ ├── EventNotFoundException.java
│ │ │ │ └── EventNotFoundExceptionMapper.java
│ │ │ └── package-info.java
│ │ └── resources
│ │ ├── META-INF
│ │ │ ├── beans.xml
│ │ │ ├── init_script.sql
│ │ │ ├── microprofile-config.properties
│ │ │ ├── native-image
│ │ │ │ ├── native-image.properties
│ │ │ │ └── reflect-config.json
│ │ │ └── persistence.xml
│ │ ├── application.yaml [アプリケーションの設定ファイル]
│ │ ├── hibernate.properties
│ │ └── logging.properties
│ └── test
│ └── java
│ └── me
│ └── shukawam
│ └── example
│ └── mp
│ └── event
│ └── MainTest.java
└── test
└── test.http [Simple e2e test for VSCode REST Client]
本サンプルアプリケーションは、 Helidon - Security Provider(OidcProvider, IDCSRoleMapper) を用いてマイクロサービスの認証・認可を実現しています.auth/src/resources/application.yaml
, event/src/resources/application.yaml
に当該機能の設定が記載されています.以下の部分を自身の環境に合わせて修正してください.(直接ファイルを編集するのではなく、環境変数に設定することを推奨します)
下記以外のパラメーターに関しては Helidon MP - Security Provider(OIDC Provider) をご参照ください.
# Security config
security:
# Set to true for production - if set to true, clear text passwords will cause failure
config:
require-encryption: false
properties:
# Identity Provider - IDCS
idcs-uri: <your-idcs-tenant-uri>
idcs-client-id: <your-idcs-client-id>
idcs-client-secret: <your-idcs-client-secret>
frontend-uri: <your-front-end>
proxy-host:
# ...
業務処理を担当するマイクロサービス (event) のエンドポイントに対して RBAC で制御をかけています.
Path | Role |
---|---|
GET /event | Admin, Guest |
GET /event/id/{id} | Admin, Guest |
GET /event/season/{season} | Admin, Guest |
POST /event | Admin |
DELETE /event/id/{id} | Admin |
http://<auth-host>:<auth-port>/auth/login
へアクセスし、認証情報を入力するとブラウザに OAuth 2.0 のアクセストークンが返却されるので、その取得したアクセストークンを用いて event サービスに対して API リクエストを行います.
リクエスト;
curl --request GET --url http://<event-host>:<event-port>/event/id/215000 --header 'authorization: Bearer eyJ...'
レスポンス(Role: Guest);
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Tue, 22 Jun 2021 08:40:00 GMT
Content-Type: application/json
Content-Length: 127
Connection: close
{
"eventDate": "2021-07-07Z",
"id": 215000,
"presenter": "k",
"season": "4",
"title": "マイクロサービスの認証・認可とJWT"
}
リクエスト;
curl --request POST --url http://<event-host>:<event-port>/event --header 'authorization: Bearer eyJ...' --header 'content-type: application/json' --data '{"title": "Kubernetesのオートスケーリング","season": "4","presenter": "n","eventDate": "2020-08-11"}'
レスポンス(Role: Guest);
HTTP/1.1 403 Forbidden
Server: nginx/1.17.8
Date: Tue, 22 Jun 2021 08:42:18 GMT
Content-Length: 0
Connection: close
レスポンス(Role: Admin);
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Tue, 22 Jun 2021 12:18:58 GMT
Content-Type: application/json
Content-Length: 119
Connection: close
{
"eventDate": "2020-01-11Z",
"id": 216000,
"presenter": "n",
"season": "4",
"title": "Kubernetesのオートスケーリング"
}
- IDCS にログインし、"機密アプリケーション"を作成する
- クライアントを登録する
- 許可する権限付与タイプとして以下を追加する
- クライアント資格証明
- JWT アサーション
- リフレッシュトークン
- 認可コード
- HTTPS 以外の URL を許可にチェックを入れる(HTTPS であれば不要な設定です)
- リダイレクト URL を
http://<your-host>:<your-port>/oidc/redirect
と設定する- e.g.
http://localhost:7987/oidc/redirect
- e.g.
- クライアント・タイプは"機密"を選択する
- 許可する権限付与タイプとして以下を追加する