DEV Community

Akeem Allen
Akeem Allen

Posted on

Quick Start for libjwt3

To whoever stumbles across this blog post after spending hours wondering how to pull a claim from JWT using this library...fear not.

Your journey has come to an end. You have found the promised land.

Jokes aside, I spent way too long combing through the docs of this library trying to figure this out. For a C newbie like me, LibJWT's docs aren't the easiest to parse.

But to any other C newbies out there, or anyone confused by the docs I hope this helps.

#include <jwt.h>

struct Payload {
  char * user_name;
};

char * create_jwt(struct Payload * payload) {
  jwt_builder_t * builder = jwt_builder_new();

  if (builder == NULL) {
    printf("Failed to create JWT builder\n");
    return NULL;
  }

  jwt_value_t user_name;
  jwt_set_SET_STR( & user_name, "user_name", payload -> user_name);

  jwt_builder_claim_set(builder, & user_name);

  char * token = jwt_builder_generate(builder);
  jwt_builder_free(builder);

  return token;
}

static int verify_callback(jwt_t * jwt, jwt_config_t * config) {
  struct Payload * payload = (struct Payload * ) config -> ctx;
  jwt_value_t jval;

  jwt_set_GET_STR( & jval, "user_name");
  if (jwt_claim_get(jwt, & jval) == JWT_VALUE_ERR_NONE && jval.str_val != NULL) {
    payload -> user_name = strdup(jval.str_val);
  }

  return 0;
}

struct Payload * verify_jwt(char * token) {
  jwt_t * jwt = NULL;
  jwt_checker_t * checker = jwt_checker_new();

  if (checker == NULL) {
    printf("Failed to create JWT checker\n");
    return NULL;
  }

  struct Payload * payload = malloc(sizeof(struct Payload));
  payload -> user_name = NULL;

  jwt_checker_setcb(checker, verify_callback, payload);

  int is_valid = jwt_checker_verify(checker, token);
  jwt_checker_free(checker);

  if (is_valid != 0) {
    printf("JWT verification failed!\n");
    free(payload -> user_name);
    free(payload -> avatar);
    free(payload);
    return NULL;
  }

  return payload;
}

int main() {
  struct Payload * payload = malloc(sizeof(struct Payload));
  payload -> user_name = "John Doe";
  char * token = create_jwt(payload);

  struct Payload * verified_payload = verify_jwt(token);
  printf("Username: %s\nAvatar: %s\n", verified_payload -> user_name, verified_payload -> avatar);
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)