Получите доступ к REST API с помощью токена безопасности JWT.

У меня есть ключ RSA в формате

<RSAKeyValue>
  <Modulus> ..</Modulus>
  <Exponent>..</Exponent>
 ... 
</RSAKeyValue>

Мне нужно подключиться к REST API, используя java. Я должен использовать токен безопасности JWT со схемой «TokenIssuer». Библиотека Nimbus предоставляет следующий пример для этого. Поможет ли мне это или мне нужно что-то еще? Если да, то где я должен написать ключ RSA?

// RSA signatures require a public and private RSA key pair,
// the public key must be made known to the JWS recipient in
// order to verify the signatures
KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA");
keyGenerator.initialize(1024);

KeyPair kp = keyGenerator.genKeyPair();
RSAPublicKey publicKey = (RSAPublicKey)kp.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey)kp.getPrivate();

// Create RSA-signer with the private key
JWSSigner signer = new RSASSASigner(privateKey);

// Prepare JWT with claims set
JWTClaimsSet claimsSet = new JWTClaimsSet();
claimsSet.setSubject("alice");
claimsSet.setIssueTime(new Date());
claimsSet.setIssuer("https://c2id.com");

SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claimsSet);

// Compute the RSA signature
signedJWT.sign(signer);

// To serialize to compact form, produces something like
// eyJhbGciOiJSUzI1NiJ9.SW4gUlNBIHdlIHRydXN0IQ.IRMQENi4nJyp4er2L
// mZq3ivwoAjqa1uUkSBKFIX7ATndFF5ivnt-m8uApHO4kfIFOrW7w2Ezmlg3Qd
// maXlS9DhN0nUk_hGI3amEjkKd0BWYCB8vfUbUv0XGjQip78AI4z1PrFRNidm7
// -jPDm5Iq0SZnjKjCNS5Q15fokXZc8u0A
String s = signedJWT.serialize();

// To parse the JWS and verify it, e.g. on client-side
signedJWT = SignedJWT.parse(s);

JWSVerifier verifier = new RSASSAVerifier(publicKey);
assertTrue(signedJWT.verify(verifier));

// Retrieve the JWT claims
assertEquals("alice", signedJWT.getJWTClaimsSet().getSubject());

person Inna    schedule 05.03.2015    source источник


Ответы (1)


С моей точки зрения, если вы хотите использовать RSA, я предлагаю использовать вложенный подписанный и зашифрованный JWT. Таким образом, сервер может подписать JWT с помощью открытого ключа, а затем клиент может расшифровать JWT с помощью закрытого ключа и проверить этот JWT. С точки зрения хранения ключей, вы можете хранить их в файловой системе, предоставить какое-либо свойство конфигурации, указывающее на этот файл, или, поскольку это открытый ключ, вы можете получить этот ключ из некоторых служб или запросить его из клиент. Тот же подход вы можете использовать для хранения закрытых ключей на стороне клиента.

Но я думаю, что для большинства сценариев допустимо использовать вложенный подписанный и зашифрованный JWT с простой защитой HMAC. Потому что клиент запросит аутентификацию, и он отправит полученный токен на сервер, а сервер выполнит проверку токена JWT. Вы можете посмотреть пример Nimbus http://connect2id.com/products/nimbus-jose-jwt/examples/signed-and-encrypted-jwt

person d-sauer    schedule 19.03.2015
comment
Спасибо за объяснение. Я уже сделал это, используя эту ссылку connect2id. com/products/nimbus-jose-jwt/examples/ TokenIssuer — это просто имя параметра iss в заголовке. Кстати, я быстро понял, что нужно указать в заголовке и теле, когда веб-сервис предоставил мне пример токена JWT. Все, что мне нужно, это расшифровать его. - person Inna; 19.03.2015