Существует ли реализация www www wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww После публикации этого вопроса я искал в Интернете и нашел несколько входов в JWT. Любое предложение было бы действительно оценено.
Play Framework & JSON Web Token
Ответ 1
Я использую Nimbus-JOSE-JWT в spray.io, и я очень доволен этим. Объект, выполняющий аутентификацию, расширяет HttpAuthenticator и, если он находит правильный JWT, он возвращает объект токена и связанную с ним информацию, иначе None (аутентификация завершается с ошибкой). С Play2 вы можете реализовать HTTP Basic Auth с чем-то следующим образом. Что касается установки маркера/получения, которую я предполагаю, вас больше интересует:
Сначала создайте пару private/public key (я использовал части этот код). Создайте объект аутентификации, который загружает ключи при инициализации из файловой системы.
Создайте файл 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)
и до тех пор, пока он не выкинет ParseException
, вы вызываете verify
в JWSObject, возвращаемый parse
, используя в качестве аргумента MACVerifier
, который вы созданный ранее. Если verify
возвращает true
, вам нужно только вызвать getPayload.toString
в том же JWSObject, чтобы получить подтвержденную полезную нагрузку.
Чтобы расшифровать проверенную полезную нагрузку, которую вы вызываете 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
.
Наконец, что касается установки заголовка авторизации, я делаю это на своем клиенте AngularJS, используя принципы, упомянутые в этот пост.