尝试验证令牌时遇到问题(在生成令牌之前我向其添加一些数据之前它工作正常)..但现在它似乎不起作用!
这就是我在用户发送 POST 请求(登录)时生成令牌的方式
require('dotenv')
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs')
const Role = require('../models/Role');
const Section = require('../models/Section');
const User = require('../models/User');
// Login !
router.post('/', async (req, res) => {
let sections_fetched = [];
// Validate data
// Check username
const user = await User.findOne({username: req.body.username });
if(!user) return res.status(400).send('Wrong user login credentials !');
// Check password
const is_pass_valid = await bcrypt.compare(req.body.password , user.password);
if (!is_pass_valid) return res.status(400).send('Wrong user login credentials !');
// Get role Object: …Run Code Online (Sandbox Code Playgroud) 我正在从旧的 Google 登录库迁移到新的 Google Identity Services (GIS) 库。这是强制性的,因为从 2023 年 3 月起旧的将不再使用。
\n之前,我做了(为了清晰起见,进行了简化):
\n<script src="https://apis.google.com/js/api:client.js"></script>\ngapi.load();\nvar auth2 = gapi.auth2.init();\nauth2.attachClickHandler();\nonGoogleSignIn(googleUser); // attachClickHandler\'s callback\nvar profile = googleUser.getBasicProfile(); // profile info accessible\nvar authResponse = googleUser.getAuthResponse(); // auth response accessible\nvar accessToken = authResponse.id_token; // get actual access token\nRun Code Online (Sandbox Code Playgroud)\n现在,我正在尝试(为了清楚起见,进行了简化):
\n<script src="https://accounts.google.com/gsi/client"></script>\nvar gisClient = google.accounts.oauth2.initTokenClient();\ngisClient.requestAccessToken();\ncallback(); // initTokenClient\'s callback\nvar accessToken = response.access_token; // get access token in callback\nRun Code Online (Sandbox Code Playgroud)\n使用旧的谷歌登录库,我验证了访问令牌服务器端,如下所示:
\nPayload payload\xc2\xa0=\xc2\xa0await\xc2\xa0GoogleJsonWebSignature.ValidateAsync(accessToken);\nRun Code Online (Sandbox Code Playgroud)\n这还会在有效负载中返回用户的电子邮件和姓名。
\n我从 GIS 获取的访问令牌比从 GAPI 获取的旧访问令牌短得多。
\n我不明白为什么存在JWS不受保护的头文件.
对于某些上下文:JWS未受保护的头包含不受完整性保护的参数,并且只能使用带有JSON序列化的每个签名.
如果它们可以用作顶级标题,我可以看到为什么有人想要包含一个可变参数(这不会改变签名).然而,这种情况并非如此.
任何人都可以想到一个用例或知道为什么它们被包含在规范中?
谢谢!
我阅读了可以在此处找到的 JSON Web 签名规范。该规范为 JSON Web 签名定义了两种序列化表示。一种是 JWS Compact Serialization,另一种是 JWS JSON Serialization 方法。JWS JSON 序列化表示允许一个具有多个签名。使用 JWS JSON 序列化的 JWS 示例是:
{
"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
"signatures": [
{
"protected": "eyJhbGciOiJSUzI1NiJ9",
"header": {
"kid": "2010-12-29"
},
"signature": "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh
-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB
--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO
--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6Lbg
GY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"
},
{
"protected": "eyJhbGciOiJFUzI1NiJ9",
"header": {
"kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"
},
"signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
}
]
}
Run Code Online (Sandbox Code Playgroud)
该规范暗示有时拥有多个签名可能是有益的。但是,我终其一生都想不出您需要拥有多个的原因。
那么,话虽如此,在 JWS 中拥有多个签名的用例是什么?
我正在 Node.JS 中编写后端代码来验证来自 Google SafetyNet API 的 JWS。我很惊讶没有为此找到现成的模块,因此我开始使用可用的库来研究 JWS 的一些简单验证:
首先,谷歌表示需要执行以下步骤:
- 从 JWS 消息中提取 SSL 证书链。
- 验证 SSL 证书链并使用 SSL 主机名匹配来验证叶证书是否已颁发给主机名 attest.android.com。
- 使用证书来验证 JWS 消息的签名。
- 检查 JWS 消息的数据,确保其与原始请求中的数据匹配。特别是,请确保时间戳已经过验证,并且应用程序签名证书的随机数、包名称和哈希值与预期值匹配。
(来自https://developer.android.com/training/safetynet/attestation#verify-attestation-response)
我发现node-jose提供了一个简单的接口来验证JWS,并且它有一个允许嵌入密钥的选项。我试图准确了解此过程的作用以及它是否足以验证 JWS 的真实性?
const {JWS} = require('node-jose');
const result = await JWS.createVerify({allowEmbeddedKey: true}).verify(jws);
if (result.key.kid === 'attest.android.com') {
// Are we good to go or do we manually need to verify the certificate chain further?
}
Run Code Online (Sandbox Code Playgroud)
使用嵌入式密钥是否确实可以x5c使用根 CA 以及针对证书的签名来验证嵌入式证书链?或者我是否需要明确从 Google 获取公钥来单独验证证书?
然后,一个有点相关的问题涉及 Google 用于执行此验证的 API:有一个 …
我对此完全陌生,所以如果这完全是愚蠢的,请忍受我的问题。我正在学习如何使用https://jwt.io验证签名
以下是我在做什么
私钥
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,4A6A48288A531DCA
m2glcvku6rdV8z0QBsBc3Hc72vG4NN3wIPnqdC47FTA3y9WiD7Ukh4m3ZpL2mraz
7PSblIe8ob/aaG9TYViIb4QRYZFg8z3jR6WeNEhC2EbC2CwkSSH3ug8ViQ+1i8d1
kMnQDK1i/s0BZvxlhKPuSy2kOIjelWctkDHvJyvU/WQ=
-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
公钥
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHpqkegB/A/12vqfApHOaFXaJcHkyhNw1u9XnZe2+hiDT698U4c3iet5VyTo3D1DOe7Xi5dG07UorsMvWCmSbvU=
Run Code Online (Sandbox Code Playgroud)
我使用这个网站生成ECDSA-256密钥对,密码为H2
我使用http://jwtbuilder.jamiekurtz.com/生成令牌
我使用私钥对JWT. 以下是令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJIYXJpdCIsImlhdCI6MTU4Nzc1MjM3NCwiZXhwIjoxNjE5Mjg4Mzc0LCJhdWQiOiJodHRwczovL3d3dy5oYXJpdC5kZXYiLCJzdWIiOiJjb250YWN0QGhhcml0LmNvbSIsIkdpdmVuTmFtZSI6Ikhhcml0IiwiU3VybmFtZSI6IkhpbWFuc2h1In0.pmvGfBXH4603YMGYDB6qOXlQjhfdPulvbODrK70ihS0
Run Code Online (Sandbox Code Playgroud)
我去网站https://jwt.io下面是我尝试过的视频
当秘密为空时,JWT 如何验证并将其作为有效签名。我什至还没有提供秘密。
我错过了什么?