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

jas*_*son 14 android amazon-web-services aws-api-gateway

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

错误:

 {"message":"The security token included in the request is invalid."}
Run Code Online (Sandbox Code Playgroud)

代码:

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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

her*_*tik 8

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

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

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

ApiClientFactory factory = new ApiClientFactory()
  .credentialsProvider(credentials);
Run Code Online (Sandbox Code Playgroud)

但...

您永远不应在已发布的应用程序中发送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是一个很大的话题.希望所提供的说明是文档相关部分的重要切入点.