JWT签名与本地计算的签名不匹配(JWT signature does not match locally computed signature)

我在用

JwtBuilder builder = Jwts.builder()
                    .setId(user.getEmail())
                    .signWith(signatureAlgorithm, signingKey);

然后创建一个令牌

Jwts.parser().setSigningKey(secret).parse(token);

进行身份验证。 当我在JUnit测试中运行它时,它工作正常。 但是,当我通过REST调用验证作为标头传递的令牌时,身份验证因SignatureException而失败。 我已经验证了HTTP调用两端的令牌,令牌字符串是相同的。 创建/认证的代码是静态的,因此,每侧的秘密是相同的。 任何线索


I am using

JwtBuilder builder = Jwts.builder()
                    .setId(user.getEmail())
                    .signWith(signatureAlgorithm, signingKey);

to create a token then

Jwts.parser().setSigningKey(secret).parse(token);

to authenticate. When I run this in a JUnit test, it works fine. However, when I authenticate token passed as a header over REST call, authentication fails with SignatureException. I have verified the token on both ends of the HTTP call and the token string is identical. Code to create/authenticate is static, therefore, the secret is same on each side. Any clues


原文:https://stackoverflow.com/questions/42397484
2021-04-27 15:04

满意答案

static Key secret = MacProvider.generateKey(); 每次重新加载服务器时都会生成一个新的随机密钥,因为在加载类时会初始化静态变量

这意味着如果您发出JWT,它只有在服务器不重启时才有效。 你得到的SignatureException是因为签名密钥不同

您需要在第一代之后存储签名密钥secret.getEncoded()并在模块启动时加载它


static Key secret = MacProvider.generateKey(); will generate a new random key each time your server is reloaded because static variables are initialized when the class is loaded

It means that if you issue a JWT, it is only valid as long as the server does not reboot. The SignatureException you got is because the signing key it is different

You need to store the signing key secret.getEncoded() after first generation and load it when your module starts

相关问答

更多

Google OAuth JWT签名验证(Google OAuth JWT signature verification)

从https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken推荐的方法: “我们建议您从https://www.googleapis.com/oauth2/v1/certs检索Google的公钥并在本地执行验证。 由于Google仅很少更改其公钥(每天一次),因此您可以缓存它们,并且在绝大多数情况下,比使用TokenInfo端点更有效地执行本地验证。 这需要检索和解析证书,并进行适当的加密调用以检查签名。 ...

Firebase JWT:签名验证失败(Firebase JWT: Signature verification failed)

你不需要$secretKey secretKey或base64_decode关键,只需这样做: $jwt = \Firebase\JWT\JWT::encode($data, $key, 'HS256'); $decoded = \Firebase\JWT\JWT::decode($jwt, $key, array('HS256')); You don't need $secretKey or base64_decode the key for that matter, just do: $jw...

使用PHP的JWT“签名验证失败”(JWT “Signature verification failed” with PHP)

为什么不验证的问题是因为我在jwt上使用了json_encode,并且导致它再次被引用,因此令牌看起来像这样“”eY0lkajflajk ....“”并且导致了验证异常。 谢谢@zerkms带来了。 The problem why it wasn't verifying was because I was using json_encode on the jwt and that caused it to be wrapped around quotes again so the token lo...

JWT签名与本地计算的签名不匹配(JWT signature does not match locally computed signature)

static Key secret = MacProvider.generateKey(); 每次重新加载服务器时都会生成一个新的随机密钥,因为在加载类时会初始化静态变量 这意味着如果您发出JWT,它只有在服务器不重启时才有效。 你得到的SignatureException是因为签名密钥不同 您需要在第一代之后存储签名密钥secret.getEncoded()并在模块启动时加载它 static Key secret = MacProvider.generateKey(); will generat...

JWT令牌签名验证的JavaScript(JWT token signature validation javascript)

如果我不验证客户端的签名,我如何确保令牌确实来自服务器。 也许中间有人正在改变令牌 签名验证不会避免Man In The Middle攻击 。 即使使用有效令牌,攻击者也可以嗅探频道捕获凭证或更改消息 使用SSL / TLS频道(https) 如果我不验证签名,我怎么知道该令牌没有被篡改? 由TLS可信服务器提供的令牌可能是有效的(它可能已在本地存储中被更改)。 您可以验证签名。 此操作通常在服务器端完成(请参阅@sakuto答案),但您可以在浏览器中完美地完成此操作 但是,如何在客户端验证签名?...

