我在尝试验证用于 Web 服务登录的一对 token /符号时遇到问题。
WS 作为soap-wsdl 1.1 公开,但客户端需要通过react-native 应用程序使用它。经过几个小时的研究,我们(客户和我)最终得出的结论是,发布一个使用 wsdl 并将其公开为 Rest api 的 Rest 代理会更快。
WS 仅用于身份验证,包含两种方法:
+login(String: username, String: password): LoginResponse(String token, Base64Binary sign);
+verifyToken(String: token, Base64Binary: sign): Boolean;
用于 token 和签名验证的 wsdl 参数
<xs:sequence>
<xs:element minOccurs="0" name="token" type="xs:string"/>
<xs:element minOccurs="0" name="firma" type="xs:base64Binary"/>
</xs:sequence>
LoginResponse通过json发送,结构如下:
public class LoginResponse {
private byte[] firma;
private String token;
}
然后由 verifyToken 作为字符串接收:
@GET
@Path("/validarToken")
@Produces(MediaType.APPLICATION_JSON)
public Response verifyToken(@QueryParam("token") String token,
@QueryParam("sign") String sign) {
}
然后,使用sign.getBytes()转换符号;
我注意到,当我调试由login()返回的byteArray时,该数组包含负数,但是当verifyToken接收并转换为字节时,没有表示负值(结果数组不相同) )。
尽管如此,如果我在使用 LoginResponse 登录后直接调用 verifyToken,它会正确验证,因此 verifyToken 方法可以正常工作。
谢谢。
最佳答案
由于我无法使用 Base64 到字符串转换来解决问题,因此我执行了以下操作:
- 将 Base64 字节数组转换为十六进制字符串 -verifyToken 现在接受十六进制字符串作为符号。 -将十六进制字符串符号转换回字节数组。
十六进制转换由: https://stackoverflow.com/a/5942951/2350854 提供。
关于Java RestEasy : Base64 encoded sign over REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41508502/