使用PHP SDK调用Cognito getUser接口时遭遇凭证获取错误
AWS Cognito PHP SDK v3调用getUser接口问题解决
问题根源
前端JS SDK调用Cognito的getUser接口时,是直接通过OAuth2的access_token完成身份验证,不需要AWS IAM签名凭证;而PHP SDK v3作为服务端SDK,默认会尝试加载AWS凭证(比如环境变量、实例角色元数据等)来签名请求,但getUser属于Cognito用户池的用户信息接口,不需要AWS签名,这就导致SDK错误地尝试获取凭证,最终触发超时报错。
解决方案
创建CognitoIdentityProvider客户端时,明确禁用凭证获取链,同时指定用户池所在区域,然后直接传入access_token调用接口即可。
代码示例
use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient; use Aws\Exception\AwsException; // 初始化客户端,关键配置是禁用凭证加载 $cognitoClient = new CognitoIdentityProviderClient([ 'region' => '你的用户池区域(如ap-southeast-1)', 'version' => 'latest', 'credentials' => false, // 禁用自动凭证获取,避免超时 ]); try { // 调用getUser接口,传入数据库中取出的access_token $userResponse = $cognitoClient->getUser([ 'AccessToken' => '你的access_token', ]); // 提取用户属性(比如邮箱) foreach ($userResponse['UserAttributes'] as $attribute) { if ($attribute['Name'] === 'email') { $userEmail = $attribute['Value']; break; } } echo "用户邮箱:{$userEmail}"; } catch (AwsException $e) { echo "调用失败:{$e->getMessage()}"; }
注意事项
- 确保
access_token未过期、未被吊销,且属于目标用户池。 - 即使PHP部署在AWS服务(如EC2、Lambda)内,只要不需要IAM权限调用该接口,就必须设置
credentials => false,阻止SDK自动尝试获取实例元数据。 - 确认用户池的权限配置:默认情况下,有效
access_token对应的用户都能调用getUser接口,若有自定义权限策略需检查是否允许该操作。
内容的提问来源于stack exchange,提问作者aff
相关产品推荐
相关产品推荐

