Google 云存储 - JAVA REST API - 获取签名不匹配

2023-12-01

我正在使用 jersey-client 进行 REST Call 。我收到 SignatureDoesNotMatch 响应错误。 我试图使用 GET Service 列出 Bucket 名称,还尝试使用 GET Bucket 方法列出 Bucket 对象。 这是我的示例代码。

有什么提示或解决方案吗?

public class restSample {

    private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    private static final String PROJECT_ID = "10XXXXXXXX478";

    public static String Base64Encoding()
            throws java.security.SignatureException, UnsupportedEncodingException {

          String access_id = "GOOGBAXXXXXXXXXXBI";
          String secret_key = URLEncoder.encode("pWTXXXXXXXXXXXXXXXRo85T+XXXXXXXXX3O","UTF-8");
          String bucket = "bucket_name";

          String version_header = "x-goog-api-version:1";
          String project_header = "x-goog-project-id:"+PROJECT_ID;
          String canonicalizedResources = "/"+bucket+"/";

          Calendar calendar = Calendar.getInstance();
          calendar.add(Calendar.MINUTE, 30);
          long expiration = calendar.getTimeInMillis();

         String stringToSign = URLEncoder.encode("GET\n\n\n"+expiration+"\n"+version_header+"\n"+project_header+"\n"+canonicalizedResources,"UTF-8");
         //String stringToSign = URLEncoder.encode("GET\n\n\n"+getdate()+"\n"+version_header+"\n"+project_header+"\n"+canonicalizedResources,"UTF-8");
         String authSignature="";
        try {

            SecretKeySpec signingKey = new SecretKeySpec(secret_key.getBytes(),HMAC_SHA1_ALGORITHM);

            Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
            mac.init(signingKey);

            // compute the hmac on input data bytes
            byte[] rawHmac = mac.doFinal(stringToSign.getBytes("UTF-8"));

            // base64-encode the hmac
            authSignature = new String(Base64.encode(rawHmac));

        } catch (Exception e) {
            throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
        }
        authSignature = (access_id +":"+ authSignature);
        return  authSignature;
    }

    public static void main(String[] args) {

        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);

        String authSignature = null;
        try {
            authSignature = "GOOG1 "+ Base64Encoding();
        } catch (SignatureException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        WebResource service = client.resource(getBaseURI());
        ClientResponse response = service.accept(MediaType.APPLICATION_XML)
                .header("Authorization",authSignature)
                .header("Date", getdate())
                .header("Content-Length", "0")
                .header("x-goog-api-version", "1")
                .header("x-goog-project-id", PROJECT_ID)
                .get(ClientResponse.class);

        System.out.println(response.getClientResponseStatus().getFamily());
        System.out.println("response1 :: " + response.getEntity(String.class));

    }

    private static URI getBaseURI() {
        String url = "https://bucket_name.storage.googleapis.com";
        return UriBuilder.fromUri(url).build();
    }
    private static String getdate(){
        SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z ", new Locale("US"));
         Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));

         format.setCalendar(cal);
         return format.format(new Date());
    }
}

Thanks!


确保您正在签名的字符串与预期要签名的字符串匹配。如果身份验证失败,Google 云存储将返回预期的字符串以登录 HTTP 响应。

在您的特定示例中,您似乎正在添加version_header and project_header到要签名的字符串中。这些不在列表中CanonicalHeaders nor CanonicalExtensionHeaders,因此您正在签署与服务器不同的字符串。

