Fork of the excellent esp8266-react - https://github.com/rjwats/esp8266-react
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.3 KiB

  1. #include "jwt/ArduinoJsonJWT.h"
  2. ArduinoJsonJWT::ArduinoJsonJWT(String psk) : _psk(psk) { }
  3. void ArduinoJsonJWT::setPSK(String psk){
  4. _psk = psk;
  5. }
  6. String ArduinoJsonJWT::encodeJWT(JsonObject payload) {
  7. // serialize payload
  8. String serializedPayload;
  9. serializeJson(payload, serializedPayload);
  10. // calculate length of string
  11. uint16_t encodedPayloadLength = encode_base64_length(serializedPayload.length());
  12. // create JWT char array
  13. char encodedJWT[BASE_JWT_LENGTH + encodedPayloadLength];
  14. unsigned char* ptr = (unsigned char*) encodedJWT;
  15. // 1 - add the header
  16. memcpy(ptr, JWT_HEADER, JWT_HEADER_LENGTH);
  17. ptr += JWT_HEADER_LENGTH;
  18. // 2 - add payload, trim and null terminate
  19. *ptr++ = '.';
  20. encode_base64((unsigned char*) serializedPayload.c_str(), serializedPayload.length(), ptr);
  21. ptr += encodedPayloadLength;
  22. while(*(ptr - 1) == '=') {
  23. ptr--;
  24. }
  25. *(ptr) = 0;
  26. // ... calculate ...
  27. Sha256.initHmac((const unsigned char*)_psk.c_str(), _psk.length());
  28. Sha256.print(encodedJWT);
  29. // 3 - add signature
  30. *ptr++ = '.';
  31. encode_base64(Sha256.resultHmac(), 32, ptr);
  32. ptr += SIGNATURE_LENGTH;
  33. while(*(ptr - 1) == '=') {
  34. ptr--;
  35. }
  36. *(ptr) = 0;
  37. Serial.println(BASE_JWT_LENGTH + encodedPayloadLength);
  38. return encodedJWT;
  39. }