我有 jwt 策略:
export class JwtStrategy extends PassportStrategy(Strategy, "jwt") {
constructor() {
super({
ignoreExpiration: false,
secretOrKey: "secret",
jwtFromRequest: ExtractJwt.fromExtractors([
(request: Request) => {
let data = request.cookies['access'];
return data;
}
]),
});
}
async validate(payload: any){
return payload;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
export class AuthController {
constructor(private authService: AuthService) {}
@UseGuards(AuthGuard("jwt"))
@Get()
getPayload() {
//here I need to get the payload that was returned in jwt strategy
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何获取 jwt 策略中返回的控制器中的有效负载呢?
我目前正在构建 Node.js 应用程序并尝试使用 JWT 来处理会话。在我见过的每个实现中,数据refresh-token都存储在快速数据库中,例如redis. 当令牌过期时,客户端发送 来refresh-token获取新的access-token,然后服务器检查 是否refresh-token在数据库中,然后生成新的令牌。
但既然refresh-token必须是服务器生成的,无法篡改,而且我们还可以检查是否过期,那为什么还要存储呢。如果是的logout话,我们不能只将user_id已登录的人存储在数据库中,而不存储refresh-token.
我也在考虑存储最新的而access-token不是refresh-token作为redis. user_id原因是access-token只有当前一个过期时我们才会生成新的。所以下面的情况不可能发生,
access-token和refresh-token。由于大多数实现仅将access-token客户端在注销期间提供的内容列入黑名单,因此我相信如果客户端使用 REST API,则这种情况是可能的。
那么存储 的用途是什么refresh-token,存储 的access-token反而会有任何好处。有关应用程序的更多信息,
redis登录用户,并列入黑名单access-token(在注销期间提供)。refresh和access令牌存储在 httpOnly cookie 中,并将access令牌作为不记名令牌发送。refresh-token在刷新访问令牌时在 POST 正文中发送。https我正在开发一个实现 JWT 身份验证的 Spring Boot 项目,但我发现了一些困难。它基于 Udemy 课程中发现的一个示例,我正在尝试适应我的特定用例。它由以下两个微服务组成:
GET-USER-WS:这是从数据库获取用户信息的微服务。
AuthServerJWT:此微服务调用GET-USER-WS来获取用户信息并构建将由其他微服务使用的 JWT 令牌。
基本上,第二个AuthServerJWT包含以下JwtAuthenticationRestController控制器类:
@RestController
//@CrossOrigin(origins = "http://localhost:4200")
public class JwtAuthenticationRestController {
@Value("${sicurezza.header}")
private String tokenHeader;
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
@Qualifier("customUserDetailsService")
private UserDetailsService userDetailsService;
private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationRestController.class);
@PostMapping(value = "${sicurezza.uri}")
public ResponseEntity<?> createAuthenticationToken(@RequestBody JwtTokenRequest authenticationRequest)
throws AuthenticationException {
logger.info("Autenticazione e Generazione Token");
authenticate(authenticationRequest.getUsername(), authenticationRequest.getPassword());
final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername());
final String token = jwtTokenUtil.generateToken(userDetails); …Run Code Online (Sandbox Code Playgroud) 当有人通过 Auth0 登录我的网站时,我会从 Auth0 获取 JWT 令牌。该令牌告诉我此人的 UID,并允许我从前端向后端进行 API 调用,在后端我可以验证 JWT 令牌以确保请求来自已登录的用户。
在https://jwt.io上,您可以粘贴任何 JWT 令牌,它会解析它并验证签名。
有谁知道我如何在 python 中做到这一点?
Auth0 没有给我 JWT 令牌的私钥,所以我无法使用jwt.decode().
相反,我需要以某种方式用它的公钥解析 JWT 令牌,但我不确定如何在 python 中检索它。
这是 JWT 令牌:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImZneF9xWEJVNWt0ZzZXSlNLdTJIdiJ9.eyJuaWNrbmFtZSI6ImpvaG5fbWFyayIsIm5hbWUiOiJqb2huX21hcmtAb3V0bG9vay5jb20iLCJwaWN0dXJlIjoiaHR0cHM6Ly9zLmdyYXZhdGFyLmNvbS9hdmF0YXIvNTMxZmJlZjcxN2I1NzVmYjU3MGJlYzcxNTBlOWQ4MTA_cz00ODAmcj1wZyZkPWh0dHBzJTNBJTJGJTJGY2RuLmF1dGgwLmNvbSUyRmF2YXRhcnMlMkZqby5wbmciLCJ1cGRhdGVkX2F0IjoiMjAyMi0wNC0wNVQxNDoyMzozNy42NTFaIiwiZW1haWwiOiJqb2huX21hcmtAb3V0bG9vay5jb20iLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHBzOi8vZGV2LW44Z2h5a3lvLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHw2MTdiZTllMzJhMmYyNjAwNmEzZDlhM2EiLCJhdWQiOiIwUGwwR1F5cFhjNkZEakxhb0JuSjhzOEtNZjVKZ3J4bSIsImlhdCI6MTY0OTE2ODYyMiwiZXhwIjoxNjQ5MjA0NjIyLCJub25jZSI6IlJuTjBmbFoyU0Vkck4wSkhRV1EyY21FMk1rNUpXVlUzTW1jM2RtaHlXVkJWYm5oalowMUNUR1paU3c9PSJ9.NQBQPoEj6wzYzclrQzXAWh124gyg_Nf1UYZR4lAuqHZ-fdFycrBMA0Y0dBSvQ-WI7YZOMAPjCRK0nuxKzj9kMQ0c-3finCgsl411tX5tvaX_Khe116le_eyBV28aQQLjqT0zvLaSgIYaJqcgshQ1bYvJp8UXPf8GkMWCD89pnqYPwexx9nsWjrnikInLY9oSbWYN1zA7DxwhygI_JeQc6Cvu6pl1xq8m_WZaCMSOJS2umyl_7vfA84cDX1Zz8aVWEOMinnbmR48sY79cEiIMplcYJA3QH4yFEawSWbzWnVUcv9VCgCJ7fCbqikF86fz2TrWYrI6eATJoVHOXDNDKwA
Run Code Online (Sandbox Code Playgroud) 我们正在将现有的 Javascript Google 登录迁移到新的 Google OAuth 库,如此处弃用通知中所述 - https://developers.googleblog.com/2021/08/gsi-jsweb-deprecation.html
我们遵循本指南,我们的 javascript 代码如下所示:
const client = google.accounts.oauth2.initTokenClient({
client_id: <our-client-id>,
scope: 'https://www.googleapis.com/auth/userinfo.email \
https://www.googleapis.com/auth/userinfo.profile',
callback: (tokenResponse: any) => {
if (tokenResponse && tokenResponse.access_token) {
if (google.accounts.oauth2.hasGrantedAllScopes(tokenResponse,
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile')) {
console.log(tokenResponse.access_token );
.. further auth logic
}
}
}
});
client.requestAccessToken();
Run Code Online (Sandbox Code Playgroud)
从某种意义上说,一切工作正常,我能够从 Google 检索令牌,只是看起来新库生成的 JWT 令牌无效。更准确地说,它与 JWT 令牌规范不匹配 - 令牌不由 3 部分组成(标头/有效负载/签名)并且太短(意味着它可能不携带应携带的所有数据)。它也没有通过 https://jwt.io/中的验证
让我给你举个例子。
以前版本的库生成的令牌:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcx NhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ
新库生成的令牌:
ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv6qMpMkbNxW-ltOh49s6U4JKZNvPJV3d0TAE_rqqvkvVG2983ryewiufhdsklKGiH-vEdIs7u2389iwek-dcgkY1SE-b21g0932oiweKT-ZKTJvmHA是
因此,问题是新版本的库不会返回正确的 JWT 令牌(如上所述)。我们不能将这个新令牌用于任何用途,因为我们无法验证它的完整性(谁颁发的、令牌秘密是否与我们的应用程序 ID 匹配、令牌何时过期等)。
我还尝试使用 Google 自己的 OAuth 调试端点对此进行测试,但它也抱怨第二个令牌无效:
https://oauth2.googleapis.com/tokeninfo?id_token=ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv....
Run Code Online (Sandbox Code Playgroud)
注意:由于 …
如何从 .env 文件中的随机字符串创建 NodeJS Crypto KeyObject?
我使用jsonwebtoken来创建/验证 JWT,但它无法在 nextjs 中间件边缘函数中运行,因此我想迁移到使用jose。问题是,在 jose 中,您无法使用 .env 文件中的秘密字符串对 JWT 进行签名,您需要创建一个加密 KeyObject 并使用它来对 JWT 进行签名。
// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面的 API 创建 KeyObject,但我收到 jose 的错误:
// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP
Run Code Online (Sandbox Code Playgroud)
我还尝试使用 Uint8Array,因为jose 文档说我可以,但我收到此错误:
import crypto from 'crypto';
const key = crypto.createSecretKey(process.env.JWT_SECRET, 'utf-8');
const jwt = new jose.SignJWT(payload).sign(key);
// Error: KeyObject or CryptoKey instance for asymmetric algorithms must not be of type "secret."
Run Code Online (Sandbox Code Playgroud)
预先感谢您的任何帮助、评论、链接、资源!
org.springframework.security.oauth2.jwt我\xe2\x80\x99m 尝试使用具有共享密钥的包中的编码器/解码器来实现解决方案。\n但是当我尝试使用JwtEncodingException。\n我以另一种形式提出了这个问题,但在这里我提供了一个简单的准备执行示例来验证问题。
import com.nimbusds.jose.JOSEException;\nimport com.nimbusds.jose.jwk.source.ImmutableSecret;\nimport com.nimbusds.jose.jwk.source.JWKSource;\nimport com.nimbusds.jose.proc.SecurityContext;\nimport org.springframework.security.oauth2.jwt.*;\nimport javax.crypto.SecretKey;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic class EncoderDecoderTest {\n public static String secret = "j8IoV1jF67";\n\n public JwtEncoder jwtEncoder() throws JOSEException {\n SecretKey originalKey = new SecretKeySpec(secret.getBytes(), "AES");\n JWKSource<SecurityContext> immutableSecret = new ImmutableSecret<SecurityContext>(originalKey);\n return new NimbusJwtEncoder(immutableSecret);\n }\n public JwtDecoder jwtDecoder() {\n SecretKey originalKey = new SecretKeySpec(secret.getBytes(), "AES");\n NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withSecretKey(originalKey).build();\n return jwtDecoder;\n }\n\n public void tester() throws JOSEException {\n JwtClaimsSet claims = JwtClaimsSet.builder()\n .issuer("self") //Only this for simplicity\n .build();\n var …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 Web API 中实现 JWT 身份验证。我是第一次这样做。当我在 Google 上搜索一些教程时,第一步是显示将密钥保存在 appsettings.json 文件中。我被困在那个地方了。我如何知道并获取该密钥,以便将其存储在文件中。另外,我如何知道每个环境(即开发、测试和生产)的密钥。
提前致谢。
在我的应用程序中,我有一个令牌刷新端点/refresh,它在 cookie 中设置新的 JWT 刷新令牌并将新的 JWT 访问令牌作为 json 发送回。
由于访问令牌会在 5 分钟后过期,因此我需要在后台实现刷新逻辑,以便在访问令牌过期时启动。
目前我正在做的是通过调用api RTK Query,如果api拒绝查询,我调用refreshTokens突变。
我需要将此逻辑放入所有 api 查询中,如下所示:
updateProfile(body)
.unwrap()
.catch((error) => {
if (error && error.status === 403) {
refreshTokens(null); // RTK Query Mutation
updateProfile(body); // RTK Query Mutation
}
});
Run Code Online (Sandbox Code Playgroud)
这样做似乎是重复代码,因为它需要对所有 api 调用实现。
我想知道是否有一个全局解决方案可以在查询被拒绝时自动调用刷新令牌端点。
例如,当我登录时,我使用有效负载{ 'userId': 1, '2fa': false}(/login路由)创建一个访问令牌,然后我执行另一条路由“/login/auth”,例如检查一次性密码是否正确,如果是,我创建了另一个jwt,但是这个2fa 设置为 true 的时间。然后后续的routes会检查2fa是否正确运行。如果没有,就会出错。这是执行此操作的正确方法还是hacky?
// middleware
const auth = (req, res, next) => {
const token = req.header('access-token');
if (!token) return res.status(401).json('Not Authorized');
try {
const payload = jwt.verify(token, 'secret1');
req.payload = payload
next();
} catch (ex) {
res.status(400).json('Invalid.');
}
};
// routes
router.post(
'/login',
async (req, res) => {
try {
/* login database stuff goes here if successful creates access token
*/
const token = jwt.sign(
{ userId, twoFactorAuthenticated: false …Run Code Online (Sandbox Code Playgroud) jwt ×10
node.js ×4
java ×2
.net-5 ×1
api-security ×1
auth0 ×1
c# ×1
cryptography ×1
express ×1
google-oauth ×1
jose ×1
jwk ×1
nestjs ×1
nestjs-jwt ×1
next.js ×1
oauth-2.0 ×1
reactjs ×1
redis ×1
redux ×1
rtk-query ×1
spring-boot ×1