Kotlinã§å ¬ééµæå·æ¹å¼ã®éµãæ±ãã¨ãã®åå¿é²ã¨ãJWTã®çæã¨ã
ç®ç
Kotlinã§JWTãçæãããã
å®éã¯Ktorã§ãµã¼ãã¼æ¸ãã¦JWTè¿ãå¦çãæ¸ãããã©ãããã¯å²æã
æºå
opensslã§ç§å¯éµã®çæã
$ openssl genrsa -out private.key 2048
Javaã®PKCS8EncodedKeySpecã§ç§å¯éµã®ã¤ã³ã¹ã¿ã³ã¹ãä½ãã®ã«ç§å¯éµã PKCS 8 å½¢å¼ã«ãã¦ããã
$ openssl pkcs8 -in private.key -topk8 -nocrypt -out private.key.pk8
å ¬ééµã¯ç¹å¥ãªãã¨ã¯ããä½æã
$ openssl rsa -in private.key -pubout -out public.key
éµãã©ããã£ã¦æ±ãã
éµãã¡ã¤ã«ããã®ã¾ã¾æ±ãã®ã¯æ£ç´é¢åãªã®ã§ãç°å¢å¤æ°ã«æ ¼ç´ãã¦æ±ãããã
ãã ããã¡ã¤ã«ã®å 容ããã®ã¾ã¾ç°å¢å¤æ°ã«å ¥ãããã¨ãã¦ãæ¹è¡ãå ¥ã£ã¦ããã®ã§ãã®ã¾ã¾æ±ãã®ã¯é¿ãããã
æ±ããªãããã§ã¯ãªããã©ãæ¹è¡ã³ã¼ãã®æ±ãã ã£ããDotenvã®ã¢ã¬ã³ã¬ã§ãããã®ãå«ãªã®ã§æ¹è¡ãªãã®æååã¨ãã¦æ±ããããã«ãã¦ãã¾ãã
- æ¹è¡ã³ã¼ããå«ãã æååãç°å¢å¤æ°ã§èªã¿è¾¼ãã¨ãã«åµã£ã話 · Konboi Note
- symfony/dotenvã§æ¹è¡æåãå«ãç°å¢å¤æ°ãè¨å®ãã | QUARTETCOM TECH BLOG
以ä¸ã®ãããªæãã§ã½ã¤ã¤ã£ã¨Base64ã¨ã³ã³ã¼ããã¡ãããã§ããããç°å¢å¤æ°ã ã£ãã.envã«è¨å®ããã
ããããéµã®ä¸èº«èªä½Base64ã¨ã³ã³ã¼ãããã¦ãã¦ãããªã§ã¼ã·ã«æãããã©ã½ã¬ã¯ã½ã¬ã
$ base64 -i private.key.pk8 $ base64 -i public.key
ä½ã£ãéµã使ã£ã¦JWTãçæãã
JWTã®çæã¯ä»¥ä¸ãå©ç¨ã
éµã®æååããããããã®KeySpecãã¤ããã¨ããã¯ããã®ã¾ã¾ä»¥ä¸ã®ããã°ãåèã«ããã
PemReader.readFirstSectionAndClose
ã使ããããããã«ä»¥ä¸ãå
¥ãã¦ãã¾ã£ã¦ããã®ã§ãæ°ã«ãªã人ã¯èªåã§æ¸ãã¦ãè¯ãã¨æãã
private val dotenv = dotenv { ignoreIfMissing = true } private val privateKeyString = Base64.getDecoder().decode(dotenv.get("RSA_PRIVATE_KEY")).decodeToString() private val publicKeyString = Base64.getDecoder().decode(dotenv.get("RSA_PUBLIC_KEY")).decodeToString() private val keyFactory: KeyFactory = KeyFactory.getInstance("RSA") private val privateKey = keyFactory.generatePrivate(privateKeyString.fromPKCS8toKeySpec()) as RSAPrivateKey private val publicKey = keyFactory.generatePublic(publicKeyString.fromX509toKeySpec()) as RSAPublicKey private val algorithm: Algorithm = Algorithm.RSA256(publicKey, privateKey) fun create(contract: PostContract): String { return JWT.create() .withIssuer("hogehoge") .withExpiresAt(Date.from(ZonedDateTime.now(ZoneOffset.UTC).plusDays(1L).toInstant())) .withIssuedAt(Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant())) .sign(algorithm) } private fun String.fromPKCS8toKeySpec(): PKCS8EncodedKeySpec { return PKCS8EncodedKeySpec(PemReader.readFirstSectionAndClose(StringReader(this)).base64DecodedBytes) } private fun String.fromX509toKeySpec(): X509EncodedKeySpec { return X509EncodedKeySpec(PemReader.readFirstSectionAndClose(StringReader(this)).base64DecodedBytes) }