您可以在此处查看该列表:https://developers.google.com/storage/docs/reference/v1/developer-guidev1#authentication

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google 云存储 - JAVA REST API - 获取签名不匹配 的相关文章

  • 带进度条的异步 Google 文件上传 WPF

    我正在使用服务帐户上传到 Google Cloud Storage 我需要能够在 WPF UI 中显示上传进度 现在 每当我尝试更新 ProgressBar Value 时 它 都不起作用 但是当我在控制台中写入 bytesSent 时 我
  • 如何让服务帐户只能访问一个存储桶(Google Cloud)?

    如何提供服务帐号只能访问一个桶 如果你以防万一想再给一个第3方服务访问您的private bucket 问题是默认的 服务帐户 可以访问所有存储桶 但我不知道如何将其限制为仅限一个存储桶 是否可以通过仪表板或仅通过控制台来实现此目的 如果可
  • 使用 Google Cloud Platform 部署管理器模板创建存储桶

    我正在尝试使用 GCP Deployment Manager 创建存储桶 我已经完成了快速入门指南并能够创建一个compute v1 instance 但我正在尝试在 Google Cloud Storage 中创建一个存储桶 但无法获得除
  • 更改 Google Cloud Storage 中(现有)对象的存储类别

    我最近了解到 Google 云存储平台 服务宣布了新的存储级别和降价 因此 我想将其中一个存储桶的默认存储类别从持久降低可用性更改为 Coldline 因为这适合我在该存储桶中归档的文件 不过我收到了这张纸条 更改默认存储类别只会影响您以后
  • 根据行内容指定动态生成的表名

    我想设置从 gcs 存储桶中的文件读取数据流管道 然后写入 bigquery 表 需要注意的是 要写入的表应根据从 gcs 文件中读取的行的内容来决定 我的问题是 这可能吗 如果是 有人可以给我任何关于如何实现这一目标的提示吗 此外 必须进
  • 尝试上传到使用多个元数据生成的 GCP 签名网址时收到 403

    我生成了一个 GCP 签名网址 标头中包含两个元数据值 例子 x goog meta reviewer 简 x goog meta author 杰克 当我尝试将文件上传到生成的签名 URL 并在标头中设置元数据时 我收到 403 禁止请求
  • Google 云存储 - 权限不足

    这个问题似乎与另一篇文章相似 但对我来说不同 因为我检查了testIamPermission 回报显示我获得了所需的所有许可并且仍然收到权限不足 这是我收到的 storage buckets get true storage buckets
  • getDownloadUrl 是付费操作吗?

    我想知道是否getDownloadUrl在 Firebase 存储 Google Cloud Storage 上 一种获取存储上文件的公共 URL 的方法 是付费操作 即使读完之后文档 https cloud google com stor
  • 无法推送到 Google 容器注册表(访问被拒绝)

    当我尝试推送容器镜像 https cloud google com container registry docs pushing and pulling到容器注册表 它给了我以下错误 被拒绝 项目 my proj 123 的令牌交换失败
  • 如何使用java上传谷歌云存储中的文件

    我已经尝试使用java在Google云存储中上传文件很长时间了 通过浏览我找到了这段代码 但无法准确理解 任何人都可以定制这个以在 GCS 中上传文件吗 Given InputStream inputStream object data e
  • 请求头字段X-Requested

    我正在尝试访问谷歌云存储上的存储桶中的文件 我已经为存储桶设置了 CORS 配置 但当我通过 https 发出请求时 出现此错误 它适用于通过 http 发出的请求 XMLHttpRequest 无法加载 FILENAME 预检响应中的 A
  • Git 大文件存储与 Google 云存储

    我是该项目的一部分 我们使用 git 存储库托管在谷歌云源代码库 https cloud google com source repositories 现在我们使用谷歌云存储 https cloud google com storage 存
  • 如何在 .net 中为 Google 云存储签名 url

    我想知道如何使用 net中的谷歌云存储类生成signurl 我已经根据要求创建了字符串 GET 1388534400 bucket objectname 但我现在想用 p12 密钥签署这个 url 然后想让它变得 url 友好 该库没有显示
  • 未找到“google\appengine\CreateUploadURLRequest”类

    我正在使用谷歌云CORE PHP使用简单的 HTML 表单上传文件但我被困在CloudStorageTools班级 它会抛出连续的跟随错误 致命错误 类 找不到 google appengine api cloud storage Clou
  • 我可以使用元数据值搜索 Google Cloud Storage Bucket吗?

    我在 Google Cloud Storage Bucket 中大量使用元数据 现在我有一个用例 我需要使用一些元数据字段值来搜索文件 我已经查看了整个文档 https cloud google com storage docs gsuti
  • 使用 Google Speech 时从 Google Cloud Storage 访问音频文件

    我使用下面的这段代码使用 Google Speech 成功解析了包含语音的 wav 文件 并将其转换为文本 但我想访问另一个 wav 文件 该文件已放置在 Google Cloud Storage 公开 上 而不是本地硬盘上 为什么不简单地
  • 找不到模块:无法解析 @google-cloud/storage 上的“fs”

    得到Module not found Can t resolve fs 尝试从 GCP Storage 列出存储桶时出错 import Storage from google cloud storage const googleCloud
  • Google Cloud SDK 中对 google-auth 的依赖错误?

    我正在标准环境应用程序中使用谷歌云存储和谷歌云数据存储API 目前在本地 我尝试运行我的测试 使用 pytest 时有一种非常奇怪的行为 我发现 在测试期间 dev appserver fix sys path命令运行者pytest bed
  • Firebase Cloud Storage - 使用元数据上传 -

    我希望从浏览器上传带有元数据的文件 以便通过云功能正确识别和处理文件 在客户端上 我的上传器代码如下所示 uploadTaskPromise async function file return new Promise resolve re
  • 使用javascript上传到谷歌云存储签名的url

    使用以下代码 我可以上传到谷歌云存储中的公共可写存储桶 allUsers有写权限 但是 如果存储桶不可公开写入 则会收到 401 未经授权的错误 我不希望存储桶可公开写入 var file scope myFile var fileData

