Java Azure 请求签名

2024-03-31

我正在使用最新的 Azure SDK 存储模拟器。我正在尝试向我的 blob 签署请求。当我运行下面的代码时,我收到身份验证错误。

尽管我多次检查代码是否符合 Azure SDK blob 访问规范,但我无法弄清楚出了什么问题。

这是控制台输出:

GET



x-ms-date:Sun, 23 Sep 2012 04:04:07 GMT
/devstoreaccount1/tweet/?comp=list
SharedKey devstoreaccount1:Hx3Pm9knGwCb4Hs9ftBX/+QlX0kCGGlUOX5g6JHZ9Kw=
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

这是代码:

public static void signRequest(HttpURLConnection request, String account, String key) throws Exception
{
    SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
    fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
    String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";

    StringBuilder sb = new StringBuilder();
    sb.append("GET\n"); // method
    sb.append('\n'); // md5 (optional)
    sb.append('\n'); // content type
    sb.append('\n'); // legacy date
    sb.append("x-ms-date:" + date + '\n'); // headers
    sb.append(request.getURL().getPath() + "/tweet/?comp=list"); // resource TODO: "?comp=..." if present

    System.out.println(sb.toString());
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(new SecretKeySpec(Base64.decode(key), "HmacSHA256"));
    String authKey = new String(Base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
    String auth = "SharedKey " + account + ":" + authKey;
    request.setRequestProperty("x-ms-date", date);
    request.setRequestProperty("Authorization", auth);
    request.setRequestMethod("GET");
    System.out.println(auth);
}



public static void main(String args[]) throws Exception
{
     String account = "devstoreaccount1";
     String key = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==";
     HttpURLConnection connection = (HttpURLConnection) (new URL("http://localhost:10000/devstoreaccount1")).openConnection();
     signRequest(connection, account, key);
     connection.connect();
     System.out.println(connection.getResponseMessage());
 }

经过 Gaurav 和 Smarx 的反馈,这里是代码,我仍然得到同样的错误。你能给我看一些代码吗?否则很难理解。

    public static void sign(HttpURLConnection request, String account, String key, String url) throws Exception
    {
        SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
        fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";

        StringBuilder sb = new StringBuilder();
        sb.append("GET\n"); // method
        sb.append('\n'); // md5 (optional)
        sb.append('\n'); // content type
        sb.append('\n'); // legacy date
        sb.append("x-ms-date:" + date + '\n'); // headers
        sb.append("x-ms-version:2009-09-19\n"); // headers
        sb.append("/devstoreaccount1/devstoreaccount1/\n$maxresults:1\ncomp:list\nrestype:container"); // resource TODO: "?comp=..." if present

        System.out.println(sb.toString());
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(Base64.decode(key), "HmacSHA256"));
        String authKey = new String(Base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
        String auth = "SharedKeyLite " + account + ":" + authKey;
        request.setRequestProperty("x-ms-date", date);
        request.setRequestProperty("Authorization", auth);
        request.setRequestMethod("GET");
        System.out.println(auth);
    }

    public static void main(String args[]) throws Exception
    {

        String account = "devstoreaccount1";
        String key = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==";
        String url = "http://127.0.0.1:10000/devstoreaccount1/?restype=container&comp=list&$maxresults=1";
        HttpURLConnection connection = (HttpURLConnection) (new URL(url)).openConnection();
        sign(connection, account, key, url);
        connection.connect();
        System.out.println(connection.getResponseMessage());
    }

EDIT高拉夫的答案去哪儿了? :-) 我相信他已经回答并提到您似乎正在构建 Shared Key Lite 签名,因此应该在您的授权标头中使用“SharedKeyLite”。


我认为高拉夫的回答是正确的,但我注意到其他三个问题:

  1. 您似乎正在拨打电话http://localhost/devstoreaccount1,但是你正在计算签名http://localhost/devstoreaccount1/tweet/?comp=list。确保 URL 匹配。
  2. 对于存储模拟器,我认为您的规范化资源实际上应该是/devstoreaccount1/devstoreaccount1/tweet/?comp=list。 (注意帐户名的重复。)一般应该是/<account>/<path>,对于存储模拟器,帐户名称显示在路径中。
  3. 在哪儿x-ms-version标题?我believe这是必需的。

UPDATE下面是一些具有两种方法的工作代码,一种使用共享密钥,另一种使用共享密钥 Lite。希望这能澄清事情。请注意,要使用存储模拟器,您需要将 URL 切换回localhost:10000/devstoreaccount1。签名代码应该仍然适用于模拟器,但我还没有测试过。 Base64 库来自这里:http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html.

import java.net.*;
import java.util.*;
import java.text.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import org.apache.commons.codec.binary.Base64;

