- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 PHP 中的私钥创建 JWT token 。为此,我正在使用 OpenSSL 库。在此之前,我将分享我的代码:
PHP
$header = [
self::ALG => self::RS256,
self::TYP => self::JWT
];
$payload = [
"iss" => $this->getClientID(),
"iat" => time(),
"exp" => time()+999
];
$header = base64_encode(json_encode($header));
$payload = base64_encode(json_encode($payload));
$token = $header.".".$payload;
$pkey = openssl_pkey_get_private($this->getPrivateKey(), $this->getPassPhrase());
openssl_sign($token, $signature, $pkey, 'sha256'); //no algorithm specifically for rs256
$sign = base64_encode($signature);
return $token.".".$sign;
因此,此 JWT token 将用于我尝试访问的服务器中的身份验证。但是我从外部服务器得到的响应是 Bad Request
,我的 JWT token 创建过程中出现了问题。
使用相同的凭据,我尝试在 javascript 中使用库 jsrsasign
,然后它给了我正确的响应。
JavaScript
// Header
var oHeader = { alg: 'RS256', typ: 'JWT' };
// Payload
var oPayload = {};
var tNow = rs.KJUR.jws.IntDate.get('now');
var tEnd = tNow + 1000;
oPayload.iss = "playground.pizza";
oPayload.iat = tNow;
oPayload.exp = tEnd;
var sHeader = JSON.stringify(oHeader);
var sPayload = JSON.stringify(oPayload);
var pkey = "my private key" //I replaced all the new line with \n here and had in one line
var prvKey = rs.KEYUTIL.getKey(pkey, "my_pass_phrase");
var sJWT = rs.KJUR.jws.JWS.sign("RS256", sHeader, sPayload, prvKey);
ultraSecureToken = sJWT;
我可以清楚地看到的一个区别是,对于 php 端的 signature generation function
,我将 sha256
作为算法传递,而在 JavaScript RS256 中
已通过。
我了解到 sha256 只是一种哈希算法,而 RS256 用于编码,但在我在 php 中找到的所有库中,它们仅在 openssl_sign< 内部传递
功能。并且 sha256
/openssl_sign
没有将 RS256 作为算法参数。
所以,首先我哪里出错了。
其次,有没有一种方法可以在 php.ini 中使用 RS256 生成签名?
PS:我正在寻找 php 中的解决方案。
最佳答案
KJUR.jws.JWS.sign
的返回值由一个点分隔的三个部分组成。第一部分是 Base64url 编码的 JSON 字符串 sHeader
,第二部分是 Base64url 编码的 JSON 字符串 sPayload
,第三部分是 Base64url 编码的签名。要签名的数据由前两部分组成,包括分隔两部分的点。 RS256意味着 SHA256 和带有 RSASSA-PKCS1-v1_5 填充的 RSA 用于签名。这也可以很容易地在线验证,例如here , 其中 SHA256withRSA
被选为算法。
openssl_sign
还使用带有 RSASSA-PKCS1-v1_5 填充的 RSA,因此使用 SHA256 创建相同签名,假设应用相同的 key 和相同的要签名的数据。
jsrsasign
使用 Base64 url -编码(RFC4648, sect. 5),而 PHP(或更准确地说是 base64_encode
-方法)使用 标准 Base64 编码(RFC4648, sect. 4),这很可能是一个原因的问题。这意味着必须将当前 PHP 代码中的编码更改为 Base64url,例如here .
当然,PHP 代码中的底层 JSON 字符串($header
、$payload
和 $token
)也必须与它们在 JavaScript 代码中的对应部分相同,否则签名将不同。由于 PHP 代码不完整,因此无法检查,这可能是问题的另一个原因。
关于php - 在创建 JWT token 期间了解 RS256 和 SHA256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59173967/
我正在开发一个应用程序,它使用 OAuth - 基于 token 的身份验证。 考虑到我们拥有访问和刷新 token ,这就是流程的样子。 Api call -> intercepter append
如何取消标记此代码的输出? 类(class)核心: def __init__(self, user_input): pos = pop(user_input) subject = ""
当我使用命令 kubectl 时与 --token标记并指定 token ,它仍然使用 kubeconfig 中的管理员凭据文件。 这是我做的: NAMESPACE="default" SERVICE
我正在制作 SPA,并决定使用 JWT 进行身份验证/授权,并且我已经阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本 token 授权的工作
我正在尝试从应用服务获取 Google 的刷新 token ,但无法。 日志说 2016-11-04T00:04:25 PID[500] Verbose Received request: GET h
我正在开发一个项目,只是为了为 java 开发人员测试 eclipse IDE。我是java新手,所以我想知道为什么它不起作用,因为我已经知道该怎么做了。这是代码: public class ecli
我正在尝试使用 JwtSecurityTokenHandler 将 token 字符串转换为 jwt token 。但它出现错误说 IDX12709: CanReadToken() returned
我已阅读文档 Authentication (来自 Facebook 的官方)。我仍然不明白 Facebook 提供的这三种访问 token 之间的区别。网站上给出了一些例子,但我还是不太明白。 每个
我的部署服务器有时有这个问题,这让我抓狂,因为我无法在本地主机中重现,我已经尝试在我的 web.config 中添加机器 key ,但没有成功远。 它只发生在登录页面。 我的布局:
我已经设法获得了一个简单的示例代码,它可以创建一个不记名 token ,还可以通过阅读 stackoverflow 上的其他论坛来通过刷新 token 请求新的不记名 token 。 启动类是这样的
如果我有以前的刷新 token 和使用纯 php 的访问 token ,没有 Google Api 库,是否可以刷新 Google Api token ?我在数据库中存储了许多用户刷新和访问 toke
我通过 Java 应用程序使用 Google 电子表格时遇到了问题。我创建了应用程序,该应用程序运行了 1 年多,没有任何问题,我什至在 Create Spreadsheet using Google
当我有一个有效的刷新 token 时,我正在尝试使用 Keycloak admin REST API 重新创建访问 token 。 我已经通过调用 POST/auth/realms/{realm}/p
我正在尝试让第三方 Java 客户端与我编写的 WCF 服务进行通信。 收到消息时出现如下异常: Cannot find a token authenticator for the 'System.I
在尝试将数据插入到我的 SQl 数据库时,我收到以下错误 System.Data.SqlServerCe.SqlCeException: There was an error parsing the
使用数据库 session token 系统,我可以让用户使用用户名/密码登录,服务器可以生成 token (例如 uuid)并将其存储在数据库中并将该 token 返回给客户端。其上的每个请求都将包
我最近注册了 Microsoft Azure 并设置了认知服务帐户。使用 Text Translation API Documentation 中的说明我能够使用 interactive online
我使用 IAntiforgery API 创建了一个 ASP.Net Core 2 应用程序。 这提供了一种返回 cookie 的方法。 客户端获取该 cookie,并在后续 POST 请求中将该值放
我正在使用 spacy 来匹配某些文本(意大利语)中的特定表达式。我的文本可以多种形式出现,我正在尝试学习编写一般规则的最佳方式。我有如下 4 个案例,我想写一个适用于所有案例的通用模式。像这样的东西
我无法理解 oauth 2.0 token 的原则处理。 我的场景是,我有一个基于 web 的前端后端系统,带有 node.js 和 angular 2。用户应该能够在此站点上上传视频。然后创建一些额
我是一名优秀的程序员,十分优秀!