我正在使用php开发一个Web应用程序。我将用户凭据存储在AWS cognito服务上。我使用PHP sdk将用户登录到Cognito。我成功开发了这个功能。我在我的机器上本地测试它,它正在工作。然后我将它部署到登台服务器上,它也在登台服务器上运行。但是当我将它部署到实时服务器上时。它给了我这个错误。
(1/1) CredentialsException
Error retrieving credentials from the instance profile metadata server. (cURL error 7: Failed to connect to 169.254.169.254 port 80: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))
这是我的代码
try{
$client = new CognitoIdentityProviderClient([
'version' => 'latest',
'region' => 'eu-west-2'// env('AWS_REGION', '')
]);
$result = $client->adminInitiateAuth([
'AuthFlow' => 'ADMIN_NO_SRP_AUTH',
'ClientId' => COGNITO_APP_CLIENT_ID,
'UserPoolId' => COGNITO_USER_POOL_ID,
'AuthParameters' => [
'USERNAME' => $request->email,
'PASSWORD' => $request->password,
],
]);
$auth_result = $result->get('AuthenticationResult');
$cognito_access_token = $auth_result['AccessToken'];
if(!empty($cognito_access_token))
{
//register the user
$reg_user = $this->accRepo->register($request);
if($reg_user)
{
Auth::login($reg_user);
$token = $reg_user->createToken($this->tokenTag)->accessToken;
unset($reg_user->password);
return response()->json([ 'success' => true, 'access_token' => $token, 'account' => $reg_user ], SUCCESS_RESPONSE_CODE);
}
}
}
catch(Exception $e)
{
}
我使用确切的代码,设置和凭据作为本地计算机和实时服务器的登台服务器。但它不适用于实时服务器。在其他环境中工作。请问,可能是什么错误?我正在Heroku上部署它。
答案 0 :(得分:1)
我不熟悉Cognito,但您看到的错误是您的代码正在尝试访问EC2中提供的Instance Metadata。 AWS PHP SDK具有特定的顺序,用于尝试查找凭据。 Here is an outline of different credential methods使用PHP SDK。
因此,我怀疑它适用于您的本地计算机,因为您使用AWS CLI aws configure
命令配置了IAM配置文件。
它很可能适用于您的登台服务器,因为该服务器有一个IAM Role连接到EC2实例。 PHP没有找到本地配置的IAM配置文件,因此它跳过尝试访问EC2元数据,它成功完成,因此它经过身份验证。
现在,当您部署到Heroku时,它不再位于EC2实例上,也不再位于您的本地环境中。因此,您的CredentialProvider失败。我的建议是在Heroku中使用Config Vars,然后将代码更改为使用CredentialProvider::env()
as outlined here。您需要创建一个与您的EC2实例具有相同角色的IAM用户(或足够的权限来执行您需要执行的操作)。这将允许您的应用程序从AWS外部的环境安全地访问Cognito。