繁体   English   中英

如何在android中添加aws签名并调用aws api网关

[英]how to add aws signature in android and call aws api gateway

我写了这段代码,但是我收到了一个错误。 我怎么去上班? 但同样的道理也适用于邮递员。

错误:

 {"message":"The security token included in the request is invalid."}

代码:

public class test extends AppCompatActivity {

    private final AWS4Signer signer = new AWS4Signer();
    Request<?> aws;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

         AWSCredentials credentials = new BasicAWSCredentials("AccessKey", "SecretKey");
        aws = generateBasicRequest();
        signer.setServiceName("execute-api");
        signer.sign(aws, credentials);

        new get_aws().execute();

    }

    private Request<?> generateBasicRequest() {
         Request<?> request = new DefaultRequest<Void>("execute-api");
        request.addHeader("Content-type", "application/json");
         String securityToken = "Session Token";

        request.addHeader("X-Amz-Security-Token", securityToken);
        request.addHeader("Host", "********.amazonaws.com");
        request.addHeader("x-amz-archive-description", "test  test");
        request.setResourcePath("/");
        request.setEndpoint(URI.create("https://******.execute-api.****.amazonaws.com/data/all"));
        return request;
    }


    private class get_aws extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            BufferedReader in = null;
            String data = null;

            try {
                HttpClient httpclient = new DefaultHttpClient();

                HttpGet request = new HttpGet();
                request.addHeader("Authorization", aws.getHeaders().get("Authorization"));
                request.addHeader("X-Amz-Date",request_aws.getHeaders().get("X-Amz-Date"));
                request.addHeader("Content-Type","application/x-www-form-urlencoded");

                URI website = new URI("https://********.execute-api.*******.amazonaws.com/data/all");
                request.setURI(website);
                HttpResponse response = httpclient.execute(request);
                in = new BufferedReader(new InputStreamReader(
                        response.getEntity().getContent()));

                String line = in.readLine();
                Log.d("line", line);

            } catch (Exception e) {
                Log.e("log_tag", "Error in http connection " + e.toString());
            }


            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }
}

为了回答您的直接问题,AWS可以为您从API网关生成Java SDK

使用生成的SDK,您可以将AWSCredentialsProvider对象传递到SDK中。

         AWSCredentials credentials = new BasicAWSCredentials("AccessKey", "SecretKey");

ApiClientFactory factory = new ApiClientFactory()
  .credentialsProvider(credentials);

但...

您永远不应在已发布的应用程序中发送IAM访问密钥。 任何通过打开.apk文件安装了您的应用程序的人都可以检索这些凭据。

然后,可以使用这些凭据访问关联的IAM用户在您的帐户中可以访问的任何其他AWS操作。 这意味着任何有权访问应用程序apk的人(即:可以从应用程序商店下载应用程序的任何人)都可以访问您的AWS账户。

根据您要解决的问题,将决定问题的正确解决方案。

我的Lambda需要运行IAM角色

当人们在API网关中看到“使用调用者凭据调用”选项时,使用API​​网关时,这是一个相当常见的错误。

取消选中此框,Lambda将使用您在Lambda中定义的IAM角色运行。

如果执行此操作后请求失败,则需要确保API Gateway具有调用lambda的权限。

无需用户即可将API限制为应用程序本身

您的应用程序无法保密,您没有用户凭据。

您应该完全禁用授权,这实际上是一个公共API。

要求API密钥(和使用计划)对API进行速率限制可能很有用,但请记住,这不是一种安全措施,因为您的应用程序无法保密该密钥。

您希望用户首先登录(没有现有的用户来源)

如果您的API调用仅设计为由注册用户调用,则这是有意义的。

您需要为此配置Cognito用户池。 这不应与Cognito Federated Identities混淆 - 后者侧重于问题的不同部分。 你可以用它来解决这个问题,但要相信我 - 如果你不走这条路,你会更开心。

要破解你需要采取几个步骤:

  1. 创建用户池此处说明详细设置)。

  2. 在API网关上配置Cognito Authorizer

  3. 为您的池创建一个App Client 执行此操作时,请勿生成客户端密钥。

  4. 与您的Android应用程序集成。 AWS提供了一个预构建的Android示例,用于让客户端继续运行: AmazonCognitoYourUserPoolsDemo

您希望用户首先登录(现有用户来源)

如果您可以使用SAML或OAuth2.0 / OpenID Connect对用户进行身份验证,请按照说明进行操作,然后配置联盟

如果没有,这可能是考虑Cognito Federated Identities的时候 ,特别是使用Developer Authenticated Identities流程。 但同样,我真的建议反对它。

API Gateway和Cognito是一个很大的话题。 希望所提供的说明是文档相关部分的重要切入点。

您是否尝试使用认知凭据查看AWS https://github.com/awslabs/aws-sdk-android-samples中的示例,我发现它们更易于使用,如果您想使用AccessKey和SecretKey,也可以使用这样的东西

AWSCredentials credentials = new BasicAWSCredentials("AccessKey", "SecretKey");

AmazonS3Client sS3Client = new AmazonS3Client(credentials,Region.getRegion("Region"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM