scala – 播放框架和JSON Web令牌
有没有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客户端上执行此操作。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Angular 2:ngSwitch或ViewContainerRef.createComponent
- promise – 如何从angular2-modal返回结果,或者通常从ng2-c
- 如何访问eval’d命令的bash PIPESTATUS数组?
- 是否有针对utf-8的’字符串’命令?
- bash – 如何尽可能紧凑地确定最新的主要和完整内核版本字符
- 忽略vimrc中的“未知选项”错误
- bash-在运行之间存储变量的更好方法?
- SBT解析器在build.sbt中工作,不在Build.scala中工作
- typescript – angular2 wysiwyg tinymce实现和双向绑定
- 通过使用shell脚本替换文件名中的特定模式来重命名多个文件