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

身分驗證流程包含下列步驟:
HTTP 請求搭配 DICOMweb 端點的承載字符
AWS HealthImaging 檢查字符過期
將請求轉送給 Lambda 授權方
Lambda 使用身分提供者 (IdP) 驗證權杖
Lambda 傳回 IAM 角色
政策評估和使用者身分驗證完成
先決條件
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
實作流程
用戶端身分驗證流程
使用者身分驗證:將使用者導向 IdP 的授權端點
權杖擷取:ID 和存取權杖 (JWT) 的交換授權碼
API 呼叫:在 HTTP 授權承載標頭中包含存取權杖
權杖驗證: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:
驗證所有字符宣告 (nbf、exp、iat)
驗證角色 ARN 格式
擔任角色
代表使用者使用 SigV4 簽署原始請求
處理 DICOMweb 請求
例外狀況
條件 | AHI 回應 |
---|---|
Lambda 授權方不存在或無效 | 424 授權方設定錯誤 |
由於執行失敗而終止授權方 | 424 授權方失敗 |
任何其他未映射的授權方錯誤 | 424 授權方失敗 |
授權方傳回無效/格式錯誤的回應 | 424 授權方設定錯誤 |
授權方執行超過 1 秒 | 408 授權方逾時 |
字符已過期或無效 | 403 權杖無效或過期 |
由於授權方組態錯誤,AHI 無法聯合傳回的 IAM 角色 | 424 授權方設定錯誤 |
授權方傳回空的角色 | 403 存取遭拒 |
傳回的角色不可呼叫 (assume-role/trust misconfig) | 424 授權方設定錯誤 |
請求率超過 DICOMweb Gateway 限制 | 429 太多請求 |
資料存放區、傳回角色或授權方跨帳戶/跨區域 | 424 授權方跨帳戶/跨區域存取 |