Skip to content

OCHaCafe 4 #4 マイクロサービスの認証・認可とJWTのデモ

Notifications You must be signed in to change notification settings

shukawam/ochacafe-mp-jwt-demo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OCHaCafe Season4 - #4 マイクロサービスの認証・認可と JWT

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のオートスケーリング"
}

Appendix - IDCS の設定

  1. IDCS にログインし、"機密アプリケーション"を作成する
  2. クライアントを登録する
    1. 許可する権限付与タイプとして以下を追加する
      • クライアント資格証明
      • JWT アサーション
      • リフレッシュトークン
      • 認可コード
    2. HTTPS 以外の URL を許可にチェックを入れる(HTTPS であれば不要な設定です)
    3. リダイレクト URL をhttp://<your-host>:<your-port>/oidc/redirectと設定する
      • e.g. http://localhost:7987/oidc/redirect
    4. クライアント・タイプは"機密"を選択する

About

OCHaCafe 4 #4 マイクロサービスの認証・認可とJWTのデモ

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 86.3%
  • Dockerfile 13.7%