Guest User

Untitled

a guest
Oct 17th, 2021
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. package com.console.api.webhook.example
  2. import com.nimbusds.jose.JOSEException
  3. import com.nimbusds.jose.JWSAlgorithm
  4. import com.nimbusds.jose.JWSHeader
  5. import com.nimbusds.jose.crypto.RSASSAVerifier
  6. import com.nimbusds.jose.util.Base64URL
  7. import org.junit.Assert.assertTrue
  8. import java.math.BigInteger
  9. import java.security.KeyFactory
  10. import java.security.interfaces.RSAPublicKey
  11. import java.security.spec.RSAPublicKeySpec
  12. import java.time.LocalDate
  13. import java.util.Base64
  14. class WebhookSignatureExample {
  15. companion object {
  16. @JvmStatic
  17. fun main(args: Array<String>) {
  18. // This is retrieved from the 'GET /webhook/v1/jwks' API operation
  19. val jwk = WebhookJSONWebKey(
  20. kty = "RSA",
  21. kid = LocalDate.of(2020, 3, 18),
  22. alg = "RSA256",
  23. n = "ANV-aocctqt5xDRnqomCgsO9dm4hM0Qd75TqG7z2G5Z89JQ7SRy2ok-fIJRiSU5-JfjPc3uph3gSOXyqlNoEh4YGL2R4AP7jhxy9xv0gDVtj1tExB_mmk8EUbmj8" +
  24. "hTIrfAgEJrDeB4qMk7MkkKxhHkhLNEJEPZfgYHcHcuKjp2l_vtpiuR9Ouz0febB9K4gLozrp9KHW2K-m0z02-tSurxmmij5nnJ-CEgp0wXcCS4w4G0jve4hcLlL9" +
  25. "FU8HKxrb0d4rMQgM3VAal6yG5pwMdtrsch7xA-occwWFC_tHgpDJGNvOJNFtuk7Cit_aom-6U6ssGF13sUtdrog2ePWjVxc=",
  26. e = "AQAB"
  27. )
  28. // These come from the webhook HTTP request
  29. val signatureHeader = "1IJl6VyKU4pYfqMHUd55QBNq5Etbz5a7DOCkID2Nloay76y4f02w2iMXONlyL/Bx9SkrbivOHW1l1XadkUrd5pKUK1fhpcnItukLrsK5ADQOcu" +
  30. "EjSLBg9qJffZYooXfc7hOD/fV0sN33W2vBYJspbR3P766DwG/6IO/20f9t/DcSWa79EFZPMnsCicEArNS3iIYBtdZSX5ta5EETt7S8acHbpIlSDrTcYpo0vuz19LQ6SP" +
  31. "QqN2LGdR+U7ZOiUQWdfMXhUgE7w94pHQzcOq1IHfw3CylUEcRR/DhrGqs4mBaagO6JpWzeqE1uTAiN579kOtSSqjblTb2AXALTQ3+TtA=="
  32. val requestBody = """{"eventId":"569886904","officeId":"132917981","eventType":"INTEGRATION_DEACTIVATED","event":{"integration":{"status":"INACTIVE","webhookId":"2bc47eed-08a0-4d18-a5c0-b7f18ab802e3","officeId":"132917981","createdDateTime":"2020-03-17T23:39:41.804Z","lastUpdatedDateTime":"2020-03-17T23:39:41.804Z"}},"createdDateTime":"2020-03-17T23:39:41.806Z"}"""
  33. /*
  34. * Signature verification
  35. */
  36. val keySpec = RSAPublicKeySpec(
  37. BigInteger(Base64.getUrlDecoder().decode(jwk.n)),
  38. BigInteger(Base64.getUrlDecoder().decode(jwk.e))
  39. )
  40. val rsaPublicKey = KeyFactory.getInstance(jwk.kty).generatePublic(keySpec) as RSAPublicKey
  41. val rsaVerifier = RSASSAVerifier(rsaPublicKey)
  42. try {
  43. assertTrue(
  44. "Invalid Signature",
  45. rsaVerifier.verify(
  46. JWSHeader(JWSAlgorithm.RS256),
  47. requestBody.toByteArray(),
  48. Base64URL(signatureHeader)
  49. )
  50. )
  51. println("Signature is valid")
  52. } catch (e: JOSEException) {
  53. println("Invalid signature: $e")
  54. }
  55. }
  56. }
  57. private data class WebhookJSONWebKey(
  58. val kty: String? = null,
  59. val kid: LocalDate? = null,
  60. val alg: String? = null,
  61. val n: String? = null,
  62. val e: String? = null
  63. )
  64. }
Add Comment
Please, Sign In to add comment