gpt4 book ai didi

java - 如何在 Android 上从 JWT 收集签名、 header 和正文

转载 作者:行者123 更新时间:2023-11-30 01:16:22 25 4
gpt4 key购买 nike

我最近了解了 Json Web Token (JWT)。因为我喜欢它的工作原理,所以我开始在我的项目中实现它。我的项目涉及两个应用程序进行通信。一个是 android 应用程序,另一个是 Laravel 网络应用程序。

移动应用程序在服务器端验证用户凭据后登录。

我已将用户名和密码从移动应用程序发送到服务器,并且已获得字符串格式的 JWT。但从这一点开始,我找不到收集 JWT 内容的方法。

我已经浏览了几乎所有可能显示的内容(谷歌搜索结果),但我无法获取内容、签名和标题。

我进一步了解的方法之一是使用以下代码,注意我已经删除了 setSigningKey():

try {
Claims claims = Jwts.parser().parseClaimsJwt(jwtHeaderAndClaim).getBody();
System.out.println("ID of the claims: " + claims.getId().toString());
}catch (Exception e){
Log.e("Exception: ", e.toString());
}

上面的代码会产生以下错误:

Exception: io.jsonwebtoken.PrematureJwtException: JWT must not be accepted before 2016-06-14T10:20:09+0300. Current time: 2016-06-14T10:19:37+0300´ 

jwtHeaderAndClaim 是仅删除签名部分后的 JWT 字符串(即:“xxxxxx.yyyyyyyy.”)。如果我将 jwtString (xxxxxxx.yyyyyyyy.ccccccc) 而不是 jwtHeaderAndClaim,则会发生以下错误:

Exception: io.jsonwebtoken.UnsupportedJwtException: Signed JWSs are not supported

如果我按照 stormpath example 中所示放置 setSigningKey :

Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret())).parseClaimsJwt(jwtString).getBody();. 

上面的代码不会工作有两个原因:1.我没有图书馆 导入 javax.xml.bind.DatatypeConverter;2.我不知道怎么拿到 key 。

但是知道我不需要 key ,因为这次我尝试登录并收集用户信息(如名字、姓氏、电话等)和签名( token ),以便下次我发送要存储到服务器端的数据我有 token 可以访问后端。

谁能帮帮我?

最佳答案

你有很多问题。我试着回答其中的一些

io.jsonwebtoken.PrematureJwtException: JWT must not be accepted before 2016-06-14T10:20:09+0300. Current time: 2016-06-14T10:19:37+0300´

您正在 JWT 中使用 nbf(不是之前)属性。不要使用它(它是可选的)或设置一个有效范围,因为设备的时钟将不同步

来自 RFC 7519

The "nbf" (not before) claim identifies the time before which the JWT MUST NOT be accepted for processing. The processing of the "nbf" claim requires that the current date/time MUST be after or equal to the not-before date/time listed in the "nbf" claim. Implementers MAY provide for some small leeway, usually no more than a few minutes, to account for clock skew. Its value MUST be a number containing a NumericDate value. Use of this claim is OPTIONAL.

签署 JWS

Exception: io.jsonwebtoken.UnsupportedJwtException: Signed JWSs are not supported

您想在客户端或服务器端验证签名 key 吗?如果您使用 JWT 代替用户和密码进行身份验证,并且您在每个请求中发送 token ,您可以在服务器端验证签名。

如果要在应用程序上验证 key ,请不要使用对称 key ,因为如果落入坏人之手,它可能会成为一个很大的漏洞。 See .您可以使用和非对称 key 对。使用私钥在服务器中签署 JWT,并使用公钥在设备上进行验证。

  1. I don't have the library import javax.xml.bind.DatatypeConverter
String base64 = Base64.encodeToString(data, Base64.DEFAULT);
byte[] data = Base64.decode(base64, Base64.DEFAULT);
  1. I don't know how to get the key.

您的 key 可能是通过这种方式在服务器端生成的

 Key key = MacProvider.generateKey(SignatureAlgorithm.HS256);
byte data[] = key.getEncoded();

以您喜欢的方式向客户端提供 key data[]。使用非对称 key ,您只需提供公钥。

 KeyPair keyPair = RsaProvider.generateKeyPair();
byte data[] = keyPair.getPublic().getEncoded();

关于java - 如何在 Android 上从 JWT 收集签名、 header 和正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com