首先,生成密钥的好方法是什么?我应该在键盘上输入很多随机键来生成一个,但必须有一个更好的解决方案.解释生成一个非常好的密钥的方法.
第二,存储密钥的好方法是什么?我可以在我的应用程序配置中编写密钥,但这意味着对源代码的破坏将危及整个系统.在Node.js Express应用程序中存储密钥的好方法是什么?
将软件包Microsoft.AspNetCore.Authentication.JwtBearer从版本 3.1.14 更新到 6.0.1 后,身份验证请求失败,并显示 401 Unauthorized invalid token。
新的软件包版本需要更改哪些内容?
我正在使用ADAL库来获取资源的访问令牌.有谁知道到期时间是什么格式?更具体地说
"exp" (Expiration time) claim.
JwtSecurityTokenclass在解析后只返回int32.所以,这不是一个好的指标.
尝试解析它TimeSpan,DateTime但值不是相隔90分钟.它几乎是一样的.
这是我从小提琴手那里得到的iat并exp声称(使用https://jwt.io/来解析令牌)
iat:1475874457
exp"1475878357
这些价值差不多.
我有一个Spring REST应用程序,它首先使用基本身份验证进行保护.
然后我添加了一个登录控制器,它创建了一个JWT JSON Web令牌,用于后续请求.
我可以将以下代码移出登录控制器并进入安全过滤器吗?然后我不再需要登录控制器了.
tokenAuthenticationService.addTokenToResponseHeader(responseHeaders, credentialsResource.getEmail());
Run Code Online (Sandbox Code Playgroud)
或者我可以删除基本身份验证吗?
将基本身份验证与JWT混合是一种好的设计吗?
虽然一切正常,但我在这里有点黑暗,以便最好地设计这种安全性.
我在这里尝试使用谷歌OAuth来验证我的节点快递应用程序中的用户.我可以成功执行OAuth,它会返回如下响应:
{
access_token: 'token string',
id_token: 'id.string',
expires_in: 3599,
token_type: "Bearer"
}
Run Code Online (Sandbox Code Playgroud)
这一切都有道理,但我不能为我的生活弄清楚如何解码JWT.我对这一切都缺乏经验,所以这对我来说有点陌生.
按照此处列出的说明操作:https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken我正在尝试在我的节点应用中本地解码JWT.
我在我的节点环境中安装了https://github.com/hokaccha/node-jwt-simple.
而且我很确定我需要使用这个证书(https://www.googleapis.com/oauth2/v1/certs)以某种方式解码它,但我在这里有点不知所措.我真的不明白我如何将证书带入我的节点应用程序,之后如何将它与node-jwt-simple一起使用.而且我也不太了解我何时需要提取新证书,而不是使用缓存证书.
那些有经验的人可以帮助我吗?
谢谢你的帮助.我现在完全不知所措.
**更新**
所以我取得了一些进展......有点儿.通过调用jwt.decode(id_token,certificate,true); 我能够成功解码令牌.即使证书var是一个空对象{}.这给我留下了3个问题.1:使用谷歌网址将证书送入我的快递应用程序的最佳方法是什么?2:我怎么知道何时需要提供它的新版本?3:似乎传递给noVerify(jwt.decode中的第3个arg)的真实是一个糟糕的主意.如何在不通过的情况下实现这一目标?看起来似乎jwt-simple期待hs256并且令牌正在使用rs256.
再一次,我对此缺乏经验,所以我可能会离开这里.
*更新* 感谢Nat的帮助,我得到了这个工作!我想我尝试了每一个JWT和JWS节点模块.我最终登陆的内容如下:我发现我所看到的所有模块都没有完全符合我的想法.我创建了以下jwt解码辅助方法,我用它来解码id_token,所以我可以从标题中获取孩子.
module.exports = {
decodeJwt: function (token) {
var segments = token.split('.');
if (segments.length !== 3) {
throw new Error('Not enough or too many segments');
}
// All segment should be base64
var headerSeg = segments[0];
var payloadSeg = segments[1];
var signatureSeg = segments[2];
// base64 decode and parse …Run Code Online (Sandbox Code Playgroud) 我有一个Android客户端通过使用从Google Play服务获取身份验证令牌GoogleAuthUtil.getToken(Context context, Account account, String scope).
然后将其发送到后端(Go)服务器,该服务器检查该令牌是否来自https://www.googleapis.com/oauth2/v1/cert中的一个Google签名证书.为此,它需要在令牌标头中查找分配给"kid"的证书.
99%的情况下,这很好用,但我经常会遇到"孩子"与任何已发布的Google证书不对应的情况,因此我无法授权令牌.
编辑:
我已经在服务器上添加了大量的日志记录来尝试跟踪它,并且有一些关系值得注意:
kid仅用于单个用户.我经常会在同一个用户的几天内看到多个具有给定无效的请求kid,但只能来自该用户.kid从不kid对任何请求使用有效,或者对请求使用任何其他kid请求,即使它们相隔数天.Afaik Google每24小时左右循环一次证书.我目前的想法是,它可能来自从谷歌播放以外的网站下载APK的用户,但我现在无法验证这一点.
编辑:有一个问题跟踪器,但它似乎已被标记为低优先级.如果有人遇到此问题,请在跟踪器上告知.https://issuetracker.google.com/issues/37734997
我生成了一个JTW令牌,并且有一些我很清楚的声明,但是kid在标题中有一个声明.有谁知道这意味着什么?
我使用auth0.com生成令牌
首先,我假设一个后端控制输入以防止XSS漏洞.
在这个答案中 @Les Hazlewood解释了如何在客户端保护JWT.
假设所有通信都有100%TLS - 在登录期间和登录后的所有时间 - 通过基本身份验证使用用户名/密码进行身份验证并在交换中接收JWT是一个有效的用例.这几乎就是OAuth 2的一个流程('密码授权')的工作方式.[...]
您只需设置Authorization标头:
Run Code Online (Sandbox Code Playgroud)Authorization: Bearer <JWT value here>但是,话虽如此,如果您的REST客户端是"不受信任的"(例如支持JavaScript的浏览器),我甚至不会这样做:HTTP响应中可通过JavaScript访问的任何值 - 基本上任何标头值或响应正文值 - 可以通过MITM XSS攻击嗅探和截获.
最好将JWT值存储在仅安全的纯http cookie中(cookie config:setSecure(true),setHttpOnly(true)).这可以保证浏览器:
- 只通过TLS连接传输cookie,
- 永远不要将cookie值用于JavaScript代码.
这种方法几乎是您为最佳实践安全所需要做的一切.最后一件事是确保您对每个HTTP请求都有CSRF保护,以确保启动对您站点的请求的外部域无法正常运行.
最简单的方法是使用随机值(例如UUID)设置仅安全(但不是仅限http)cookie.
我不明白为什么我们需要具有随机值的cookie来确保启动对您站点的请求的外部域无法运行.使用同源策略时,这不是免费的吗?
来自OWASP:
检查Origin Header
Origin HTTP Header标准是作为防御CSRF和其他跨域攻击的方法而引入的.与引用者不同,源将出现在源自HTTPS URL的HTTP请求中.
如果存在原始标头,则应检查其是否一致.
我知道OWASP本身的一般建议是同步器令牌模式,但我看不出剩下的漏洞是什么:
更新1: 同源策略仅适用于XMLHTTPRequest,因此恶意站点可以轻松地生成表单POST请求,这将破坏我的安全性.需要显式的原始标头检查.等式将是:
我从我的API获得一个JWT编码的访问令牌作为响应.但我无法解码它并以JSON格式获取它.我尝试使用angular2-jwt库,但它没有用.我正在编写下面的代码:
setXAuthorizationToken(client){
let requestHeader = new Headers();
requestHeader.append('Content-Type', 'application/x-www-form-urlencoded');
this.http.post(client.clientURL + "oauth/token", 'grant_type=password&client_id=toto&client_secret=sec&' + 'username=' + client.username
+ '&password=' + client.password, {
headers: requestHeader
}).map(res=>res.json())
.subscribe((token) =>{
if(!token.access_token){
return;
}
else{
var decompressToken = LZString.decompressFromEncodedURIComponent(token.access_token);
console.log(decompressToken);
}
});
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
jwt ×10
express ×2
node.js ×2
access-token ×1
adal ×1
android ×1
angular ×1
asp.net-core ×1
c# ×1
certificate ×1
cookies ×1
cors ×1
csrf ×1
decode ×1
google-oauth ×1
saml ×1
security ×1
token ×1