jwt 相关问题

JSON Web Token(JWT,发音为“jot”)是一种新兴的基于令牌的身份验证,用于空间受限的环境,例如HTTP授权头。

laravel 8 - auth()->factory() { 相同的刷新() 和 attemp() } 在 JWT AuthController 中未定义

我在 Laravel 8 中使用 JWT 进行 API 身份验证。 当我在控制器中使用 auth()-> 时,对于factory()或attempt()或其他任何东西,Laravel不知道它并说: 未定义的方法“尝试”.intelep...

回答 2 投票 0

Django JWT 已更改但仍然有效

我有一个项目,其中我正在验证由库rest_framework_simplejwt生成的令牌的真实性。在玩令牌时,我将最后一个字符从 8 更改为 9,它......

回答 1 投票 0

JWT 黑名单和会话有什么区别?

实现登录流程并被 JWT 说服,因为我们将扩展作为优先事项。 过去,系统将基于整体应用程序中的会话令牌。 JWT 的意思是我们...

回答 2 投票 0

如何检查passportjs中的token是否过期

我正在使用护照 JwtStrategy 来验证项目中的令牌,但它为每个错误发送相同的错误消息“未经授权” 如果令牌过期,它也会发送“Unautho...

回答 1 投票 0

当我使用@types/jsonwebtoken的sign函数时出现错误

当我使用功能符号时: const 标记 = 等待符号( { userId: user.user_id }, 配置.jwtSecret, { 过期时间: '2d' } ) 因为config.jwtSecret是字符串类型,所以错误是: 阿古姆...

回答 2 投票 0

Spring Jwt 问题认证问题

我目前正在开发学习管理系统 (LMS) 网站的后端,并且遇到 JWT 令牌身份验证问题 使用

回答 1 投票 0

我收到控制台警告“可能未处理的承诺拒绝 TypeError:0,_jwtDecode.default 不是函数(未定义)”

我已经正确安装并导入了jwtDecode,但为什么这里有任何错误是代码:- 我的 jwtDecode 似乎不起作用,我不知道原因,因为我尝试了一些新的东西...

回答 1 投票 0

对于维护模式,使所有现有 Cookie 和访问令牌无效

问题: 有没有办法让我的相当标准的身份验证代码拒绝每个先前授予的身份验证令牌/cookie,并要求所有用户重新登录。由以下任一触发...

回答 1 投票 0

在反应中使用刷新令牌获取新的访问令牌

