Java Webservice 客户端 UsernameToken 相当于 PHP

2023-11-25

我有一个 PHP 构建的 Web 服务,它使用 UsernameToken 作为身份验证机制。我有可以访问此 Web 服务的 PHP 客户端代码。现在我需要在 Java 中执行此操作。也许你可以帮助我!

可以使用以下 php 代码访问该服务:

$password="super_secure_pass";
$timestamp=gmdate('Y-m-d\TH:i:s\Z');
$nonce=mt_rand();
$passdigest=base64_encode(pack('H*',sha1(pack('H*',$nonce).pack('a*',$timestamp).pack('a*',$password))));
$nonce=base64_encode(pack('H*',$nonce))

这些值被解析到此 Soap 标头中。

<wsse:Security SOAP-ENV:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
    <wsse:Username>'.$username.'</wsse:Username>
    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">'.$passdigest.'</wsse:Password>
    <wsse:Nonce>'.$nonce.'</wsse:Nonce>
    <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'.$timestamp.'</wsu:Created>
   </wsse:UsernameToken>
</wsse:Security>

使用此代码我可以毫无问题地访问网络服务。 现在我需要在 Java 中执行此操作。

我已经创建了必要的文件,实现了一个处理程序来添加带有 UsernameToken 的肥皂头。 但是当我尝试访问 WS 时,我总是收到“未授权”错误。 我认为我在创建 passdigest 或 nonce 条目时遗漏了一些东西。

以下是我计算它们的方法:

    Random generator = new Random();
    String nonceString = String.valueOf(generator.nextInt(999999999));
    String createTime=localToGmtTimestamp();//Returns a date with format (SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"))
    String pass="super_secure_pass";
    String tmp = AeSimpleSHA1.SHA1(nonce + createTime + pass);
    encodedPass = Base64.encodeBytes(tmp.getBytes()); 

创建肥皂头时将使用这些值:

    SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
    SOAPHeader header = envelope.addHeader();
    SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
    SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
    SOAPElement username = usernameToken.addChildElement("Username", "wsse");
    username.addTextNode(user);

    SOAPElement password = usernameToken.addChildElement("Password", "wsse");
    password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
    password.addTextNode(encodedPass);

    SOAPElement nonce =
        usernameToken.addChildElement("Nonce", "wsse");
    nonce.addTextNode(Base64.encodeBytes(nonceString.getBytes()));

    SOAPElement created = usernameToken.addChildElement("Created", "wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

    created.addTextNode(creatTime);

生成的肥皂头如下所示:

    <S:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken>
            <wsse:Username>myusername</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">ZDM4MjkwNzNlNTc3MjNmMTY4MjgyYWQ1ZjllN2JlZmJmNGY2NDE4MA==</wsse:Password>
            <wsse:Nonce>NTU5NzA2Mjkw</wsse:Nonce>
            <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2011-07-24T11:41:55Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</S:Header>

有人看到我做错了什么吗?


我找到了解决方案。我的问题是我忘记将十六进制编码添加到 NONCE 值和连接的字符串中。 这是我的解决方案,也许有人需要这个。

创建通行证等的功能:

private String calculatePasswordDigest(String nonce, String created, String password) {
        String encoded = null;
        try {
            String pass = hexEncode(nonce) + created + password;
            MessageDigest md = MessageDigest.getInstance( "SHA1" );
            md.update( pass.getBytes() );
            byte[] encodedPassword = md.digest();
            encoded = Base64.encodeBytes(encodedPassword);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(HeaderHandler.class.getName()).log(Level.SEVERE, null, ex);
        }

        return encoded;
    }

    private String hexEncode(String in) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < (in.length() - 2) + 1; i = i + 2) {
            int c = Integer.parseInt(in.substring(i, i + 2), 16);
            char chr = (char) c;
            sb.append(chr);
        }
        return sb.toString();
    }

构建肥皂消息的代码:

String timestamp = HeaderHandler.localToGmtTimestamp();
String pass = "password";
String user = "username";
String nonceString = getNonce();


String dig=calculatePasswordDigest(nonceString, timestamp, pass);


SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();

SOAPElement security =
header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");


SOAPElement usernameToken =
security.addChildElement("UsernameToken", "wsse");


SOAPElement username =
usernameToken.addChildElement("Username", "wsse");
username.addTextNode(user);

SOAPElement password =
usernameToken.addChildElement("Password", "wsse");
password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
password.addTextNode(dig);

SOAPElement nonce =
usernameToken.addChildElement("Nonce", "wsse");
nonce.addTextNode(Base64.encodeBytes(hexEncode(nonceString).getBytes()));