如何使用在线工具手动验证JWT签名(How to manually validate a JWT signature using online tools)

这都是格式和编码的问题。 在https://jwt.io上,您可以根据输入值和密码获取此令牌: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M 我们要证明签名: 3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4...

JWT公钥与私钥签名验证 - 有什么不同?(JWT public key vs private key signature validation — what is the difference?)

使用RSA不对称密钥对,JWT使用私钥签名并与公众验证。 您无法使用私钥验证数字签名 模数和指数是公钥的组成部分,您可以使用它来构建PEM格式的公钥,该格式是以二进制格式编码的公钥(模数和指数)的base64表示。 您可以使用PEM,DER或模数和指数,因为它们包含相同的信息 但是任何人都不能建立模数和指数的私钥。 他需要私人RSA元素,这些元素必须保密,以便没有人可以为你签名。 Using a RSA assymetric key pair, the JWT is signed with the...

如何验证JWT签名?(how to verify JWT signature?)

这就是我最终做的事情(使用https://github.com/dgrijalva/jwt-go ): package XXX import ( "errors" oauth2 "code.google.com/p/google-api-go-client/oauth2/v2" "jwt" "appengine" "appengine/urlfetch" ) func getTokeninfo(c appengine.Context, token str...

Google JWT Salesforce的签名无效(Google JWT Invalid Signature from Salesforce)

几天后,我找到了解决问题的另一种解决方案。 问题是base64urlsafe编码。 此编码不是在SFDC中本机完成的,并且描述了从base64字符串中删除尾随填充字符。 幸运的是,我的原始用户名在声明集中没有填充字符编码。 使用新用户名时,填充字符存在,必须在签名前删除。 这一切都归结为几个角色。 Days later I found another solution that solved the issue. The problem was the base64urlsafe encoding...

本地测试Azure Mobile Auth - 无效的jwt签名(Locally Testing Azure Mobile Auth - invalid jwt signature)

要在本地验证由托管服务创建的JWT令牌,您需要获取使用的签名密钥。 您可以通过打开浏览器https://mobile-service-name.scm.azurewebsites.net/Env.cshtml并找到WEBSITE_AUTH_SIGNING_KEY的值来获得此信息。 获取此值并通过在项目根目录中创建(或更新)名为azureMobile.js的文件来配置本地服务器,其中包含以下内容: module.exports = { auth: { secret: 'value from ...

相关文章

更多

微信签名

在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signat ...

android的微信签名

目标: 已经在微信官网申请了账号了,想要在上面开发应用,必须首先对应用进行审核。在审核之前,需要填写应 ...

【已解决】Android微信开放平台,申请移动应用的 应用签名 如何获取

在微信开放平台,申请移动应用的时候: https://open.weixin.qq.com/cgi-b ...

微信公众平台消息接口开发(29)校验签名与消息响应合并

微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 签名校验 消息响应 作者:方倍工作室 原文 ...

微信公众平台消息接口开发(29)校验签名与消息响应合并

微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 签名校验 消息响应 作者:方倍工作室 原文 ...

The content of element type "package" must match "...

在编写后台登陆模块时,将许多默认的设置放在一个名为default的package 里。然后再定义其他 ...

微信开发者-主动请求-实际开发-(5)验证TOKEN(java)

逻辑不再赘述,请参见http://my.oschina.net/u/1867097/blog/2880 ...

Android签名用keytool和jarsigner制作apk文件

生成证书keytool -genkey -alias aeo_android.keystore -ke ...

微信接口开发小记。

创建过程就需要做签名校验,描述如下: 公众平台用户提交信息后,我们将以GET请求方式请求到填写的Url ...

微信学习之自动回复文本

<?php define("TOKEN","echo_server ...

最新问答

更多

在循环中组合来自单独表的点(Combine points from separate tables in a loop)

试试这个查询: SELECT m.id, m.title, sum(if(aw.film_nominated = 1,a.nom_points,0)) AS total_nom_points, sum(if(aw.film_won = 1,a.win_points,0)) AS total_win_points, sum(if(aw.film_nominated = 1,a.nom_points,0))

如何将域本体与WordNet同义词链接?(How to link a domain ontology with WordNet synsets?)

据我所知,没有适用于Protégé4.3或更高版本的插件。 (我查看了WordNet普林斯顿相关项目页面,Ontoling是一个有人创建的插件,但它只适用于Protégé3.2)。 你可能不得不诉诸 1)回归到更古老的Protégé版本。 2)使用Java(或您首选的编程语言)api for wordnet(如JAWS)以及基于本体框架的Java(再次偏好)(如OWL API或Apache Jena)来创建这些链接。 3)自己为WordNet写一个Protégé插件! As far as I k

