Создание токена JWT в Android — без использования стороннего инструментаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Создание токена JWT в Android — без использования стороннего инструмента

Сообщение Anonymous »

Я пытался создать токен JWT в Android без использования какой-либо сторонней библиотеки.
Подпись генерируется, но сгенерированная подпись недействительна.
Моя личная информация находится ниже р>

Код: Выделить всё

-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PRIVATE KEY-----
Мне нужно создать токен jwt с помощью алгоритма ES384.
Ниже приведен мой исходный код

Код: Выделить всё

class JWT1 {

fun generateJWT(privateKeyString: String, header: JSONObject, payload: JSONObject): String {
// Encode the header and payload to Base64
val headerBase64 = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(header.toString().toByteArray(Charsets.UTF_8))
val payloadBase64 = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(payload.toString().toByteArray(Charsets.UTF_8))

// Create the unsigned token
val unsignedToken = "$headerBase64.$payloadBase64"

// Sign the token
val signedToken = signWithPrivateKey(unsignedToken, privateKeyString)

// Encode the signature in Base64
val signatureBase64 = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(signedToken)

// Return the complete JWT
return "$unsignedToken.$signatureBase64"
}

private fun signWithPrivateKey(unsignedToken: String, privateKeyString: String): ByteArray {
// Convert the private key string to a PrivateKey object
val keyFactory = KeyFactory.getInstance("EC")

val keyBytes = java.util.Base64.getDecoder().decode(privateKeyString)
val keySpec = PKCS8EncodedKeySpec(keyBytes)
val privateKey = keyFactory.generatePrivate(keySpec) as ECPrivateKey

// Sign the token
val signature = Signature.getInstance("SHA384withECDSA")
signature.initSign(privateKey)
signature.update(unsignedToken.toByteArray(Charsets.UTF_8))
return signature.sign()
}

fun getToken(): String {
// private key
val privatePem = "-----BEGIN PRIVATE KEY-----\n" +
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" +
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" +
"xxxxxxxxxxxxxxxxxxxxxxxx\n" +
"xxxxxxxxxxxxxxxxxxxxxxxxxxxx=\n" +
"-----END PRIVATE KEY-----"

val header = JSONObject().apply {
put("alg", "ES384")
put("typ", "JWT")
}
val privateKeyString = privatePem.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "").replace("\n", "")
return generateJWT(privateKeyString, header, JSONObject(payload))
}

private val payload: Map
get() {
return mapOf(
"data" to "hello"
)
}
}
Мне нужна собственная реализация на базе Android без использования сторонних библиотек.

Подробнее здесь: https://stackoverflow.com/questions/790 ... party-tool
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»