当前位置: 首页 > 知识库问答 >
问题:

使用AWS签名授权的Android改装请求

戚建白
2023-03-14

下面是生成授权字符串的函数:

public static String gerateOAuthAWS(Context co) throws Exception {
    JodaTimeAndroid.init(co);
    DateTimeFormatter fmt = DateTimeFormat.forPattern("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z").withLocale(Locale.US);
    String ZONE = "GMT";
    DateTime dt = new DateTime();
    DateTime dtLondon = dt.withZone(DateTimeZone.forID(ZONE)).plusHours(1);
    String formattedDate = dtLondon.toString(fmt);
    String oauth = "AWS4-HMAC-SHA256 Credential="+ ACCESS_KEY+"/us-east-1/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature="+
            getSignatureKey(SECRET_KEY,formattedDate,"us-east-1","execute-api");
    return  oauth;
}


static byte[] HmacSHA256(String data, byte[] key) throws Exception {
    String algorithm="HmacSHA256";
    Mac mac = Mac.getInstance(algorithm);
    mac.init(new SecretKeySpec(key, algorithm));
    return mac.doFinal(data.getBytes("UTF8"));
}

static String getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception {
    byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
    byte[] kDate = HmacSHA256(dateStamp, kSecret);
    byte[] kRegion = HmacSHA256(regionName, kDate);
    byte[] kService = HmacSHA256(serviceName, kRegion);
    byte[] kSigning = HmacSHA256("aws4_request", kService);
    return Base64.encodeToString(kSigning,Base64.DEFAULT).replaceAll("\n", "");
}

内容类型为“application/x-www-form-urlencoded”,并生成x-Amz-Date,例如:“201805138T120046Z”

然后通过改装方法将其传递:

@GET("prod/video")
Call<ArrayList<Video>> getAllVideos(@Header("Content-Type")String content_type,
                                    @Header("X-Amz-Date")String amz_date,
                                    @Header("Authorization")String auth);

结果返回null,我确信这个问题与授权有关,因为它以前工作得很好。

谢谢你的帮助:)

共有1个答案

米子轩
2023-03-14

我总是对我的朋友说,如果你觉得很复杂的话,为什么要使用翻新或山谷呢!

相反,您可以使用JSOUP或OKHTTP,这更容易,而且我真的很喜欢JSOUP

您可以连接并向您发送数据的示例

private void fcmIdentity(final String fcmKey) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          SSLHelper.enableSSLSocket();
          Connection.Response response = Jsoup
            .connect(Urls.identity)
            .header("Accept", "application/json")
            .header("KEY_2", "VALUE_2")
            .method(Connection.Method.POST)
            .ignoreContentType(true)
            .ignoreHttpErrors(true)
            .validateTLSCertificates(true)
            .followRedirects(true)
            .data("fcm", "" + fcmKey)
            .data("identity", preferences.getString("FCM_ID", ""))
            .execute();

          Log.i("fcmIdentity", response.statusCode() + "");
          Log.i("fcmIdentity", response.toString());
          Log.d("fcmIdentity", response.headers().toString());
          Log.i("fcmIdentity", response.body());


        } catch (Exception e) {
          e.printStackTrace();
          if (e instanceof IOException) {
            G.toast(getString(R.string.connection_error), true);
          }
        }
      }
    }).start();
  }

关于SSLHelper it帮助连接到HTTPS获取更多信息查看我的主题https://answers.uncox.com/android/question/13003

 类似资料:
  • 我计划使用AWS Appsync迁移lambda函数中的graphQLendpoint,该函数由通过API网关的POST触发。我研究AppSync主要是因为订阅,我无法使用Lambda函数创建订阅。 我的身份验证机制基于Auth0,使用无密码,我的授权机制基于DynamoDB中几个表的数据,并嵌入到graphQL解析器中,这是Facebook和Apollo推荐的。 更重要的是,它基于请求的每一部分

  • 我正在使用改造连接到POST Data中需要授权令牌的服务器。请求示例: 我使用这样的方法,它的作品很好: 我将令牌和其他参数放入RequestBody: 所有这些都工作正常。但是我不知道如何使用文件上传方法: 所以我需要使用来上传文件,但是如何将Multipartbody与包含令牌的Request estbody结合起来?或者如何正确地做到这一点?我很困惑...

  • 编辑:问题是我使用十六进制编码的字符串作为键,我应该使用原始字节。如何从openssl命令中获取原始字节? ---原问题--- 我正在尝试按照以下说明创建签名iam请求:https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html. 它基本上是说要产生签名密钥和签名,您需要遵循以下步骤: 我创建了以下外壳脚

  • 目前在我的团队的web应用程序中,我们在一个名为Auth:“dfdfdf ...”的头中传递访问令牌.我们使用AWS Lambda和令牌授权器来访问我们的API网关资源。 还有一种不同类型的承载令牌头:授权:承载:通过Javascript发送授权令牌承载 区别是专有/命名,还是亚马逊的令牌授权人在功能上与承载令牌模式不同?

  • 技术栈在前端是reactJS,后端由APIGateway和Lambda供电。我正在使用Auth0作为我的react应用程序中的身份服务。通过Auth0提供的一个社交登录进行身份验证时,我会返回、和。此外,我可以使用获取用户信息,例如。现在,我需要保护/阻止对我的后端即APIGateway和lambda的访问。 有很多选项来保护对AWS APIGateway的访问,如IAM授权器、自定义授权器。有一

  • 我想将用户配置文件图片存储在S3桶中,但保留这些图片的私密性。为了做到这一点,我正在创建一个预先签名的网址,每当图像是必需的。然而,这每次都会创建一个独特的网址,这意味着浏览器永远不会缓存图像,最终我会在GET请求中支付更多。 下面是生成url的代码示例,我使用的是Laravel: 我认为,通过指定日期时间而不是时间单位,它将创建相同的url,但实际上会将剩余秒数添加到url,下面是一个示例: x