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);
}
Top comments (0)