我正在尝试使用jwt,在进行一些研究时,我想到了这个 JWT DECODER,我想我必须输入令牌和我的密钥来解密令牌.
但我很惊讶看到它只需要令牌来解密它.如果没有秘密密钥可以解密,有什么用呢.令牌中的所有用户数据都将向任何人开放.
我错过了什么吗?
我的另一个问题是jwt如何帮助防止MITM
谢谢
我是使用JWT的新手。我有一个API,该API会生成JWT,以便对客户端进行身份验证以进行进一步的请求。我的JWT具有返回用户ID的属性:
{
jwt: {
exp: "2017-12-12 00:00:00",
data: {
user_id: 491
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是客户端是否可以解码API生成的JWT并将新属性添加到数据字段中,如下所示:
{
jwt: {
exp: "2017-12-12 00:00:00",
data: {
user_id: 491,
status: 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果我可以通过将状态字段设置为默认值的API身份验证系统生成JWT,然后客户端可以对其进行更改。
谢谢。
我的user.rb模型包含:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable,
:jwt_authenticatable, jwt_revocation_strategy: JWTBlacklist
def send_devise_notification(notification, *args)
devise_mailer.send(notification, self, *args).deliver_later
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用devise-jwt gem登录我的Rails api。
我的JWTBlacklist.rb模型包含:
class JwtBlacklist < ApplicationRecord
include Devise::JWT::RevocationStrategies::Blacklist
self.table_name = 'jwt_blacklist'
end
Run Code Online (Sandbox Code Playgroud) 据我所知,要使令牌无效,这是存储令牌的最佳方法,它是数据库的到期日期时间。要验证它,您只需从数据库中选择它,如果它存在,就知道它已失效。此外,您可以在数据库的过期日期时间之前删除每个过期的令牌。
因此,我创建了一个中间件,该中间件从授权标头中提取令牌,并将该令牌和到期日期时间附加到该request对象。signOut路由使令牌失效需要日期时间。
async use(req: any, res: Response, next: NextFunction) {
try {
const headers: IncomingHttpHeaders = req.headers;
const authorization: string = headers.authorization;
const bearerToken: string[] = authorization.split(' ');
const token: string = bearerToken[1];
if (await this.authenticationsRepository.findByEncodedToken(token)) { // invalidated token?
throw new Error(); // jump to catch
}
req.tokenPayload = verifyToken(token); // calls jwt.verify with secret
next();
} catch (error) {
throw new UnauthorizedException();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如何exp从令牌中提取属性以计算到期日期时间呢?
我有一个节点 js 应用程序。我使用 JSON Web 令牌进行身份验证。我将我的令牌分成 3 个部分(标头、有效负载、签名)以将它们用于特定代码。
我的有效负载 JSON 对象如下所示:
payload= {"email": "minnela@gmail.com", "iat" : "23254324", "exp": "4323456"}
Run Code Online (Sandbox Code Playgroud)
我需要获取“电子邮件”的值。如何在 Node.js 中获取它?
我jwt在我的nestjs应用程序中使用令牌,但是当我运行我的项目并使用@UseGuards(AuthGuard())装饰器调用控制器时,应用程序调试返回以下错误:
Cannot read property 'challenge' of undefined
Run Code Online (Sandbox Code Playgroud) 我是 AzureAD 身份验证的新手。我在 startup.cs 中使用以下设置设置了我的 Web API
services.AddAuthentication(sharedopt => sharedopt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer("AzureAd", options =>
{
options.Audience = Configuration.GetValue<string>("AzureAd:Audience");
options.Authority = Configuration.GetValue<string>("AzureAd:Instance")
+ Configuration.GetValue<string>("AzureAd:TenantId");
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
{
ValidIssuer = Configuration.GetValue<string>("AzureAd:Issuer"),
ValidAudience = Configuration.GetValue<string>("AzureAd:Audience")
};
});
Run Code Online (Sandbox Code Playgroud)
我希望我的客户端应用程序 (Angular) 将在其请求中附加 Authorization 标头,因此它可以访问 API
但是当我执行 Web API 并尝试使用授权打开任何 API 时,它会触发此错误
InvalidOperationException: 未指定 authenticationScheme,也未找到 DefaultChallengeScheme。可以使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(Action configureOptions) 设置默认方案。
我已经指定了 JWTBearerDefaults.AuthenticationScheme。仍然为什么它不接受?
我正在使用express它router来创建一个具有公共和私有路由的服务器。要访问私有路由,用户必须登录并发送JWT令牌。令牌很好,但我无法将用户重定向到私有路由。
const express = require('express');
const jwt = require('jsonwebtoken');
const authRouter = require('./auth');
const usersRouter = require('./users');
const router = express.Router();
router.use(authRouter);
const accessTokenSecret = '4-8-15-16-23-42';
const privateRoutes = ['/user'];
const checkPublicOrPrivate = (req, res, next) => {
privateRoutes.forEach(route => {
if (req.path.includes(route)) {
return authorization(req, res, next);
}
});
return next();
};
const authorization = (req, res, next) => {
const { token } = req.headers;
if (token) {
jwt.verify(token, accessTokenSecret, (err, user) …Run Code Online (Sandbox Code Playgroud) 我正在为我的后端使用以下堆栈:
现在,附加到该 pubsub 主题,我有一个推送订阅,它使用服务帐户和指定的受众触发 Cloud Run 方法。
现在,我需要配置 Cloud Run Gateway 以验证 pubsub 为指定服务帐户生成的 JWT。这是api_config.yaml按照此处的文档完成的:https : //cloud.google.com/pubsub/docs/push#jwt_format
发行者https://accounts.google.com和我在 pubsub 订阅中指定的受众。
authentication:
providers:
- id: gcloud
jwks_uri: https://www.googleapis.com/robot/v1/metadata/x509/875517523825-compute@developer.gserviceaccount.com
issuer: https://accounts.google.com
audiences: project.clounrun.admin
rules:
- selector: project.v2.Events.*
requirements:
- provider_id: gcloud
Run Code Online (Sandbox Code Playgroud)
可以在此处找到此服务帐户的 jwks:
https://www.googleapis.com/robot/v1/metadata/x509/SERVICE-ACCOUNT-ID
就我而言:
https://www.googleapis.com/robot/v1/metadata/x509/875517523825-compute@developer.gserviceaccount.com
我已经激活了 ESPv2 的调试日志,这是我在尝试验证 JWT 时得到的信息:
13:07:37.027 request headers complete (end_stream=false):\n\':authority\', …Run Code Online (Sandbox Code Playgroud) jwt google-cloud-platform google-cloud-pubsub google-cloud-endpoints-v2 google-cloud-run
我正在开发一个实时 websocket 应用程序,其中服务器使用 .Net 核心进行编码,而客户端可以使用多种不同的语言。我决定保护服务器的方式是 JWT,即只接受来自具有有效 JWT 的请求的套接字连接。我可以用 .Net 客户端成功地做到这一点,这是我的代码:
_client = new WebSocket("ws://localhost:8080/api/SocketDock","",null,new List<KeyValuePair<string, string>>()
{ new KeyValuePair<string, string>(
"Authorization", "Bearer eyJhbGciOiJIUzI1.....")
});
Run Code Online (Sandbox Code Playgroud)
这与 .net 核心客户端 websocket 完美配合。但是,我无法对 Angular 客户端做同样的事情。我以某种方式浏览了几篇文章,最终得到了不可能的答案。然而,在我看来,如果协议或握手在一种语言中是可能的,那么在其他语言中也必须是可能的。
有人可以指导我以正确的方式与任何 Angular 客户端实现相同的目标吗?
jwt ×10
node.js ×4
javascript ×3
nestjs ×2
.net-core ×1
angular ×1
api-design ×1
c# ×1
devise ×1
encryption ×1
express ×1
express-jwt ×1
header ×1
middleware ×1
rest ×1
security ×1
token ×1
websocket ×1