使用 AWS Lambda 授權方 - AWS HealthImaging

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS Lambda 授權方

顯示 HealthImaging 中 OIDC Lambda 工作流程的圖表。

身分驗證流程包含下列步驟:

  1. HTTP 請求搭配 DICOMweb 端點的承載字符

  2. AWS HealthImaging 檢查字符過期

  3. 將請求轉送給 Lambda 授權方

  4. Lambda 使用身分提供者 (IdP) 驗證權杖

  5. Lambda 傳回 IAM 角色

  6. 政策評估和使用者身分驗證完成

先決條件

1. Lambda 授權方設定

  • 建立接受 AuthInput 並傳回 AuthResult 的授權方

  • 驗證 BearerToken (簽章、到期、範圍、發行者和業務規則)

  • 傳回具有必要 DICOMweb 操作許可的 IAM 角色 ARN

  • 必須在 ≤ 1 秒內回應 (設定佈建並行)

實作權杖擷取:

// in Node.js export const handler = async (event) => { try { const token = event.bearerToken; const operation = event.operation; } }

2. 資料存放區組態

  • 在建立時提供 lambdaAuthorizerArn 來啟用功能

注意

您的 AWS 帳戶需支付 Lambda 調用和持續時間的費用。如需詳細資訊,請參閱 AWS Lambda 定價。

授權程序詳細資訊

權杖驗證規則

HealthImaging 會評估下列字符宣告:

  • exp – 必須在目前的 UTC 時間之後

  • nbf – 必須在 UTC 目前時間之前

  • iat – 必須在 UTC 的目前時間之前,且不早於 12 小時前 (字符生命週期上限)

事件和回應結構描述

AHI 會使用下列輸入調用您的函數,並預期以下輸出。

授權方輸入

{ "datastoreId": "{datastore id}", "operation": "{Healthimaging API name e.g. GetDICOMInstance}", "bearerToken": "{access token}" }
授權方輸出

{ "isTokenValid": {true or false}, "roleArn": "{role arn or empty string meaning to deny the request explicitly}" }

請求處理

初始請求處理:

  • 如果沒有授權:承載標頭 → 請求會繼續進行 SigV4 驗證

  • 如果存在承載字符:

    • 解決資料存放區的 LambdaAuthorizerArn

    • 使用轉送存取工作階段 (FAS) 叫用授權方

Lambda 授權程序:

  • 使用 datastoreId、操作和 bearerToken 接收 AuthInput

  • 必須在 1 秒內完成驗證

  • 傳回具有驗證狀態和角色 ARN 的 AuthResult

實作流程

用戶端身分驗證流程

  1. 使用者身分驗證:將使用者導向 IdP 的授權端點

  2. 權杖擷取:ID 和存取權杖 (JWT) 的交換授權碼

  3. API 呼叫:在 HTTP 授權承載標頭中包含存取權杖

  4. 權杖驗證:HealthImaging 和 Lambda 授權方的完整驗證程序

設定步驟

Lambda 授權方實作

  • 實作 AuthInput/AuthResult 介面

  • 驗證權杖 (簽章、過期、發行者、對象、範圍)

  • 傳回決策和 IAM 角色 ARN

IAM 組態

  • 建立具有最低 DICOMweb 操作許可的政策

  • 使用 的信任政策建立角色 medical-imaging.region.amazonaws.com

  • 設定 Lambda 執行許可

  • 使用資料存放區 ARN 的 AllowHealthLakeInvocation 陳述式新增資源政策

授權方應具有下列資源政策陳述式:

{ "Sid": "health-imaging", "Effect": "Allow", "Principal": { "Service": "medical-imaging.region.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:region:123456789012:function:LambdaAuthorizerName" }

對於身分驗證 lambda 傳回的 IAM 角色,它必須具有下列信任關係政策:

{ "Effect": "Allow", "Principal": { "Service": "medical-imaging.region.amazonaws.com" }, "Action": "sts:AssumeRole" }

並行組態

  • 設定佈建並行 ≤ 1 秒 SLO

  • 視需要實作冷啟動緩解措施

Lambda 授權方範本

import jwt from 'jsonwebtoken'; import jwksClient from 'jwks-rsa'; const CACHE_TTL = 10 * 60 * 1000; const client = jwksClient({ jwksUri: '{Jwks Url}', cache: true, cacheMaxEntries: 5, cacheMaxAge: 600000, rateLimit: true, jwksRequestsPerMinute: 10 }); export const handler = async (event) => { try { console.log(event); const token = event.bearerToken; const decoded = jwt.decode(token, { complete: true }); if (!decoded || !decoded.header.kid) { console.log('Invalid token structure'); return generatePolicy(null, false); } const key = await client.getSigningKey(decoded.header.kid); const signingKey = key.getPublicKey(); const payload = jwt.verify(token, signingKey, { issuer: '{issuer to be verified}', algorithms: ['RS256'], // Additional verification parameters as needed }); return generatePolicy(payload.sub, true); } catch (error) { console.error('Authorization error:', error); return generatePolicy(null, false); } }; function generatePolicy(user, isValid) { return { isTokenValid: isValid, roleArn: user ? `arn:aws:iam::123456789012:role/${user}` : "" }; }

HealthImaging 的最終驗證

收到 AuthResult 後,HealthImaging:

  1. 驗證所有字符宣告 (nbf、exp、iat)

  2. 驗證角色 ARN 格式

  3. 擔任角色

  4. 代表使用者使用 SigV4 簽署原始請求

  5. 處理 DICOMweb 請求

例外狀況

條件 AHI 回應
Lambda 授權方不存在或無效 424 授權方設定錯誤
由於執行失敗而終止授權方 424 授權方失敗
任何其他未映射的授權方錯誤 424 授權方失敗
授權方傳回無效/格式錯誤的回應 424 授權方設定錯誤
授權方執行超過 1 秒 408 授權方逾時
字符已過期或無效 403 權杖無效或過期
由於授權方組態錯誤,AHI 無法聯合傳回的 IAM 角色 424 授權方設定錯誤
授權方傳回空的角色 403 存取遭拒
傳回的角色不可呼叫 (assume-role/trust misconfig) 424 授權方設定錯誤
請求率超過 DICOMweb Gateway 限制 429 太多請求
資料存放區、傳回角色或授權方跨帳戶/跨區域 424 授權方跨帳戶/跨區域存取