加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 播放框架和JSON Web令牌

发布时间:2020-12-16 09:38:50 所属栏目:安全 来源:网络整理
导读:有没有Scala实现JWT或至少一个Play的例子?发布 this question后,我在互联网上进一步搜索,并向JWT发现了一些介绍。任何建议将非常感激。 解决方法 我在 spray.io应用程序中使用 Nimbus-JOSE-JWT,我很高兴。执行身份验证的对象扩展HttpAuthenticator,如果
有没有Scala实现JWT或至少一个Play的例子?发布 this question后,我在互联网上进一步搜索,并向JWT发现了一些介绍。任何建议将非常感激。

解决方法

我在 spray.io应用程序中使用 Nimbus-JOSE-JWT,我很高兴。执行身份验证的对象扩展HttpAuthenticator,如果找到正确的JWT,则返回令牌主题和相关信息,否则无(认证失败)。使用Play2,您可以使用某些 like this实现HTTP基本身份验证。关于令牌设置/获取我认为对您更感兴趣:

首先,创建私钥/公钥对(我使用this code的部分)。创建从文件系统初始化时加载密钥的身份验证对象。

使用这些键创建一个com.nimbusds.jose.crypto.MACSigner和一个com.nimbusds.jose.crypto.MACVerifier。

每当你想设置一个键,FIRST加密它,然后签名。加密:

private def encrypt(subject: String) = {
   val header = new JWEHeader(JWEAlgorithm.RSA_OAEP,EncryptionMethod.A128GCM)
   val jwt = new EncryptedJWT(header,claimSet(subject))
   val encrypter = new RSAEncrypter(publicKey.asInstanceOf[java.security.interfaces.RSAPublicKey])
   jwt.encrypt(encrypter)
   jwt.serialize()
}

ClaimSet方法可预测地返回一组声明:

def claimSet(subject: String) = {
   val jwtClaims = new JWTClaimsSet()
   jwtClaims.setIssuer(Config.JWT.issuer)
   jwtClaims.setSubject(subject)
   jwtClaims.setJWTID(java.util.UUID.randomUUID().toString())
   jwtClaims
}

publicKey属性是从KeyFactory.getInstance(“RSA”)返回的值generatePublic。

签名:

private def sign(jwt: String) = {
   val jwsObject = new JWSObject(new JWSHeader(JWSAlgorithm.HS256),new Payload(jwt))
   jwsObject.sign(Tokens.signer)
   jwsObject.serialize
}

鉴于上述,当您收到密钥时,您需要首先验证签名,然后解密。为了验证,首先尝试使用com.nimbusds.jose.JWSObject.parse(my_token)解析它,只要它不会在解析返回的JWSObject上抛出一个调用验证的ParseException,使用MACVerifier作为参数你之前创建如果verify返回true,那么您只需要在同一个JWSObject上调用getPayload.toString来获取已验证的有效负载。

要解密验证的有效载荷,您可以在其上调用com.nimbusds.jwt.EncryptedJWT.parse,然后如下所示:

val decrypter = new RSADecrypter(privateKey.asInstanceOf[java.security.interfaces.RSAPrivateKey])
jwt.decrypt(decrypter)

privateKey是从KeyFactory.getInstance(“RSA”)返回的值generatePrivate。

然后,您可以使用jwt.getJWTClaimsSet获取声明集。

最后,关于设置授权标题,我使用this post中也提到的原则在我的AngularJS客户端上执行此操作。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读