使用 cognito aws-sdk-cpp 对用户进行身份验证
authenticate a user using cognito aws-sdk-cpp
我一直在尝试使用 aws-sdk-cpp 创建用户登录。我基本上希望用户使用我的应用程序注册为用户(这会将他们添加到认知用户池 - 我有这个工作),然后登录。然后,此登录将为他们提供对帐户中特定存储桶的访问权限。我创建了一个策略,应该允许认知用户使用下面的方法访问存储桶。
http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_cognito-bucket.html
我已经在 AWS 控制台中创建了一个用户池和一个联合身份,并在用户池中启用了 cognito 作为身份提供者,所以我认为这方面都是正确的。
我尝试使用 SDK 将此身份验证放在一起,使用身份管理中的集成测试作为起点。
Aws::SDKOptions options;
Aws::InitAPI(options);
{
const Aws::String userPool_id = "eu-west-1_xxxxxxxxx";
const Aws::String client_id = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
const Aws::String region_id = "eu-west-1";
const Aws::String identityPool_id = "eu-west-1:xxxxxxxxxxxxxxxxx";
const Aws::String account_id = "xxxxxxxxxxxx";
Aws::Client::ClientConfiguration clientConfig;
clientConfig.region = region_id;
std::shared_ptr<CustomPersistentCognitoIdentityProvider> persistent_provider = std::make_shared<CustomPersistentCognitoIdentityProvider>();
persistent_provider->SetAccountId(account_id);
persistent_provider->SetIdentityPoolId(identityPool_id);
//Aws::Map<Aws::String, LoginAccessTokens> logins;
//LoginAccessTokens loginAccessTokens;
//loginAccessTokens.accessToken = LOGIN_ID;
//logins[LOGIN_KEY] = loginAccessTokens;
//persistent_provider->SetLogins("cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxxx", client_id);
auto cognito_client = std::make_shared<Aws::CognitoIdentity::CognitoIdentityClient>(clientConfig);
Aws::CognitoIdentity::Model::GetIdRequest id_request;
id_request.SetAccountId(account_id);
id_request.SetIdentityPoolId(identityPool_id);
id_request.AddLogins("cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxx", client_id);
id_request.AddLogins("USERNAME", "tester@xxxxxxxxx");
id_request.AddLogins("PASSWORD", "xxxxxxxxxxxxx");
cognito_client->GetId(id_request);
Aws::Auth::CognitoCachingAuthenticatedCredentialsProvider authenticated_provider(persistent_provider, cognito_client);
Aws::Auth::AWSCredentials credentials = authenticated_provider.GetAWSCredentials();
std::cout << "AccessKeyID : " << credentials.GetAWSAccessKeyId() << std::endl;
std::cout << "SecretKey : " << credentials.GetAWSSecretKey() << std::endl;
Aws::S3::S3Client s3_client(credentials, clientConfig);
S3ListObject(s3_client, "cloudtesting");
// do stuff with the s3 bucket
}
Aws::ShutdownAPI(options);
上面的代码 return 是访问键的空字符串。
在 GetId 调用中添加一些调试 return:
Request error: NotAuthorizedException Invalid login token. Not a valid OpenId Connect identity token.
我显然在这里或在设置中遗漏了一些东西。任何 suggestions/help/code 示例将不胜感激!
为了使用 Cognito 用户池进行身份验证,您必须使用 CognitoIdentityProviderClient(参见 aws/cognito-idp/CognitoIdentityProviderClient.h)。它使用安全远程密码协议 (SRP) 进行身份验证,遗憾的是您必须自己实施。您首先调用 InitiateAuth,然后它回复一些您必须用 RespondToAuthChallenge 响应的信息。
这在Amazon Cognito Identity SDK for JavaScript中实现,您可以作为参考。
我一直在尝试使用 aws-sdk-cpp 创建用户登录。我基本上希望用户使用我的应用程序注册为用户(这会将他们添加到认知用户池 - 我有这个工作),然后登录。然后,此登录将为他们提供对帐户中特定存储桶的访问权限。我创建了一个策略,应该允许认知用户使用下面的方法访问存储桶。
http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_cognito-bucket.html
我已经在 AWS 控制台中创建了一个用户池和一个联合身份,并在用户池中启用了 cognito 作为身份提供者,所以我认为这方面都是正确的。
我尝试使用 SDK 将此身份验证放在一起,使用身份管理中的集成测试作为起点。
Aws::SDKOptions options;
Aws::InitAPI(options);
{
const Aws::String userPool_id = "eu-west-1_xxxxxxxxx";
const Aws::String client_id = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
const Aws::String region_id = "eu-west-1";
const Aws::String identityPool_id = "eu-west-1:xxxxxxxxxxxxxxxxx";
const Aws::String account_id = "xxxxxxxxxxxx";
Aws::Client::ClientConfiguration clientConfig;
clientConfig.region = region_id;
std::shared_ptr<CustomPersistentCognitoIdentityProvider> persistent_provider = std::make_shared<CustomPersistentCognitoIdentityProvider>();
persistent_provider->SetAccountId(account_id);
persistent_provider->SetIdentityPoolId(identityPool_id);
//Aws::Map<Aws::String, LoginAccessTokens> logins;
//LoginAccessTokens loginAccessTokens;
//loginAccessTokens.accessToken = LOGIN_ID;
//logins[LOGIN_KEY] = loginAccessTokens;
//persistent_provider->SetLogins("cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxxx", client_id);
auto cognito_client = std::make_shared<Aws::CognitoIdentity::CognitoIdentityClient>(clientConfig);
Aws::CognitoIdentity::Model::GetIdRequest id_request;
id_request.SetAccountId(account_id);
id_request.SetIdentityPoolId(identityPool_id);
id_request.AddLogins("cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxx", client_id);
id_request.AddLogins("USERNAME", "tester@xxxxxxxxx");
id_request.AddLogins("PASSWORD", "xxxxxxxxxxxxx");
cognito_client->GetId(id_request);
Aws::Auth::CognitoCachingAuthenticatedCredentialsProvider authenticated_provider(persistent_provider, cognito_client);
Aws::Auth::AWSCredentials credentials = authenticated_provider.GetAWSCredentials();
std::cout << "AccessKeyID : " << credentials.GetAWSAccessKeyId() << std::endl;
std::cout << "SecretKey : " << credentials.GetAWSSecretKey() << std::endl;
Aws::S3::S3Client s3_client(credentials, clientConfig);
S3ListObject(s3_client, "cloudtesting");
// do stuff with the s3 bucket
}
Aws::ShutdownAPI(options);
上面的代码 return 是访问键的空字符串。
在 GetId 调用中添加一些调试 return:
Request error: NotAuthorizedException Invalid login token. Not a valid OpenId Connect identity token.
我显然在这里或在设置中遗漏了一些东西。任何 suggestions/help/code 示例将不胜感激!
为了使用 Cognito 用户池进行身份验证,您必须使用 CognitoIdentityProviderClient(参见 aws/cognito-idp/CognitoIdentityProviderClient.h)。它使用安全远程密码协议 (SRP) 进行身份验证,遗憾的是您必须自己实施。您首先调用 InitiateAuth,然后它回复一些您必须用 RespondToAuthChallenge 响应的信息。
这在Amazon Cognito Identity SDK for JavaScript中实现,您可以作为参考。