public class Test
{
    private static Base64 base64 = new Base64();

    public static void signRequestSK(HttpURLConnection request, String account, String key) throws Exception
    {
        SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
        fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";

        StringBuilder sb = new StringBuilder();
        sb.append("GET\n"); // method
        sb.append('\n'); // content encoding
        sb.append('\n'); // content language
        sb.append('\n'); // content length
        sb.append('\n'); // md5 (optional)
        sb.append('\n'); // content type
        sb.append('\n'); // legacy date
        sb.append('\n'); // if-modified-since
        sb.append('\n'); // if-match
        sb.append('\n'); // if-none-match
        sb.append('\n'); // if-unmodified-since
        sb.append('\n'); // range
        sb.append("x-ms-date:" + date + '\n'); // headers
        sb.append("x-ms-version:2009-09-19\n");
        sb.append("/" + account + request.getURL().getPath() + "\ncomp:list");

        //System.out.println(sb.toString());
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(base64.decode(key), "HmacSHA256"));
        String authKey = new String(base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
        String auth = "SharedKey " + account + ":" + authKey;
        request.setRequestProperty("x-ms-date", date);
        request.setRequestProperty("x-ms-version", "2009-09-19");
        request.setRequestProperty("Authorization", auth);
        request.setRequestMethod("GET");
        System.out.println(auth);
    }

    public static void signRequestSKL(HttpURLConnection request, String account, String key) throws Exception
    {
        SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
        fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";

        StringBuilder sb = new StringBuilder();
        sb.append("GET\n"); // method
        sb.append('\n'); // md5 (optional)
        sb.append('\n'); // content type
        sb.append('\n'); // legacy date
        sb.append("x-ms-date:" + date + '\n'); // headers
        sb.append("x-ms-version:2009-09-19\n");
        sb.append("/" + account + request.getURL().getPath() + "?comp=list");

        //System.out.println(sb.toString());
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(base64.decode(key), "HmacSHA256"));
        String authKey = new String(base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
        String auth = "SharedKeyLite " + account + ":" + authKey;
        request.setRequestProperty("x-ms-date", date);
        request.setRequestProperty("x-ms-version", "2009-09-19");
        request.setRequestProperty("Authorization", auth);
        request.setRequestMethod("GET");
        System.out.println(auth);
    }



