認証・SSO(Authentication & SSO)
bizhiwayはOAuth2 / OIDCを主要な認証プロトコルとして使用し、社内IdP(Active Directory、Azure AD等)とのSSO(Single Sign-On)統合にはSAML 2.0を採用しています。すべての認証処理はservice-oauthが担当します。
全体アーキテクチャ
Section titled “全体アーキテクチャ”flowchart TD
USER(["👤 ユーザー\nポータルへアクセス"]) --> FE
subgraph FE["フロントエンド"]
OIDC_CLIENT["oidc-client-ts\n(auth-service.js)"]
end
FE --> GATEWAY["service-gateway\nAPIゲートウェイ"]
GATEWAY --> OAUTH["service-oauth\nOAuth2 / OIDC / SAML"]
OAUTH --> IDP{"Identity Provider"}
IDP -->|"OIDC / Password"| LOCAL_IDP["J2内部IdP\n(J2アカウント)"]
IDP -->|"SAML SSO"| CORP_IDP["企業IdP\nAzure AD / AD FS..."]
OAUTH --> TOKEN["JWT Access Token\n+ Refresh Token"]
TOKEN --> FE
FE --> API["APIリクエスト\nAuthorization: Bearer {token}"]
2つのOIDCクライアント
Section titled “2つのOIDCクライアント”フロントエンドはユーザー種別ごとに異なるOIDCクライアントを使用します。
| クライアント | 対象ユーザー | ポータル |
|---|---|---|
provider-client | Provider・Buyer・MallMaster | src-vbizhw-common(3100)/ src-vbizhw(3101) |
supplier-client | Supplier・MallSupplier | src-vbizhw-common(3100) |
OIDCログインフロー(Authorization Code Flow)
Section titled “OIDCログインフロー(Authorization Code Flow)”sequenceDiagram
participant U as ユーザー
participant FE as フロントエンド
participant GW as service-gateway
participant OA as service-oauth
U->>FE: URLにアクセス(未ログイン)
FE->>FE: トークンがないことを検知
FE->>OA: ログインページへリダイレクト
U->>OA: ユーザー名・パスワードを入力
OA->>OA: 認証処理
OA->>FE: Authorization Codeと共にリダイレクト
FE->>OA: CodeをAccess Token + Refresh Tokenと交換
OA->>FE: JWTトークンを返却
FE->>FE: トークンをlocalStorageに保存
FE->>GW: Bearer token付きAPIリクエスト
GW->>OA: トークン検証
OA->>GW: 検証OK
GW->>FE: データを返却
SAML SSO
Section titled “SAML SSO”企業内IdPと統合し、一度のログインで全システムを利用できます。
flowchart LR
USER(["ユーザー\nJ2にアクセス"]) --> FE["フロントエンド\nSSO検知"]
FE --> OAUTH["service-oauth\n/SSO/SAML/IDP/:registrationId"]
OAUTH --> CORP["企業IdP\nAzure AD / AD FS"]
CORP --> OAUTH
OAUTH --> TOKEN["JWT生成\nフロントエンドへ返却"]
TOKEN --> FE
SAML設定:
- 各クライアントに固有の
registrationIdを設定 - 許可IdPのリストはProviderが管理
- URLパターン:
/SSO/SAML/IDP/{registrationId}
トークンとセッション管理
Section titled “トークンとセッション管理”| トークン種別 | 説明 | 保存場所 |
|---|---|---|
| Access Token | 短期有効のJWT — APIリクエストに付与 | localStorage |
| Refresh Token | 長期有効 — Access Tokenの更新に使用 | localStorage |
| Silent Refresh | Access Token失効前に自動更新 | oidc-client-tsが処理 |
クロスタブログアウト: 1つのタブでログアウトすると、BroadcastChannel('auth') を通じて同ドメインの全タブが自動的にログアウトします。
| ログアウト種別 | 動作 |
|---|---|
| 通常ログアウト | localStorageからトークンを削除してログイン画面へリダイレクト |
| SAMLログアウト | 企業IdPへSAML LogoutRequestを送信 → SSOセッションも終了 |
| セッション切れ(401) | Axiosインターセプターが検知 → 自動的にログイン画面へ |
モバイルリダイレクト
Section titled “モバイルリダイレクト”モバイル端末からのアクセスはVITE_MOBILE_URL(.env設定値)へ自動的にリダイレクトされます。
ビジネスルール
Section titled “ビジネスルール”- ロール別のcompany_division_code:
10=Buyer,20=Supplier,90=Provider — ログイン後のアクセス権限判定に使用。 - Gateway経由でトークン検証: すべてのAPIリクエストでgatewayがservice-oauthにトークン検証を依頼してからルーティング。
- 完全ステートレス: サーバー側セッションなし — 状態はすべてJWTトークンに含まれる。
- SAMLはオプション: 全クライアントがSSOを使用するわけではありません。SAMLなしのクライアントはOIDCを使用。
画面・URL
Section titled “画面・URL”| 画面 | URL (Staging) |
|---|---|
| ログイン画面 | /eProcurement/Login |
| OIDCコールバック | /eProcurement/Callback |
| SAML SSO | /SSO/SAML/IDP/{registrationId} |
| ログアウト | /eProcurement/Logout |