随机推荐

  • Do...循环直到具有多个条件

    我有一个简单的问题 我在网上没有找到具体信息 我想表演一个Do Loop Until循环 但我想在末尾插入多个条件 我想要做 Do my code Loop Until Condition 1 And Condition 2 And And
  • 更改 Sweave 中 ggplot2 图的大小,而不使文本/数字过大

    我找到了这个question关于更改 Sweave 中 ggplot2 图的大小 我添加了Sweaveopts width 3 height 3 它确实缩小了绘图的大小 但并没有缩小文本 所以最后 轴上的所有数字都会重叠 有没有办法在 Sw
  • 插入的图像未显示在 Google 电子表格中

    当我尝试使用下面的代码在 Google 电子表格中插入图像时 它的工作正常 var activeSheet SpreadsheetApp getActiveSpreadsheet getActiveSheet var image activ
  • 什么是间接扩展? ${!var*} 是什么意思?

    我正在阅读 Bash 初学者指南 它说 如果第一个字符为PARAMETER是一个感叹号 Bash 使用由其余部分形成的变量值PARAMETER作为变量的名称 然后扩展该变量 并在其余替换中使用该值 而不是PARAMETER本身 这称为间接扩
  • 如何解决android studio中无法找到adb(IllegalArgumentException)的问题? [复制]

    这个问题在这里已经有答案了 从 2 2 更新到 2 3 后 我无法使用 android studio 运行我的项目 当我尝试运行我的项目时 我总是收到 无法找到 adb 之类的错误 给我一个正确的解决方案来解决这个问题 我尝试了很多方法但无
  • 两个接口有相同的方法

    Interface A int Add int a int b Interface B int Add int a int b Class D A B int Add int a int b return a b 代码工作正常并且没有产生任
  • 角度 8 中的延迟加载模块

    我有一个仪表板应用程序 我在其中延迟加载小部件 不绑定到路线 我是通过定义一个对象来做到这一点的 name string loadChildren string 然后在我的app module我会做provideRoutes 这将导致 cl
  • 如何将非常大的 CSV 数据集加载到 d3 中

    正如标题所示 我有一个 CSV 文件 250mb 和 700k 行 我无法将其加载到 d3 中 我尝试按照通常加载 csv 文件的方式加载它 但没有成功 目前 它不会出错 并且我在控制台中得到一个空数据数组 不确定文件是否太大或者我加载不正
  • Django,独特的字段生成

    我有一个促销模型 其中包含促销代码和购买模型类的外键 这是模型 class Promotion models Model purchase models ForeignKey Purchase promotion code models C
  • Python sys.getrefcount() 显示意外的第四个引用

    我正在寻找有关为什么我有意外引用计数的解释 是的 我已经知道了sys getrefcount 将增加预期计数1 这不是下面发生的事情 我期待这个功能test a 以显示3 not 4 第四个参考来自哪里 In 2 import sys In
  • 如何使用 Symfony Forms 将事件侦听器添加到动态添加的字段

    我正在使用事件侦听器来动态修改表单 我想向动态添加的字段添加另一个事件侦听器 我不知道如何实现这一点 public function buildForm FormBuilderInterface builder array options
  • 通过 subprocess.Popen 在 python 中执行 R 脚本

    当我在 R 中执行脚本时 它是 R vanilla args test matrix csv lt hierarchical clustering R gt out txt 在Python中 如果我使用 process subprocess
  • Excel 与 SSAS 的连接 - 传输层遇到错误

    我在 SQL 2012 中有一个 SSAS 多维数据集 可以使用 Windows 用户凭据从 Excel 2010 连接到该数据集 而不会出现问题 但是 每当我重新启动托管多维数据集的服务器并尝试刷新 Excel 中的数据透视表 在客户端计
  • WTForms TextAreaField DataRequired 不会在 Bootstrap 模式中引发验证错误

    我在引导模式中有一个非常小的表单 仅包含两个字段 一个 TextAreaField 和一个 Submit 按钮 我的 TextAreField 是所需数据 最重要的是 该字段使用 CKEditor 类似于 quillsJS 来使文本区域所见
  • 解决来自外部不安全服务器的混合内容警告

    我有一个 https 网站 需要显示其他网站的内容 这些网站本身可能是也可能不是 https 不出所料 我在控制台中收到这样的警告消息 混合内容 页面位于 https www example com 我的服务器 通过 HTTPS 加载 但请
  • 转置查询结果集[重复]

    这个问题在这里已经有答案了 所以我有一个包含球员姓名和技能水平的数据库 它看起来像这样 Id Name Level 1 Peter 24 2 Andy 23 24 John 1 列表中等级最高的第一个玩家是最强的 最后一个是最弱的 我需要将
  • 在 PHP 中将对象属性传递到闭包中

    我试图将对象属性传递到闭包中 位于该对象的方法内 如下所示 class Entity extends ControllerBase private view private events public function print tid
  • ZenTest 自动测试不运行测试

    我有过之前的自动测试问题我通过从 ZenTest 4 1 4 降级到 4 1 3 解决了这个问题 ruby v ruby 1 8 7 2008 08 11 patchlevel 72 universal darwin10 0 rails v
  • 绘制圆的一部分

    对于 iPhone 应用程序 我想画一个圆圈 这只是填充 x 百分比 像这样的事情 我在计算半径 度数或弧度时没有任何问题 这没问题 画圆也已经完成了 但是我如何让iPhone SDK来绘制填充的部分呢 我可以画一个同样大小的矩形 但不能画
  • Google 云存储 - JAVA REST API - 获取签名不匹配

    我正在使用 jersey client 进行 REST Call 我收到 SignatureDoesNotMatch 响应错误 我试图使用 GET Service 列出 Bucket 名称 还尝试使用 GET Bucket 方法列出 Buc