如何获取Amazon Cognito Identity ID 重构Amplify Storage的S3文件路径
解答
获取user_identity_id(Cognito Identity ID)的方法
首先明确:Cognito身份池本身不提供「用户标识-Identity ID」的反向查询、批量查询接口,所有查询逻辑都要结合你自身的业务存储实现:
- 获取当前认证用户的ID:只要用户通过Cognito完成身份认证,就可以直接从认证返回的凭证中取到该值。在Python等脚本场景下,可以直接通过boto3调用接口获取,示例代码:
import boto3 cognito_id_client = boto3.client('cognito-identity', region_name='<身份池所属区域>') resp = cognito_id_client.get_id( IdentityPoolId='<你的Cognito身份池ID>', Logins={ '<Cognito用户池提供商标识>': '<当前用户的有效ID Token>' } ) current_identity_id = resp['IdentityId']
- 获取指定用户的ID:需要在用户首次登录应用、首次获取到自身Identity ID时,将业务侧的用户唯一标识(比如Cognito用户池Sub、业务系统用户ID)和对应的
user_identity_id写入自己的业务数据库(如DynamoDB、关系型数据库),后续需要查询指定用户的ID时,直接查库读取映射即可,没有原生接口可直接反查。 - 获取全量用户的ID:同样依赖上述业务库存储的映射关系做全量查询。如果前期没有做映射落库,只能通过遍历S3桶内
protected/、private/前缀下的对象路径,从路径片段中提取所有出现过的user_identity_id,但该方法无法覆盖从未访问过存储资源的用户。
非Amplify场景重构Storage.put的S3存储路径
Amplify Storage的S3路径规则是固定的,只要对齐规则拼接就能和前端Storage.put上传的路径完全一致,默认无自定义前缀的规则如下:
- 公开权限(level: public)文件路径:
public/<上传时传入的对象key> - 受保护权限(level: protected)文件路径:
protected/<所属用户的user_identity_id>/<上传时传入的对象key> - 私有权限(level: private)文件路径:
private/<所属用户的user_identity_id>/<上传时传入的对象key>
举个实际示例:如果前端调用Storage.put('doc/note.pdf', file, {level: 'private'})时,操作用户的user_identity_id为us-east-1:123e4567-e89b-12d3-a456-426614174000,那该文件在S3中的完整对象Key就是private/us-east-1:123e4567-e89b-12d3-a456-426614174000/doc/note.pdf。
在Python notebook等非Amplify场景下,你只需要提前拿到操作用户的user_identity_id,按照上述规则拼接出完整S3对象Key,再通过boto3等S3 SDK上传即可。
注意:如果你在Amplify项目中给Storage配置了自定义根路径前缀,需要在上述所有路径的最前面拼接该自定义前缀,前缀值可以在项目的Amplify配置文件的Storage模块中查到。
内容的提问来源于stack exchange,提问作者orome
相关产品推荐
相关产品推荐

