Подтвердить что ты не робот

Play Framework & JSON Web Token

Существует ли реализация www www wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww После публикации этого вопроса я искал в Интернете и нашел несколько входов в JWT. Любое предложение было бы действительно оценено.

4b9b3361

Ответ 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, используя принципы, упомянутые в этот пост.