Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用amazon登录并访问aws资源,如S3、EC2等_Java_Amazon Web Services_Authentication_Amazon Cognito_Login With Amazon - Fatal编程技术网

Java 使用amazon登录并访问aws资源,如S3、EC2等

Java 使用amazon登录并访问aws资源,如S3、EC2等,java,amazon-web-services,authentication,amazon-cognito,login-with-amazon,Java,Amazon Web Services,Authentication,Amazon Cognito,Login With Amazon,我有一个web应用程序,使用户可以轻松地管理AWS资源,就像使用GUI启动Ec2实例一样。不同的用户可以使用此web应用程序。我已经实现了自己的用户管理。可能有些用户不想为我的web应用创建帐户并存储他们的凭据以请求AWS资源。这对他们来说可能不安全。所以,我想使用以下流程构建一个机制 用户使用amazon登录到我的web应用 使用亚马逊登录将为我提供一个访问令牌 使用此令牌获取临时凭据 将这些凭据用于将来对AWs资源的请求 这样,我的web应用中就不会存储永久凭据 我将java用于我的后端服务

我有一个web应用程序,使用户可以轻松地管理AWS资源,就像使用GUI启动Ec2实例一样。不同的用户可以使用此web应用程序。我已经实现了自己的用户管理。可能有些用户不想为我的web应用创建帐户并存储他们的凭据以请求AWS资源。这对他们来说可能不安全。所以,我想使用以下流程构建一个机制

  • 用户使用amazon登录到我的web应用
  • 使用亚马逊登录将为我提供一个访问令牌
  • 使用此令牌获取临时凭据
  • 将这些凭据用于将来对AWs资源的请求
  • 这样,我的web应用中就不会存储永久凭据

    我将java用于我的后端服务。那么,是否有任何AWS APi可以这样做

    我尝试了以下代码:

     val client = new AmazonCognitoIdentityClient(new AnonymousAWSCredentials())
        val idRequest = new GetIdRequest();
       idRequest.setAccountId(account-id);
     idRequest.setIdentityPoolId("us-east-1:xxxx");
       // If you are authenticating your users through an identity provider
        // then you can set the Map of tokens in the request
     val logins = new HashMap[String, String]()
      providerTokens+=("www.amazon.com"->"Atza|IwE-xxxxxxxxxxxxxxxxxxx")
    
      idRequest.setLogins(logins);
    
      val idResp = client.getId(idRequest)
    
     val identityId = idResp.getIdentityId()
    
    
        // Create the request object
        val tokenRequest = new GetOpenIdTokenRequest();
        tokenRequest.setIdentityId("us-east-1:xxxxxx");
    
    //
        val tokenResp = client.getOpenIdToken(tokenRequest);
    //     get the OpenID token from the response
        val openIdToken = tokenResp.getToken()
    
    //     you can now create a set of temporary, limited-privilege credentials to access
    //     your AWS resources through the Security Token Service utilizing the OpenID
    //     token returned by the previous API call. The IAM Role ARN passed to this call
    //     will be applied to the temporary credentials returned
    
    
        val stsClient = new AWSSecurityTokenServiceClient(new AnonymousAWSCredentials());
        val stsReq = new AssumeRoleWithWebIdentityRequest();
        stsReq.setRoleArn("arn:aws:iam::account-id:role/Cognito_Auth_Role");
        stsReq.setWebIdentityToken(openIdToken);
        stsReq.setRoleSessionName("AppTestSession");
        val stsResp = stsClient.assumeRoleWithWebIdentity(stsReq);
        val stsCredentials = stsResp.getCredentials();
    
    我得到以下错误:

    禁止访问标识“us-east-1:XXXXXXXXXXXXXX”。(服务:Amazon认知身份;状态代码:400;错误代码:NotAuthorizedException

    以下是IAM角色中的Cognito_Auth_角色策略:

    {
      "Version": "2012-10-17",
      "Statement":[{
          "Effect":"Allow",
          "Action":"cognito-sync:*",
          "Resource":["arn:aws:cognito-sync:us-east-1:xxxxxxx:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*"]
          }]
      }
    
    以下是此角色的信任关系:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Federated": "cognito-identity.amazonaws.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "cognito-identity.amazonaws.com:aud": "us-east-1:xxxxx"
            },
            "ForAnyValue:StringLike": {
              "cognito-identity.amazonaws.com:amr": "www.amazon.com"
            }
          }
        }
      ]
    }
    
    请告诉我,这里怎么了


    谢谢

    您可以使用AWS Cognito处理大部分管道,或者您可以连接自己的OpenId身份提供商或您订阅的提供商服务

    以下是身份和访问管理(IAM)的文档:

    或者你可以让他们用Cognito为你做一些管道:

    虽然看起来这只适用于移动设备,但他们有在浏览器中使用JavaScript SDK的文档:

    您可以使用AWS Cognito处理大部分管道,也可以连接您自己的OpenId身份提供商或您订阅的提供商服务

    以下是身份和访问管理(IAM)的文档:

    或者你可以让他们用Cognito为你做一些管道:

    虽然看起来这只适用于移动设备,但他们有在浏览器中使用JavaScript SDK的文档:

    我可以使用亚马逊登录并获得访问令牌。现在的问题是如何使用此令牌获取临时凭据以请求访问亚马逊服务。您需要配置AWS标识和访问管理,以便使用亚马逊应用程序ID登录。这是AWS关于示例用例的博客文章。谢谢Yiddishnija!我明白了ing例外情况“访问身份”us-east-1:60904206-xxxxxx被禁止。(服务:AmazonCongnitoIdentity;状态代码:400;错误代码:NotAuthorizedException)。请查看我使用的代码的更新帖子。我可以登录amazon并获得访问令牌。现在的问题是如何使用此令牌获取临时凭据以请求访问amazon服务。您需要配置AWS标识和访问管理无法使用亚马逊应用程序ID登录。这是AWS发布的一篇关于示例用例的博文。感谢Yiddishnija!我遇到异常“访问身份”us-east-1:60904206-xxxxxx是被禁止的。(服务:AmazonCongnitoIdentity;状态代码:400;错误代码:NotAuthorizedException)。请参阅更新的博文了解我使用的代码