如何在Amplify刷新令牌时将设备密钥传入Cognito预令牌生成Lambda函数?
在AWS Amplify令牌刷新流程中传递设备密钥至Cognito预令牌生成Lambda
1. 确保设备跟踪已启用
先确认你的Cognito用户池已开启设备跟踪功能(在用户池设置的「设备」选项卡中配置,比如选择「记住设备」或「需要验证设备」),同时Amplify Auth配置支持设备认证。你的aws-exports.js中Auth配置需包含正确的认证流程:
const awsmobile = { // ...其他配置 Auth: { authenticationFlowType: "USER_SRP_AUTH", // 支持设备跟踪的默认流程 // 其他Auth配置项 } };
Amplify会自动存储已验证设备的凭证,后续刷新令牌时会自动关联设备信息。
2. 刷新令牌时自动传递设备密钥
当Amplify自动触发令牌刷新(或调用Auth.currentSession())时,只要设备已被验证,Cognito会自动将设备密钥(deviceKey)传递给预令牌生成Lambda函数,无需在Amplify端手动额外处理。
3. 在预令牌生成Lambda中访问设备密钥
Lambda函数的事件参数直接包含设备相关信息,你可以从event.request对象中提取:
exports.handler = async (event) => { // 获取设备密钥 const deviceKey = event.request.deviceKey; // 可选:获取设备属性 const deviceAttributes = event.request.deviceAttributes; // 示例:将设备密钥添加到JWT自定义声明中 if (deviceKey) { event.response.claimsOverrideDetails = { claimsToAddOrOverride: { "custom:device_key": deviceKey } }; } return event; };
注意:只有当设备处于「已验证」状态时,deviceKey才会出现在事件中。如果用户未选择记住设备,或设备未通过验证,该字段会缺失。
4. 手动处理场景(自动传递失效时)
如果遇到Amplify未自动传递设备密钥的情况,可通过Amplify请求拦截器手动添加设备信息:
import { Auth } from 'aws-amplify'; // 配置请求拦截器 Auth.configure({ interceptors: { async request(interceptorOptions) { // 获取本地存储的设备密钥 const device = await Auth.getDevice(); if (device && device.deviceKey) { // 修改请求参数,添加设备密钥(匹配Cognito API参数要求) interceptorOptions.data.deviceKey = device.deviceKey; } return interceptorOptions; } } });
不过这种场景极少出现,通常自动传递机制即可满足需求。
内容的提问来源于stack exchange,提问作者Arsham Sedaghatbin
相关产品推荐
相关产品推荐

