所以我正在使用第三方RESTful Web服务,我必须通过请求JWT来验证自己,并将其提供给任何进一步的请求。 我这样做只需发布我的用户名和密码并收到令牌。我既不知道用于创建令牌的秘密,也不知道除用户名和密码之外的任何其他秘密。
现在,我想检查JWT的到期时间,然后再将其重新用于后续的Web服务请求或者只是更新它。我知道我可以使用它并捕获某种过期异常,但我不愿意。
我尝试按照本教程:[https://stormpath.com/blog/token-auth-for-java]
但是我必须提供签名密钥。
我怎么会这样做,因为我没有用来编码它的秘密。
顺便说一句:我正在使用groovy和wslite来处理这个问题。
答案 0 :(得分:2)
你应该能够获取令牌的主体并对其进行解码。
私钥不用于加密JWT的主体,它只用于生成签名......
所以,在Groovy中你可以做到:
// A JWT from the link you gave above
String key = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vdHJ1c3R5YXBwLmNvbS8iLCJleHAiOjEzMDA4MTkzODAsInN1YiI6InVzZXJzLzg5ODM0NjIiLCJzY29wZSI6InNlbGYgYXBpL2J1eSJ9.43DXvhrwMGeLLlP4P4izjgsBB2yrpo82oiUPhADakLs'
// Just the body (middle section)
String body = key.split(/\./)[1]
// Un base64 it (using the Java 8 Base64 class)
String unencoded = new String(Base64.decoder.decode(body), 'UTF-8')
// Parse the json into a map
Map data = new groovy.json.JsonSlurper().parseText(unencoded)
// Get the expiry
long exp = data.exp
assert exp == 1300819380
当然,没有什么可以说令牌的正文必须包含任何形式的到期时间供您查看......它可能只是一个内部ID
答案 1 :(得分:0)
如果您不知道用于对其进行编码的密码,也不想破解其密码,则您无法解码来自令牌的任何信息。没有任何类似标准信息必须在令牌中编码,根本不需要它应该包含任何加密信息的令牌,它可能只是存储在其上的随机生成的UUID他们在DB中的一面,所以在这种情况下你根本无法解码它。