在WPF C#中的ListView中将项目拖放到特定索引中(Drop Item into Specific Index in ListView in WPF C#)

WPF并不是真的被设计成以这种方式使用。 虽然你可以强力将ListViewItem直接添加到ListView,但它真正应该工作的方式是你有一些类型的集合( ObservableCollection可以正常工作)并将ListView的ItemsSource属性绑定到该集合。 那么答案很简单。 您可以使用带有索引的集合的Insert方法,而不是Add方法。 至于找到鼠标事件发生的ListViewItem,可以使用VisualTreeHelper.HitTest方法。 WPF is

Swift未声明的类型和构建设置(Swift undeclared type and build settings)

在ViewController.Swift放入以下语句 import calendarView 编辑: 请确保在目标的构建设置中正确设置Library Search Path ,如下所示。 路径应该与您的.xcodeproj文件相关。 Put following statement in your ViewController.Swift import calendarView Edit: Please ensure to set Library Search Path correctly

React Material UI - 导出多个高阶组件(React Material UI - Export multiple higher order components)

看看它在material-ui文档站点中的处理方式,特别是在AppFrame组件中: export default compose( withStyles(styles, { name: 'AppFrame', }), withWidth(), connect(), )(AppFrame); 他们正在使用重组来执行此操作。 所以在你的情况下,这将是: import React, { Component } from 'react'; import compose fro

PHP Post自动登录登录(PHP Post Automatic login Login)

当您在该站点上时,您将登录并在此之后转到所需的页面。 该网站允许您到达那里,因为他们通常有一个存储您的数据的会话。 因此,基本上您需要基于cURL模拟系统中的会话。 如果您认为会话的工作原理,您会发现您很可能需要接受cookie,其中该站点将存储会话ID。 所以这也是你需要用cURL做的。 你需要给它一个存储cookie的方法。 所以你可以像这样使用curl_setopt函数: curl_setopt($ch, CURLOPT_COOKIEJAR, '/path/to/cookie.txt');

Git for Windows,将GIT_SSH设置为shell文件会导致“错误:无法生成:没有这样的文件或目录”(Git for Windows, setting GIT_SSH to a shell file causes causes “error: cannot spawn : No such file or directory”)

由于一些完全无法解释的原因,我可以验证它现在在cmd和git bash中都有效,而之前没有。 现在开始为ssh创建一个git-repo预处理器,这样多账户用户就可以更轻松了。 For some totally unexplained reason, I can verify that NOW it works in both cmd and git bash whilst it didn't before. Now on to creating a git-repo preprocessor f

从php代码安装debian驱动器(Mounting a drive in debian from php code)

我有一个疯狂的想法...... 您可以将cron设置为以root身份运行,以检查脚本中的mount命令。 该脚本只需设置要处理的mount命令,当cron到达它时,运行mount,将命令标记为已处理,然后写入日志文件,然后可以显示该日志文件。 I have a wild idea... You could set a cron to run as root that checks for mount commands from your script. The script would simp

使用XCUIApplication和覆盖窗口的OSX UI测试(OSX UI testing with XCUIApplication and covered windows)

要点击某个特定窗口之前,请执行以下操作。 [[[XCUIApplication alloc] init].windows[@"Window"] click]; To focus a specific window before clicking something inside it, do the following. [[[XCUIApplication alloc] init].windows[@"Window"] click];

计时器环绕灵活的位大小(Timer wraparound with flexible bit sizes)

您可以向上乘以而不是符号扩展,以使整个范围与算术类型的大小相同。 换句话说,使用定点算术来填充整数。 在你的情况下,用uint32_t ,看起来像 uint32_t start = GetSomePlatformSpecificTimer(); RunSomeOtherCode(); uint32_t end = GetSomePlatformSpecificTimer(); start <<= 32-COUNTER_WIDTH; end <<= 32-COUNTER_WIDTH; uint32