我的 django 后端带有用户/令牌/刷新的 url 当我在正文中点击刷新令牌时,它发送此令牌的位置 { “访问”:“access_token”, “刷新”:&

回答 1 投票 0

在 mulesoft dwl 中为 RS512 生成 Jwt 令牌

任何人都可以帮助我如何创建基于RS512算法的JWT令牌吗? 我知道如何创建 HS256 算法,但需要知道如何创建 RS512

回答 1 投票 0

Keycloak 不刷新令牌

我正在尝试刷新令牌,但 Keycloak 返回 400 Bad Request 错误并显示以下消息: { “错误”:“无效的授权”, "error_description": "无效

回答 2 投票 0

res.cookie("access", value) Cookie 未存储在浏览器上

在此处输入图像描述我试图将 jwt 令牌作为 Cookie 存储在浏览器中,但它没有将其存储在浏览器中,但在邮递员中它工作正常,在浏览器中我得到 Set-Co...

回答 1 投票 0

无法使用base64 -d正确解码jwt负载

JWT 由三个部分组成,用点分隔: header.payload.signature 我有以下有效负载,我尝试使用 base64 -d 命令在终端中对其进行解码: 有效负载=

回答 1 投票 0

如何将 JSON 中的 JWT 令牌中的声明获取到对象中?

我有一个包含 JWT 令牌的 JSON 对象。我想从令牌中提取声明并将其放入 JSON 对象中,替换令牌。这是我的对象: { “id”:7, ...

回答 2 投票 0

使用Apple登录“invalid_client”错误Asp.Net Core令牌请求

我正在尝试使用 OpenIdConnect 客户端库在我的 Asp.Net Core 应用程序中实现 Sign In With Apple。在本文的帮助下 https://www.scottbrady91.com/openid-connect/implementing-sign...

回答 1 投票 0

当令牌过期或令牌未通过时,收到 404 错误而不是 401

我正在使用 aspnet core WEB Api 应用程序。 登录时,我通过 SignInManager 验证用户,如下所示。 等待 _signInManager.PasswordSignInAsync 之后我生成 jwt 令牌...

回答 1 投票 0

如何解密JWE有alg ECDH-ES+A256KW使用php

我正在使用 php CI 将 singpass v3 更新到 v4。 API getPersonal 返回 jwe 有 alg ECDH-ES+A256KW。我将它的jwe复制到singpass的演示项目(使用js)中,它可以解密。我有相同的加密私有...

回答 1 投票 0

JWT 签名验证失败 .NET 8

我正在尝试使用 JWT Token 与 .NET 8 和 Clean Architecture 来实现身份验证/授权,但我遇到了阻止我进一步工作的问题。我真的很感激任何建议......

回答 1 投票 0

Python[fastapi,frontend] - 如何对前端进行身份验证?

第一次构建前端应用程序, 在后端我运行 fastapi , 我使用 JWT 准备了所有必需的安全功能, 并且正在针对所有现有端点进行测试(网页除外......

回答 1 投票 0

验证keycloak令牌

在 keycloak 上下文中,我使用 Insomnia 获取令牌并向我的 Nestjs 应用程序发送发布请求。我使用这个函数来验证令牌 异步 validateToken(token: string): Promise 在 keycloak 上下文中,我使用 Insomnia 来获取令牌并向我的 Nestjs 应用程序发送发布请求。我使用这个函数来验证令牌 async validateToken(token: string): Promise<boolean> { try { // Make a request to the Keycloak token endpoint to validate the token // Decode the token to extract its claims const decodedToken: CustomJwtPayload = jwtDecode(token); // Validate the token signature (verify it with Keycloak public key) const publicKeyResponse = await axios.get( `${process.env.KEYCLOAK_BASE_URL}/protocol/openid-connect/certs`, ); const publicKey = publicKeyResponse.data.keys[0].x5c[0]; // Verify token issuer if (decodedToken.notes.iss !== `${process.env.KEYCLOAK_BASE_URL}`) { return false; // Invalid issuer } // Check token audience if (decodedToken.aud !== process.env.KEYCLOAK_CLIENT_ID) { return false; // Invalid audience } // Use a library like jsonwebtoken to verify the token signature with the public key try { // Verify the JWT token const decodedToken = jwt.verify( token,publicKey, ); // Optionally, perform additional validation or checks here return true; // Token is valid } catch (error) { console.error('Error validating token:', error); return false; // Token is not valid } // Check token expiry const currentTime = Math.floor(Date.now() / 1000); if (decodedToken.exp && decodedToken.exp < currentTime) { return false; // Token expired } // Token is valid return true; } catch (error) { console.error('Error validating token:', error); return false; } } 但是我遇到了这个错误 Error validating token: JsonWebTokenError: invalid token这还不够冗长,我无法理解它。 有人知道如何通过吗? 令牌验证逻辑说明 解码令牌:JWT 令牌被解码以提取其有效负载,其中包括发行者、受众和到期时间等信息。 验证发行者和受众:代码检查令牌的发行者 (iss) 和授权方 (azp) 是否与预期值匹配,确保它来自受信任的来源并面向正确的受众。 检查过期时间:将令牌的过期时间 (exp) 与当前时间进行比较,以确保其尚未过期。 获取公钥:代码从Keycloak服务器检索公钥,这是下一步所必需的。 签名验证:使用获得的公钥,代码验证令牌的签名,以确保其有效且未被篡改。 此代码可以工作 由 Keycloak 生成的令牌 另存为 docker-compose.yml 更多详细信息请看这里 version: '3.7' services: postgres: image: postgres volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: keycloak POSTGRES_USER: keycloak POSTGRES_PASSWORD: password keycloak: image: quay.io/keycloak/keycloak:legacy # it will be replace latest or 18.0.0 when to move minikube # image: quay.io/keycloak/keycloak:latest environment: DB_VENDOR: POSTGRES DB_ADDR: postgres DB_DATABASE: keycloak DB_USER: keycloak DB_SCHEMA: public DB_PASSWORD: password KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: admin # KC_FEATURES: # scripts ports: - 8080:8080 # Expose to user with localhost:8180 restart: always depends_on: - postgres volumes: postgres_data: # Keycloack volume driver: local Next.js 项目的文件层次结构 your-nextjs-project/ │ ├── pages/ │ ├── api/ │ │ ├── getToken.js # API route for getting the Keycloak token │ │ └── validateToken.js # API route for validating the Keycloak token │ │ │ └── ... # Other pages (e.g., index.js, about.js, etc.) │ ├── components/ │ └── TokenStatus.js # React component to interact with API routes │ ├── node_modules/ # Node modules (not manually edited) │ ├── public/ # Static files like images, fonts, etc. │ ├── .env.local # Environment variables (e.g., Keycloak URL, client ID) │ ├── styles/ # Global styles, CSS modules, etc. │ ├── docker-compose.yml # Keycloak Docker Compose File │ ├── package.json # Project metadata and dependencies │ └── ... # Other configuration files (e.g., next.config.js, .gitignore) 另存为 valideToken.js // pages/api/validateToken.js import axios from 'axios'; import jwt from 'jsonwebtoken'; export default async function handler(req, res) { if (req.method === 'POST') { const { token } = req.body; const keycloakUrl = 'http://localhost:8080/auth'; // Assuming the URL const realm = 'master'; // Assuming the realm is 'master' const clientId = 'admin-cli'; // Assuming the client ID try { const decodedToken = jwt.decode(token, { complete: true }); const publicKeyResponse = await axios.get(`${keycloakUrl}/realms/${realm}/protocol/openid-connect/certs`); const signingKey = publicKeyResponse.data.keys.find(key => key.use === 'sig' && key.alg === 'RS256'); if (!signingKey) { return res.status(400).json({ isValid: false, error: 'Signing key not found' }); } const pemStart = '-----BEGIN CERTIFICATE-----\n'; const pemEnd = '\n-----END CERTIFICATE-----'; const pem = pemStart + signingKey.x5c[0] + pemEnd; if (decodedToken.payload.iss !== `${keycloakUrl}/realms/${realm}`) { return res.status(400).json({ isValid: false, error: 'Invalid issuer' }); } if (decodedToken.payload.azp !== clientId) { return res.status(400).json({ isValid: false, error: 'Invalid audience' }); } const currentTime = Math.floor(Date.now() / 1000); if (decodedToken.payload.exp < currentTime) { return res.status(400).json({ isValid: false, error: 'Token expired' }); } jwt.verify(token, pem, { algorithms: ['RS256'] }); res.status(200).json({ isValid: true }); } catch (error) { console.error('Error validating token:', error); res.status(500).json({ isValid: false, error: 'Error validating token' }); } } else { res.status(405).end(); // Method Not Allowed } } 另存为 getToken.js // pages/api/getToken.js import axios from 'axios'; export default async function handler(req, res) { if (req.method === 'POST') { const { keycloakUrl, clientId, username, password } = req.body; const realm = 'master'; // Assuming the realm is 'master' const tokenEndpoint = `${keycloakUrl}/realms/${realm}/protocol/openid-connect/token`; const params = new URLSearchParams(); params.append('grant_type', 'password'); params.append('client_id', clientId); params.append('username', username); params.append('password', password); try { const response = await axios.post(tokenEndpoint, params); res.status(200).json({ token: response.data.access_token }); } catch (error) { console.error('Error getting Keycloak token:', error); res.status(500).json({ error: 'Error getting Keycloak token' }); } } else { res.status(405).end(); // Method Not Allowed } } TokenStatus.js 组件 // components/TokenStatus.js import React, { useState } from 'react'; import axios from 'axios'; const TokenStatus = () => { const [token, setToken] = useState(''); const [isValid, setIsValid] = useState(false); const getToken = async () => { try { const response = await axios.post('/api/getToken', { keycloakUrl: 'http://localhost:8080/auth', clientId: 'admin-cli', username: 'admin', password: 'admin' }); // Update this line to set only the token string setToken(response.data.token); } catch (error) { console.error('Error fetching token:', error); // Handle error appropriately } }; const validateToken = async () => { const response = await axios.post('/api/validateToken', { token }); setIsValid(response.data.isValid); }; return ( <div> <button onClick={getToken}>Get Token</button> <button onClick={validateToken}>Validate Token</button> {token && <p>Token: {token}</p>} <p>Is Token Valid? {isValid.toString()}</p> </div> ); }; export default TokenStatus; index.js import React from 'react'; import TokenStatus from '../components/TokenStatus'; export default function Home() { return ( <div> <h1>Welcome to the App</h1> <TokenStatus /> </div> ); } 安装依赖项 npm install axios jsonwebtoken 运行它 npm run dev 结果 从Keycloak主令牌获取并验证它 JWKS(JSON Web 密钥集) 检索 JWKS URI:代码访问 JWKS(JSON Web 密钥集)URI,这是身份验证服务器(如 Keycloak)提供的标准 URL,其中包含公钥。 获取公钥:然后向此 URI 发出 HTTP 请求以获取一组公钥,其中一个将用于验证 JWT 令牌的签名。 http://localhost:8080/auth/realms/master/protocol/openid-connect/certs { "keys": [ { "kid": "dWPOjhOlHuiFEFNRS_W3OLQIbW8yQEzOrBQ6nP7HDVU", "kty": "RSA", "alg": "RSA-OAEP", "use": "enc", "n": "oatOSJJWRgOk6JIRfuTJsjEvo0OIdlPz3PSM_XX_8B26kkfmQYwFldFRJv_LnFaDOeXsEXtBZZwNKYCUj4Zhimgi7qflXAjs9RKJBs2as4hXdFBMfjq-DR6Ry2tESvhcyEj2AOiWKgx-yCoPnSzrGbRjhxM1UGbFlyPUijiY4L9LEsLO8cxLv_2X9AbBGKiF9dL03n4jxVBZOm-xEZd-wATg4_LQXqFmh5xPA8Y4yAXef_BzYpsqFlIVVD6ash8jD2zlkT7pe7PpChdR3M-uApD_ykEyg_AmGKK1KRufMBjxfPanpfzaGo4U4wcWSMQEXanVF2lsEVIcxZwxg8gSrw", "e": "AQAB", "x5c": [ "MIICmzCCAYMCBgGNXR5tbTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjQwMTMxMDEyMzExWhcNMzQwMTMxMDEyNDUxWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChq05IklZGA6TokhF+5MmyMS+jQ4h2U/Pc9Iz9df/wHbqSR+ZBjAWV0VEm/8ucVoM55ewRe0FlnA0pgJSPhmGKaCLup+VcCOz1EokGzZqziFd0UEx+Or4NHpHLa0RK+FzISPYA6JYqDH7IKg+dLOsZtGOHEzVQZsWXI9SKOJjgv0sSws7xzEu//Zf0BsEYqIX10vTefiPFUFk6b7ERl37ABODj8tBeoWaHnE8DxjjIBd5/8HNimyoWUhVUPpqyHyMPbOWRPul7s+kKF1Hcz64CkP/KQTKD8CYYorUpG58wGPF89qel/NoajhTjBxZIxARdqdUXaWwRUhzFnDGDyBKvAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIbvAnKG5uV0UgAiwAuzFy4KoVL8eZuIpOYChr9e+xkUadRwNLmyb8ETwoveS6o1n/jws8zgFLo77h3kn77tjrDT/a8HyAP3wCxWwCI7zxf12pB2n2/XOV8HsETJtyXmJvb9wqGHBWHJeb8TagKmyQJrfEPSCWasy139dVCVMGoaHlSvPn3MdHkdVR9wrkxnU7gn3yUJBJiHAbM27OkIWc6jtzoY329bMTKXfxOBXCTq5jWl5pgyOFx2FHAfLZPsKTU56IwRjLBLD2ymX/IsujnyewhqLJFjZno9BYumKfMw3SUBO6SeaCfuuC792OXtX7dMFc93ptEcJEhG6UVWiFQ=" ], "x5t": "T0ziSa1uQRc4r4wcIdi2Z__SnkA", "x5t#S256": "8pOYSFY9w1pbklR6df6XFJbHKUX8ynNQZ7aleQPaTME" }, { "kid": "aoykFfl1fWZk_CHwrXQHuWybqYJSszyukehC11eUuDk", "kty": "RSA", "alg": "RS256", "use": "sig", "n": "v3FaYCa4A_zMlLGhzLkIB0wz1-VcfOq9pGvOU3Q-PAe_ZT4bsmqyaYNTvt5tEQAeyb-1n0t9Td3szFF8iHDXrV4rhD7R5eZI3W30mRx5D5qNzYEx1oiwJdyPZ5liFo1S7JLw1KbPVwwljtCH5xtcx7nSzqi4Ci5qWzP1OON-9WcCUGgOjr4DVCtAEsfrEBbvN_9qE9UFzfajuPQL_sNn53ayL2ntRnA4RNmIi--_XRi7hxAmaF2I3Ts3lkrUdV_Mue8fjG9WrA7lEUoiGZ7GAGUHpvS3R_mSDnbIFj2LEQOAcqmVlj3cmuuOuJ3r3ERrbMhCNPgKOLNCu2drxFXC_w", "e": "AQAB", "x5c": [ "MIICmzCCAYMCBgGNXR5skzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjQwMTMxMDEyMzExWhcNMzQwMTMxMDEyNDUxWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/cVpgJrgD/MyUsaHMuQgHTDPX5Vx86r2ka85TdD48B79lPhuyarJpg1O+3m0RAB7Jv7WfS31N3ezMUXyIcNetXiuEPtHl5kjdbfSZHHkPmo3NgTHWiLAl3I9nmWIWjVLskvDUps9XDCWO0IfnG1zHudLOqLgKLmpbM/U44371ZwJQaA6OvgNUK0ASx+sQFu83/2oT1QXN9qO49Av+w2fndrIvae1GcDhE2YiL779dGLuHECZoXYjdOzeWStR1X8y57x+Mb1asDuURSiIZnsYAZQem9LdH+ZIOdsgWPYsRA4ByqZWWPdya6464nevcRGtsyEI0+Ao4s0K7Z2vEVcL/AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAqVbjVkOsGj8eVmMwTgYE7dSncgnzlXw3FdUNTU5JGXWoauw+6+NUu+QSAarsVr7rBPQ6y4V4VRxL1bYRxf/RjkXNLJMw4l0pLqHw5H8VMD26Yz6Z1P3Vl0O3e0mYj4L6qY/PRwTY1c7tjLtEPOIQNuQYdFfHQqVQ5/XTQjtT8fq3Q94nbJTXwiwkAkoMB5Pl7tFGRY5oDV+MdGpPnvYi65T3sCaLDPpCbm47G3Z776wwAeKIVKv/eE1uNNOtDI8y/7xYztKEAW+1trqn+FwLOf8Bfz5h0vIcmCSR1DBMRORx/ClkioKDJl7CP7MlAceCQk1yy5Dv+zb/MBEeWXVl4=" ], "x5t": "F1t_mjSVK915RVbrJF7EETO8lcU", "x5t#S256": "RN7xc1szdzJ3rHX_ttXe3MvWUP0wrOceRYmPN82jzu4" } ] } 定义证书边界:代码定义 PEM 格式证书的开始 (pemStart) 和结束 (pemEnd) 边界。 提取密钥:它从签名密钥对象中提取第一个证书 (x5c[0]),该对象是从身份验证服务器检索到的 JSON Web 密钥集 (JWKS) 的一部分。 创建 PEM 格式:这些组件连接在一起以创建完整的 PEM 格式的公钥 (pem),用于验证 JWT 签名。 const pemStart = '-----BEGIN CERTIFICATE-----\n'; const pemEnd = '\n-----END CERTIFICATE-----'; const pem = pemStart + signingKey.x5c[0] + pemEnd;

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.