    public static void main(String args[]) throws Exception
    {
        String account = args[0];
        String key = args[1];
        HttpURLConnection connection = (HttpURLConnection) (new URL("http://" + account + ".blob.core.windows.net/?comp=list")).openConnection();
        signRequestSKL(connection, account, key);
        connection.connect();
        System.out.println(connection.getResponseMessage());

        connection = (HttpURLConnection) (new URL("http://" + account + ".blob.core.windows.net/?comp=list")).openConnection();
        signRequestSK(connection, account, key);
        connection.connect();
        System.out.println(connection.getResponseMessage());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Azure 请求签名 的相关文章

  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Windows Azure:尝试创建凭据时出现身份验证错误

    底部更新 我第一次尝试将测试应用程序上传到 Windows Azure 但在创建凭据时遇到问题 这些是我正在遵循的步骤 我在 Visual Studio 中创建凭据和证书 并将证书上传到 Azure 如下所示 在服务器资源管理器中右键单击
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 如何将翻滚窗口参数传递到数据工厂 UI 中的数据工厂管道?

    我已经定义了一个管道Azure Data Factory使用翻滚窗口触发器 如下所示 我希望我的活动能够接收翻滚窗口参数 trigger outputs windowStartTime and trigger outputs windowE
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐

  • 匹配平衡括号的正则表达式

    我需要一个正则表达式来选择两个外括号之间的所有文本 Example START TEXT text here possible text text possible text more text END TXT Result text he
  • 如何构建一个在用作 constexpr(如断言)时行为不同的自定义宏?

    从 C 14 开始 断言宏可以在函数中使用 即使它们被定义为 constexpr 我知道这与它的计算结果为 true 有关 但我无法弄清楚实际的代码是什么样子 具体来说 如何构建一个宏 该宏在运行时评估的 constexpr 函数中运行时打
  • PL/SQL 逗号分隔列表;删除重复项并放入数组中

    我有一个以逗号分隔的列表作为 PL SQL 过程中的字符串 我需要 删除重复项 将列表放入数组中 我发现了多种方法可以做到其中之一 但不能同时做到两者 有什么帮助吗 有一个众所周知的 SQL 技巧可以将逗号分隔的列表转换为行 只需使用这个技
  • 限制 .map 循环中的项目

    我想问一下如何限制我的 map例如 仅循环到 5 个项目 因为当前当我访问 api 时 它返回 20 个项目 但我只想显示 5 个 我发现大多数情况只是循环整个对象数组 而不是将其限制为多个项目 注意 我无法控制 API 因为我只是使用 m
  • libtool:i686-pc-mingw32 共享中不允许未定义的符号

    我正在使用自动工具作为我的库的构建系统 最近库被移植到Windows 尽管我遇到了一个奇怪的错误 但库编译和链接成功 配置和make后只有静态库 除了警告之外 一切看起来都很好libtool libtool undefined symbol
  • 在 C# 中,有没有办法在运行时确定类的成员?

    假设我有一个名为 foo 的类 它有 3 个公共成员 foo1 foo2 和 foo3 现在假设我正在编写一个函数 它将 foo 类的实例作为参数 但是当我编写这个函数时 我不知道它有哪些公共成员 有没有办法让我在运行时确定它具有公共成员
  • React.js 通过 Router 传递参数,而不是在 URL 中

    您好 我想从一个页面移动到另一页面并传递参数search and type 如果 URL 中没有这些参数 我可以使用 React Router 来实现此目的吗 我正在看这个https github com rackt react route
  • 如何更改应用栏颤动上的文本和图标的颜色

    我在更改颤动应用栏上的文本和图标小部件的颜色时遇到问题 我已经在材料应用程序中尝试过主题 但它不起作用 这是在哪里工作 title Text Profile style TextStyle color Colors black 但我想将其应
  • 在窗口中的标题栏内/上方添加用户控件

    在 WPF 中 我想在窗口的标题栏中 上方添加一个 userControl 如下所示 红色部分是UserControl 绿色部分是标题栏 现在我希望能得到你的一些建议 需要扩展Window类或者只是自定义Window的样式 最好提供源码 您
  • MVC 2 AntiForgeryToken - 为什么对称加密 + IPrinciple?

    我们最近将解决方案更新为 MVC 2 这更新了AntiForgeryToken作品 不幸的是 这不再适合我们的 AJAX 框架 问题是 MVC 2 现在使用对称加密来编码有关用户的一些属性 包括用户的Name财产 来自IPrincipal
  • 我如何消除 glu.h 中的这些编译器错误?

    尝试使用这个tutorial http www opengl tutorial org beginners tutorials 在带有 netbeans 和 cygwin 4 8 1 的 64 位 Windows 8 上 我收到很多这样的错
  • 如何解决 xcode 5 中的苹果 LLVM 5.0 错误?

    我在模拟器和设备上运行我的应用程序没有任何问题 突然我收到这个错误 fatal error file Applications Xcode app Contents Developer Platforms iPhoneOS platform
  • SVN加密密码存储

    我在 Ubuntu 机器上安装了 SVN 但我无法理解某些事情 每当我从终端检查某些内容时 我都会收到有关保存未加密密码的错误 ATTENTION Your password for authentication realm lt gt S
  • 在 macOS 上的 CLion 中导入 Bazel 项目失败

    我在 CLion 上安装了 Bazel 插件 并尝试导入新的 Bazel C 项目 但我不断遇到这些错误 tensorflow gpu 1 8 0lft1 cp27 cp27mu linux x86 64 whl 在此平台上不受支持的轮子
  • Selenium 预期条件 - 可以使用“或”吗?

    我将 Selenium 2 WebDriver 与 Python API 一起使用 如下所示 from selenium webdriver support import expected conditions as EC code tha
  • 波斯语 @font-face 在 Chrome 中不起作用,是否有 Bug?

    不确定我的标题是 Chrome 中的错误还是我的 CSS 有问题 这是我正在谈论的内容的演示 演示链接 http 3p3r com farakhan 问题是我在我的网站中使用自定义波斯语字体 名为BMitra 它在公共领域是完全免费的 并且
  • 片段在从其他片段返回时重新创建

    我在片段方面面临问题 在我的场景中 有两个 Fragment 与 FragmentActivity 关联 在FragmentActivity中 有一个容器布局 Frame Layout 其中所有的fragment都会被替换 public v
  • OWIN OAuth 2.0 - 不记名令牌永不过期

    我正在使用以下 OAuth 提供程序和选项 UserManagerFactory gt new UserManager
  • “语句在命名空间中无效”错误消息

    我有一个问题 出于某种原因 视觉工作室说有一个错误 它显示 语句在命名空间中无效 我不知道如何解决它 这就是我的编码的样子 前两行有一条蓝色波浪线 以 Private Sub 开头 Private Sub btnPlay Click ByV
  • Java Azure 请求签名

    我正在使用最新的 Azure SDK 存储模拟器 我正在尝试向我的 blob 签署请求 当我运行下面的代码时 我收到身份验证错误 尽管我多次检查代码是否符合 Azure SDK blob 访问规范 但我无法弄清楚出了什么问题 这是控制台输出