コンテンツにスキップ

認証・SSO(Authentication & SSO)

bizhiwayはOAuth2 / OIDCを主要な認証プロトコルとして使用し、社内IdP(Active Directory、Azure AD等)とのSSO(Single Sign-On)統合にはSAML 2.0を採用しています。すべての認証処理はservice-oauthが担当します。


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}"]

フロントエンドはユーザー種別ごとに異なるOIDCクライアントを使用します。

クライアント対象ユーザーポータル
provider-clientProvider・Buyer・MallMastersrc-vbizhw-common(3100)/ src-vbizhw(3101)
supplier-clientSupplier・MallSuppliersrc-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: データを返却

企業内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}

トークン種別説明保存場所
Access Token短期有効のJWT — APIリクエストに付与localStorage
Refresh Token長期有効 — Access Tokenの更新に使用localStorage
Silent RefreshAccess Token失効前に自動更新oidc-client-tsが処理

クロスタブログアウト: 1つのタブでログアウトすると、BroadcastChannel('auth') を通じて同ドメインの全タブが自動的にログアウトします。


ログアウト種別動作
通常ログアウトlocalStorageからトークンを削除してログイン画面へリダイレクト
SAMLログアウト企業IdPへSAML LogoutRequestを送信 → SSOセッションも終了
セッション切れ(401)Axiosインターセプターが検知 → 自動的にログイン画面へ

モバイル端末からのアクセスはVITE_MOBILE_URL(.env設定値)へ自動的にリダイレクトされます。


  • ロール別のcompany_division_code: 10=Buyer, 20=Supplier, 90=Provider — ログイン後のアクセス権限判定に使用。
  • Gateway経由でトークン検証: すべてのAPIリクエストでgatewayがservice-oauthにトークン検証を依頼してからルーティング。
  • 完全ステートレス: サーバー側セッションなし — 状態はすべてJWTトークンに含まれる。
  • SAMLはオプション: 全クライアントがSSOを使用するわけではありません。SAMLなしのクライアントはOIDCを使用。

画面URL (Staging)
ログイン画面/eProcurement/Login
OIDCコールバック/eProcurement/Callback
SAML SSO/SSO/SAML/IDP/{registrationId}
ログアウト/eProcurement/Logout