Iddawc
Handle the flow of OAuth2 and OpenID Connect authentication process from the client side.
iddawc.h
Go to the documentation of this file.
1 
24 #ifndef __IDDAWC_H
25 #define __IDDAWC_H
26 
27 #ifdef __cplusplus
28 extern "C"
29 {
30 #endif
31 
32 #include <jansson.h>
33 #include <orcania.h>
34 #include <ulfius.h>
35 #include <rhonabwy.h>
36 #include "iddawc-cfg.h"
37 
44 #define I_OK 0
45 #define I_ERROR 1
46 #define I_ERROR_PARAM 2
47 #define I_ERROR_MEMORY 3
48 #define I_ERROR_UNAUTHORIZED 4
49 #define I_ERROR_SERVER 5
50 
51 #define I_RESPONSE_TYPE_NONE 0x00000000
52 #define I_RESPONSE_TYPE_CODE 0x00000001
53 #define I_RESPONSE_TYPE_TOKEN 0x00000010
54 #define I_RESPONSE_TYPE_ID_TOKEN 0x00000100
55 #define I_RESPONSE_TYPE_PASSWORD 0x00001000
56 #define I_RESPONSE_TYPE_CLIENT_CREDENTIALS 0x00010000
57 #define I_RESPONSE_TYPE_REFRESH_TOKEN 0x00100000
58 
59 #define I_AUTH_METHOD_GET 0x00000001
60 #define I_AUTH_METHOD_POST 0x00000010
61 #define I_AUTH_METHOD_JWT_SIGN_SECRET 0x00000100
62 #define I_AUTH_METHOD_JWT_SIGN_PRIVKEY 0x00001000
63 #define I_AUTH_METHOD_JWT_ENCRYPT_SECRET 0x00010000
64 #define I_AUTH_METHOD_JWT_ENCRYPT_PUBKEY 0x00100000
65 
66 #define I_TOKEN_AUTH_METHOD_SECRET_BASIC 0
67 #define I_TOKEN_AUTH_METHOD_SECRET_POST 1
68 #define I_TOKEN_AUTH_METHOD_SECRET_JWT 2
69 #define I_TOKEN_AUTH_METHOD_PRIVATE_JWT 3
70 #define I_TOKEN_AUTH_METHOD_NONE 4
71 
72 #define I_STRICT_NO 0
73 #define I_STRICT_YES 1
74 
75 #define I_AUTH_SIGN_ALG_MAX_LENGTH 8
76 
77 #define I_BEARER_TYPE_HEADER 0
78 #define I_BEARER_TYPE_BODY 1
79 #define I_BEARER_TYPE_URL 2
80 
81 #define I_HEADER_PREFIX_BEARER "Bearer "
82 #define I_HEADER_AUTHORIZATION "Authorization"
83 #define I_BODY_URL_PARAMETER "access_token"
84 #define I_HEADER_DPOP "DPoP"
85 
90 typedef enum {
91  I_OPT_NONE = 0,
110  I_OPT_ERROR = 19,
113  I_OPT_CODE = 22,
143 
154 struct _i_session {
156  char * scope;
157  char * state;
158  char * nonce;
159  char * redirect_uri;
160  char * redirect_to;
161  char * client_id;
163  char * username;
165  struct _u_map additional_parameters;
166  struct _u_map additional_response;
174  uint result;
175  char * error;
177  char * error_uri;
178  char * code;
180  char * access_token;
181  char * token_target;
183  char * token_type;
185  time_t expires_at;
186  char * id_token;
190  jwks_t * server_jwks;
191  char * server_kid;
192  jwks_t * client_jwks;
193  char * client_kid;
195  jwa_alg client_enc_alg;
196  jwa_enc client_enc;
198  json_t * openid_config;
200  char * issuer;
201  char * userinfo;
202  json_t * j_userinfo;
203  char * token_jti;
204  uint token_exp;
205 };
206 
223 int i_global_init();
224 
228 void i_global_close();
229 
235 void i_free(void * data);
236 
242 int i_init_session(struct _i_session * i_session);
243 
248 void i_clean_session(struct _i_session * i_session);
249 
272 int i_set_response_type(struct _i_session * i_session, uint i_value);
273 
282 int i_set_result(struct _i_session * i_session, uint i_value);
283 
293 int i_set_int_parameter(struct _i_session * i_session, i_option option, uint i_value);
294 
310 int i_set_str_parameter(struct _i_session * i_session, i_option option, const char * s_value);
311 
319 int i_set_additional_parameter(struct _i_session * i_session, const char * s_key, const char * s_value);
320 
328 int i_set_additional_response(struct _i_session * i_session, const char * s_key, const char * s_value);
329 
341 uint i_get_response_type(struct _i_session * i_session);
342 
348 uint i_get_result(struct _i_session * i_session);
349 
358 uint i_get_int_parameter(struct _i_session * i_session, i_option option);
359 
374 const char * i_get_str_parameter(struct _i_session * i_session, i_option option);
375 
382 const char * i_get_additional_parameter(struct _i_session * i_session, const char * s_key);
383 
390 const char * i_get_additional_response(struct _i_session * i_session, const char * s_key);
391 
405 int i_set_parameter_list(struct _i_session * i_session, ...);
406 
412 json_t * i_export_session_json_t(struct _i_session * i_session);
413 
421 int i_import_session_json_t(struct _i_session * i_session, json_t * j_import);
422 
428 char * i_export_session_str(struct _i_session * i_session);
429 
437 int i_import_session_str(struct _i_session * i_session, const char * str_import);
438 
454 int i_load_openid_config(struct _i_session * i_session);
455 
462 int i_build_auth_url_get(struct _i_session * i_session);
463 
470 int i_run_auth_request(struct _i_session * i_session);
471 
479 int i_parse_redirect_to(struct _i_session * i_session);
480 
487 int i_run_token_request(struct _i_session * i_session);
488 
494 int i_verify_id_token(struct _i_session * i_session);
495 
505 int i_load_userinfo(struct _i_session * i_session);
506 
520 int i_load_userinfo_custom(struct _i_session * i_session, const char * http_method, struct _u_map * additional_query, struct _u_map * additional_headers);
521 
530 int i_introspect_token(struct _i_session * i_session, json_t ** j_result);
531 
538 int i_revoke_token(struct _i_session * i_session);
539 
551 int i_register_client(struct _i_session * i_session, json_t * j_parameters, int update_session, json_t ** j_result);
552 
562 char * i_generate_dpop_token(struct _i_session * i_session, const char * htm, const char * htu, time_t iat);
563 
580 int i_perform_api_request(struct _i_session * i_session, struct _u_request * http_request, struct _u_response * http_response, int refresh_if_expired, int bearer_type, int use_dpop, time_t dpop_iat);
581 
586 #ifdef __cplusplus
587 }
588 #endif
589 
590 #endif // __IDDAWC_H_
i_load_userinfo
int i_load_userinfo(struct _i_session *i_session)
Definition: iddawc.c:1565
I_OPT_INTROSPECTION_ENDPOINT
@ I_OPT_INTROSPECTION_ENDPOINT
absolute url for the introspection endpoint, string
Definition: iddawc.h:140
i_import_session_json_t
int i_import_session_json_t(struct _i_session *i_session, json_t *j_import)
Definition: iddawc.c:2725
I_OPT_SCOPE_APPEND
@ I_OPT_SCOPE_APPEND
append another scope value to the scope list, string
Definition: iddawc.h:94
_i_session::revocation_endpoint
char * revocation_endpoint
Definition: iddawc.h:171
i_get_result
uint i_get_result(struct _i_session *i_session)
Definition: iddawc.c:1697
i_parse_redirect_to
int i_parse_redirect_to(struct _i_session *i_session)
Definition: iddawc.c:1739
_i_session::token_exp
uint token_exp
Definition: iddawc.h:204
_i_session::additional_response
struct _u_map additional_response
Definition: iddawc.h:166
I_OPT_USER_PASSWORD
@ I_OPT_USER_PASSWORD
password for password response_types, string
Definition: iddawc.h:123
I_OPT_ERROR
@ I_OPT_ERROR
error value of a failed request, string
Definition: iddawc.h:110
i_global_init
int i_global_init()
Definition: iddawc.c:838
i_build_auth_url_get
int i_build_auth_url_get(struct _i_session *i_session)
Definition: iddawc.c:1941
I_OPT_USERNAME
@ I_OPT_USERNAME
username for password response_types, string
Definition: iddawc.h:122
_i_session::user_password
char * user_password
Definition: iddawc.h:164
I_OPT_REFRESH_TOKEN
@ I_OPT_REFRESH_TOKEN
refresh token given after a succesfull token request using the proper response_type
Definition: iddawc.h:114
I_OPT_AUTH_METHOD
@ I_OPT_AUTH_METHOD
Authentication method to use with the auth endpoint, values available are I_AUTH_METHOD_GET,...
Definition: iddawc.h:117
_i_session
Definition: iddawc.h:154
I_OPT_SCOPE
@ I_OPT_SCOPE
scope values, string, multiple scopes must be separated by a space character: "scope1 openid"
Definition: iddawc.h:93
_i_session::client_enc
jwa_enc client_enc
Definition: iddawc.h:196
I_OPT_TOKEN_METHOD
@ I_OPT_TOKEN_METHOD
Authentication method to use with the token endpoint, values available are I_TOKEN_AUTH_METHOD_SECRET...
Definition: iddawc.h:118
I_OPT_NONCE_GENERATE
@ I_OPT_NONCE_GENERATE
generate a random nonce value
Definition: iddawc.h:126
_i_session::error_uri
char * error_uri
Definition: iddawc.h:177
_i_session::redirect_uri
char * redirect_uri
Definition: iddawc.h:159
_i_session::registration_endpoint
char * registration_endpoint
Definition: iddawc.h:173
i_global_close
void i_global_close()
Definition: iddawc.c:847
I_OPT_TOKEN_ENDPOINT
@ I_OPT_TOKEN_ENDPOINT
absolute url for the token endpoint, string
Definition: iddawc.h:104
i_introspect_token
int i_introspect_token(struct _i_session *i_session, json_t **j_result)
Definition: iddawc.c:2542
_i_session::expires_at
time_t expires_at
Definition: iddawc.h:185
_i_session::scope
char * scope
Definition: iddawc.h:156
_i_session::response_type
uint response_type
Definition: iddawc.h:155
_i_session::openid_config
json_t * openid_config
Definition: iddawc.h:198
I_OPT_ERROR_URI
@ I_OPT_ERROR_URI
error uri of a failed request, string
Definition: iddawc.h:112
i_generate_dpop_token
char * i_generate_dpop_token(struct _i_session *i_session, const char *htm, const char *htu, time_t iat)
Definition: iddawc.c:2837
I_OPT_ADDITIONAL_RESPONSE
@ I_OPT_ADDITIONAL_RESPONSE
Definition: iddawc.h:102
I_OPT_NONCE
@ I_OPT_NONCE
nonce value, string
Definition: iddawc.h:96
i_verify_id_token
int i_verify_id_token(struct _i_session *i_session)
Definition: iddawc.c:2347
_i_session::token_endpoint
char * token_endpoint
Definition: iddawc.h:168
_i_session::openid_config_endpoint
char * openid_config_endpoint
Definition: iddawc.h:169
I_OPT_EXPIRES_AT
@ I_OPT_EXPIRES_AT
expires_at value after a succesfull auth or token request, time_t
Definition: iddawc.h:121
_i_session::redirect_to
char * redirect_to
Definition: iddawc.h:160
i_export_session_json_t
json_t * i_export_session_json_t(struct _i_session *i_session)
Definition: iddawc.c:2660
I_OPT_ADDITIONAL_PARAMETER
@ I_OPT_ADDITIONAL_PARAMETER
use this option to pass any additional parameter value in the /auth request
Definition: iddawc.h:101
_i_session::authorization_endpoint
char * authorization_endpoint
Definition: iddawc.h:167
_i_session::openid_config_strict
int openid_config_strict
Definition: iddawc.h:199
_i_session::username
char * username
Definition: iddawc.h:163
_i_session::client_jwks
jwks_t * client_jwks
Definition: iddawc.h:192
I_OPT_USERINFO_ENDPOINT
@ I_OPT_USERINFO_ENDPOINT
absolute url for the userinfo endpoint or equivalent, string
Definition: iddawc.h:108
i_get_int_parameter
uint i_get_int_parameter(struct _i_session *i_session, i_option option)
Definition: iddawc.c:1701
I_OPT_CODE
@ I_OPT_CODE
code given after a succesfull auth request using the response_type I_RESPONSE_TYPE_CODE
Definition: iddawc.h:113
I_OPT_TOKEN_TARGET
@ I_OPT_TOKEN_TARGET
access_token which is the target of a revocation or an introspection, string
Definition: iddawc.h:137
i_free
void i_free(void *data)
Definition: iddawc.c:852
_i_session::userinfo
char * userinfo
Definition: iddawc.h:201
i_register_client
int i_register_client(struct _i_session *i_session, json_t *j_parameters, int update_session, json_t **j_result)
Definition: iddawc.c:2599
I_OPT_OPENID_CONFIG
@ I_OPT_OPENID_CONFIG
result of the .well-known/openid-configuration
Definition: iddawc.h:106
I_OPT_ERROR_DESCRIPTION
@ I_OPT_ERROR_DESCRIPTION
error description of a failed request, string
Definition: iddawc.h:111
I_OPT_CLIENT_ENC_ALG
@ I_OPT_CLIENT_ENC_ALG
key encryption algorithm to use when the client encrypts a request in a JWT, values available are 'RS...
Definition: iddawc.h:132
i_set_str_parameter
int i_set_str_parameter(struct _i_session *i_session, i_option option, const char *s_value)
Definition: iddawc.c:1099
i_clean_session
void i_clean_session(struct _i_session *i_session)
Definition: iddawc.c:936
i_run_auth_request
int i_run_auth_request(struct _i_session *i_session)
Definition: iddawc.c:2023
i_get_response_type
uint i_get_response_type(struct _i_session *i_session)
Definition: iddawc.c:1693
_i_session::client_kid
char * client_kid
Definition: iddawc.h:193
_i_session::refresh_token
char * refresh_token
Definition: iddawc.h:179
_i_session::userinfo_endpoint
char * userinfo_endpoint
Definition: iddawc.h:170
_i_session::client_sign_alg
jwa_alg client_sign_alg
Definition: iddawc.h:194
_i_session::issuer
char * issuer
Definition: iddawc.h:200
i_get_additional_parameter
const char * i_get_additional_parameter(struct _i_session *i_session, const char *s_key)
Definition: iddawc.c:1925
_i_session::id_token
char * id_token
Definition: iddawc.h:186
i_set_response_type
int i_set_response_type(struct _i_session *i_session, uint i_value)
Definition: iddawc.c:979
_i_session::error_description
char * error_description
Definition: iddawc.h:176
_i_session::client_secret
char * client_secret
Definition: iddawc.h:162
I_OPT_STATE_GENERATE
@ I_OPT_STATE_GENERATE
generate a random state value
Definition: iddawc.h:127
i_run_token_request
int i_run_token_request(struct _i_session *i_session)
Definition: iddawc.c:2127
_i_session::token_target_type_hint
char * token_target_type_hint
Definition: iddawc.h:182
I_OPT_RESPONSE_TYPE
@ I_OPT_RESPONSE_TYPE
response_type, values available are I_RESPONSE_TYPE_CODE, I_RESPONSE_TYPE_TOKEN, I_RESPONSE_TYPE_ID_T...
Definition: iddawc.h:92
i_load_userinfo_custom
int i_load_userinfo_custom(struct _i_session *i_session, const char *http_method, struct _u_map *additional_query, struct _u_map *additional_headers)
Definition: iddawc.c:1577
i_revoke_token
int i_revoke_token(struct _i_session *i_session)
Definition: iddawc.c:2487
I_OPT_REDIRECT_TO
@ I_OPT_REDIRECT_TO
url where the oauth2 is redirected to after a /auth request
Definition: iddawc.h:98
_i_session::token_type
char * token_type
Definition: iddawc.h:183
I_OPT_REGISTRATION_ENDPOINT
@ I_OPT_REGISTRATION_ENDPOINT
absolute url for the client registration endpoint, string
Definition: iddawc.h:141
I_OPT_EXPIRES_IN
@ I_OPT_EXPIRES_IN
expires_in value after a succesfull auth or token request, integer
Definition: iddawc.h:120
_i_session::x5u_flags
int x5u_flags
Definition: iddawc.h:197
I_OPT_SERVER_KID
@ I_OPT_SERVER_KID
key id to use if multiple jwk are available on the server, string
Definition: iddawc.h:129
i_set_additional_parameter
int i_set_additional_parameter(struct _i_session *i_session, const char *s_key, const char *s_value)
Definition: iddawc.c:1413
_i_session::j_userinfo
json_t * j_userinfo
Definition: iddawc.h:202
I_OPT_CLIENT_SECRET
@ I_OPT_CLIENT_SECRET
client secret, string
Definition: iddawc.h:100
_i_session::error
char * error
Definition: iddawc.h:175
_i_session::result
uint result
Definition: iddawc.h:174
I_OPT_CLIENT_KID
@ I_OPT_CLIENT_KID
key id to use if multiple jwk are available on the client, string
Definition: iddawc.h:130
i_option
i_option
Definition: iddawc.h:90
I_OPT_STATE
@ I_OPT_STATE
state value, string
Definition: iddawc.h:95
i_init_session
int i_init_session(struct _i_session *i_session)
Definition: iddawc.c:856
_i_session::expires_in
uint expires_in
Definition: iddawc.h:184
I_OPT_OPENID_CONFIG_ENDPOINT
@ I_OPT_OPENID_CONFIG_ENDPOINT
absolute url for the .well-known/openid-configuration endpoint, string
Definition: iddawc.h:105
_i_session::server_kid
char * server_kid
Definition: iddawc.h:191
i_get_additional_response
const char * i_get_additional_response(struct _i_session *i_session, const char *s_key)
Definition: iddawc.c:1933
I_OPT_X5U_FLAGS
@ I_OPT_X5U_FLAGS
x5u flage to apply when JWK used have a x5u property, values available are R_FLAG_IGNORE_SERVER_CERTI...
Definition: iddawc.h:128
_i_session::nonce
char * nonce
Definition: iddawc.h:158
i_get_str_parameter
const char * i_get_str_parameter(struct _i_session *i_session, i_option option)
Definition: iddawc.c:1811
i_load_openid_config
int i_load_openid_config(struct _i_session *i_session)
Definition: iddawc.c:1524
I_OPT_CLIENT_SIGN_ALG
@ I_OPT_CLIENT_SIGN_ALG
signature algorithm to use when the client signs a request in a JWT, values available are 'none',...
Definition: iddawc.h:131
I_OPT_USERINFO
@ I_OPT_USERINFO
userinfo result, string
Definition: iddawc.h:125
I_OPT_CLIENT_ENC
@ I_OPT_CLIENT_ENC
data encryption algorithm to use when the client encrypts a request in a JWT, values available are 'A...
Definition: iddawc.h:133
_i_session::additional_parameters
struct _u_map additional_parameters
Definition: iddawc.h:165
I_OPT_REVOCATION_ENDPOINT
@ I_OPT_REVOCATION_ENDPOINT
absolute url for the revocation endpoint, string
Definition: iddawc.h:139
_i_session::client_enc_alg
jwa_alg client_enc_alg
Definition: iddawc.h:195
I_OPT_TOKEN_JTI_GENERATE
@ I_OPT_TOKEN_JTI_GENERATE
generate a random jti value
Definition: iddawc.h:135
I_OPT_TOKEN_EXP
@ I_OPT_TOKEN_EXP
JWT token request expiration time in seconds.
Definition: iddawc.h:136
i_set_additional_response
int i_set_additional_response(struct _i_session *i_session, const char *s_key, const char *s_value)
Definition: iddawc.c:1425
I_OPT_NONE
@ I_OPT_NONE
Empty option to complete a i_set_parameter_list.
Definition: iddawc.h:91
I_OPT_ISSUER
@ I_OPT_ISSUER
issuer value, string
Definition: iddawc.h:124
I_OPT_TOKEN_TYPE
@ I_OPT_TOKEN_TYPE
token_type value after a succesfull auth or token request, string
Definition: iddawc.h:119
I_OPT_AUTH_ENDPOINT
@ I_OPT_AUTH_ENDPOINT
absolute url for the auth endpoint, string
Definition: iddawc.h:103
I_OPT_ACCESS_TOKEN
@ I_OPT_ACCESS_TOKEN
access token given after a succesfull auth or token request using the proper response_type
Definition: iddawc.h:115
_i_session::token_method
uint token_method
Definition: iddawc.h:189
_i_session::introspection_endpoint
char * introspection_endpoint
Definition: iddawc.h:172
_i_session::code
char * code
Definition: iddawc.h:178
i_export_session_str
char * i_export_session_str(struct _i_session *i_session)
Definition: iddawc.c:2808
_i_session::state
char * state
Definition: iddawc.h:157
I_OPT_REDIRECT_URI
@ I_OPT_REDIRECT_URI
redirect_uri, string
Definition: iddawc.h:97
i_set_parameter_list
int i_set_parameter_list(struct _i_session *i_session,...)
Definition: iddawc.c:1437
i_import_session_str
int i_import_session_str(struct _i_session *i_session, const char *str_import)
Definition: iddawc.c:2819
_i_session::client_id
char * client_id
Definition: iddawc.h:161
i_perform_api_request
int i_perform_api_request(struct _i_session *i_session, struct _u_request *http_request, struct _u_response *http_response, int refresh_if_expired, int bearer_type, int use_dpop, time_t dpop_iat)
Definition: iddawc.c:2920
I_OPT_ID_TOKEN
@ I_OPT_ID_TOKEN
id_token given after a succesfull auth or token request using the proper response_type
Definition: iddawc.h:116
_i_session::id_token_payload
json_t * id_token_payload
Definition: iddawc.h:187
I_OPT_TOKEN_TARGET_TYPE_HINT
@ I_OPT_TOKEN_TARGET_TYPE_HINT
access_token which is the target of a revocation or an introspection, string
Definition: iddawc.h:138
I_OPT_RESULT
@ I_OPT_RESULT
result of a request
Definition: iddawc.h:109
I_OPT_OPENID_CONFIG_STRICT
@ I_OPT_OPENID_CONFIG_STRICT
must the .well-known/openid-configuration parameters be strictly
Definition: iddawc.h:107
_i_session::token_jti
char * token_jti
Definition: iddawc.h:203
_i_session::access_token
char * access_token
Definition: iddawc.h:180
_i_session::token_target
char * token_target
Definition: iddawc.h:181
i_set_int_parameter
int i_set_int_parameter(struct _i_session *i_session, i_option option, uint i_value)
Definition: iddawc.c:987
i_set_result
int i_set_result(struct _i_session *i_session, uint i_value)
Definition: iddawc.c:983
I_OPT_TOKEN_JTI
@ I_OPT_TOKEN_JTI
jti value, string
Definition: iddawc.h:134
I_OPT_CLIENT_ID
@ I_OPT_CLIENT_ID
client_id, string
Definition: iddawc.h:99
_i_session::server_jwks
jwks_t * server_jwks
Definition: iddawc.h:190
_i_session::auth_method
uint auth_method
Definition: iddawc.h:188