SOAPElement created = usernameToken.addChildElement("Created", "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
created.addTextNode(timestamp);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Webservice 客户端 UsernameToken 相当于 PHP 的相关文章

  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • if/else 简写来定义变量

    我很难理解 if else 的 php 简写是如何描述的here https stackoverflow com questions 20233207 php if shorthand and echo in one line possib
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • 更改 Woocommerce 中“我的帐户”页面上的标题

    我见过大量有关如何使用 WooCommerce 我的帐户仪表板重新排序 更改导航和页面的示例 但我一生都无法弄清楚如何更改每个部分的主要标题 我的帐户 订单 下载 地址等 我已经搜索过模板 但没有任何乐趣 我尝试使用条件 php 注释来回显
  • 正则表达式上的换行符

    我试图替换两个标签之间的所有内容 但我无法构建正确的表达式 这就是我所做的
  • WCF服务健康状况监控

    我刚刚实现了 WCF 服务 目前正在研究服务监控选项 我们的服务器团队目前仅托管 java 服务 希望我们的实例始终运行 因此它可以在该实例的生命周期内收集数据 他们表示将使用我们的 webmon 操作之一来获取统计信息 但我们正在使用每次
  • php源代码到PO文件生成器

    我必须将我的所有回显 打印字符串转换为PHP源代码代码文件到PO file 为了语言翻译 有批次吗对流器可用于相同的 我如何做到这一点 make gettext在您的服务器上运行 setup a 翻译适配器 例如带有 gettext 适配器
  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 如何隐藏 URL 中的锚标记

    如何隐藏地址栏中以下链接 href 的哈希值 a href index php dev name 所以它会将我重定向到index php dev name 但我希望地址栏只显示index php 您可以使用 Javascript oncli
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 使用 PHP Selenium Webdriver 单击下拉菜单中的选项?

    我正在使用 PHP Selenium Webdriver 包装器Facebook https github com facebook php webdriver 任何人都可以给我一个如何单击或从选择下拉菜单中选择选项的示例吗 我已经尝试过这
  • 在 PHP 中比较两个对象的最快方法是什么?

    假设我有一个对象 在本例中为 User 对象 并且我希望能够使用单独的类来跟踪更改 用户对象不必以任何方式改变它的行为才能发生这种情况 因此 我的单独的类创建它的 干净 副本 将其存储在本地某个位置 然后可以将 User 对象与原始版本进行
  • ASMX Web 服务 - 返回带有属性的用户定义的类

    嘿 我正在尝试从 Web 方法返回用户定义的类 该类具有属性和 或方法 给出以下网络方法 WebMethod public List
  • WordPress 自定义帖子类型未显示在搜索结果中

    我在 WordPress 中遇到自定义帖子类型 测验 和搜索的问题 自定义帖子类型未显示在我的搜索结果页面中 我的搜索结果中仅显示默认的帖子内容 以下是我使用的代码 函数 php函数create posttype register post
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • 如何使用 php 在 sql 查询中转义引号?

    我有一个疑问 sql SELECT CustomerID FROM tblCustomer WHERE EmailAddress addslashes POST username AND Password addslashes POST p
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • 如何清除 APC 缓存而不使 Apache 崩溃?

    如果 APC 存储大量条目 清除它们会导致 httpd 崩溃 如果 apc clear cache user 花费的时间超过 phps max execution time 调用 apc clear cache 的脚本 将在之前被 php
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行

随机推荐

  • pandas DataFrame to_html 中的粗体列

    我试图用一个粗体列返回 df to html 我只尝试过 df pd DataFrame important column 1 2 3 4 dummy column 5 6 7 8 def some function df apply la
  • 将项目添加到任务栏应用程序菜单

    我有一个申请 我想通过 C 将我的特定项目添加到右键单击应用程序的任务栏菜单中 我想添加永久项目和临时项目 如果我没有让你明白 这就是我正在谈论的菜单 此功能称为 JumpList 适用于 Windows 7 它是 Microsoft AP
  • Android Studio - 如何使用 ARM 而不是 HAXM 制作 AVD?

    我是 Android Studio 的新手 我的计算机不支持 HAXM 因此不允许我安装它来用于虚拟化 在该网站上的一些类似问题中 人们提到使用 ARM 而不是 HAXM 设置虚拟设备 我怎样才能做到这一点 在 AVD 管理器中 所有预制硬
  • TListView:如果添加列,VCL 会丢失列的顺序

    我正在尝试在 TListView 中的现有列之间添加一列 因此 我在末尾添加新列 并通过将其索引设置为指定值来移动它 这是有效的 直到添加另一个新列 我做了什么 在最后一个位置添加列 Columns Add 并在最后一个位置添加子项 Sub
  • android - 我如何使用“android:layoutDirection”?

    看来android 4提供了 机器人 布局方向 对于线性布局和 机器人 文本方向 对于 textView 但是当我选择它们时 我收到一个编译错误 它无法识别它们 error No resource identifier found for
  • 为什么当我按 Enter 键时,

    我只是添加一个click我的事件处理程序
  • 如何获取字符串 C# 中某个索引之后的所有内容

    假设我有字符串 MyNamespace SubNameSpace MyClassName 如何提取最后一个句点 MyClassName 之后的所有内容 Use 字符串 子字符串 and String LastIndexOf方法 string
  • Switch 语句和数字范围

    如何在 as3 中编写 switch 语句以使 case 适用于整个数字范围 if mcPaddle visible true switch score case 10 10 to 100 myColor color 0x111111 br
  • 使用 React Native Google Maps Directions 包自动启动导航

    我有一个要求 在加载谷歌地图应用程序时 必须自动启动导航 当前场景 它显示路线 但用户必须单击start开始导航 我找不到与之相关的任何标志 找到这篇文章 其中显示了谷歌地图中使用的标志 谷歌地图官方文档显示将其用作dir action n
  • 如何删除R中的空列?

    我有一个 CSV 文件 Identity Number Data Result Add 1 4 55 92 62 3 7 43 12 74 7 3 58 52 64 0 6 10 22 96 3 8 13 92 22 如何删除R中的空列 所
  • 修补 Magento 1.7.1 Hunk #1 时出错

    我看到最后一个Critical Reminder我的 Magento 仪表板 v 1 7 0 2 中的通知 2 important security patches SUPEE 5344 and SUPEE 1533 因此 我在其他 Mag
  • 错误 ::0 找不到引用的切入点注释

    我正在尝试创建一个方面来监视某些方法的时间执行 当我尝试运行测试时 出现以下错误 Caused by java lang IllegalArgumentException error at 0 can t find referenced p
  • 选择不同的 mongodb C#

    我必须从简单的 mongo db 数据库中选择不同的记录 我有很多简单的记录 这些记录如下所示 word some text 我的代码很简单 const string connectionString mongodb localhost v
  • Java 8 - 如何访问封装为 lambda 的对象和方法

    在 Java 中 您可以 捕获 对象上的方法调用 作为 Runnable 如下例所示 稍后 访问 Runnable 的这个实例 是否可以实际访问 捕获的 对象和被调用方法的方法参数 如果可能 这可能需要通过反射来完成 例如 class So
  • 是否存在具有编程语言本地化版本的编译器?

    我经常想知道为什么非英语程序员在编程时被迫使用不同的语言 而提供一个可以用本地化版本替换关键字的 IDE 似乎很容易 为什么德国人不能使用 w hrend macht 循环 日本 德国 法国 西班牙 博茨瓦纳的程序员只是广泛使用宏 定义语句
  • 根据另一个向量对点向量进行排序

    我正在开发一个 C 应用程序 我有 2 个点向量 vector
  • 显示:表格与使用表格

    我想知道使用 CSS 显示属性来模拟一个非常简单的论坛系统的表格是否是一个好主意 我知道这不是一件好事 就像 2 年前那样 当时 IE 和其他浏览器可能不支持 display table table cell 等 但我认为现在所有浏览器都支
  • Keycloak 管理控制台无限期加载

    我有一个在 EKS 集群中运行的 Keycloak 服务器 我尝试将其配置为生产模式而不是开发模式 我已经设法让 SSL 与反向代理一起使用 但是当我进入管理控制台的登录页面时 它只是无限期地加载 这是我的配置 Dockerfile FRO
  • PHP 特征的 UML 表示

    我正在使用 Symfony2 Doctrine 创建项目并尝试实现特征 到目前为止 小型试用没有问题 但我通常在深入复杂项目之前先绘制 UML 类和序列图 据我所知 用于象征 PHP 特征 可以视为行为 的 UML 设计对象是什么 有什么干
  • Java Webservice 客户端 UsernameToken 相当于 PHP

    我有一个 PHP 构建的 Web 服务 它使用 UsernameToken 作为身份验证机制 我有可以访问此 Web 服务的 PHP 客户端代码 现在我需要在 Java 中执行此操作 也许你可以帮助我 可以使用以下 php 代码访问该服务