62
Views
4
Comments
How to validate Access_Token generated from Okta
Question

I have exposed some rest api's so i want to use these api's by validating the Access_token generated from Okta.

curl --request POST \  --url https://dev-0ptyxhq7mieww3h2.us.auth0.com/oauth/token \  --header 'content-type: application/json' \  --data '{"client_id":"ZjXQzcrJROGXYyw3lzgEclsJun2T9f3q","client_secret":"dywjP23pVJf43Pa3nZPbtKvHCy-F84nEMPBblrE3-UsmaMebzSHr0EQjt4uObzlx","audience":"https://dev-0ptyxhq7mieww3h2.us.auth0.com/api/v2/","grant_type":"client_credentials"}' 

with above api I am getting the Access_Token in response from Okta.

Response:

{  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IkpoeDl6TXVUYW54OHVyWDhJYWNOZiJ9.eyJpc3MiOiJodHRwczovL2Rldi0wcHR5eGhxN21pZXd3M2gyLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJaalhRemNySlJPR1hZeXczbHpnRWNsc0p1bjJUOWYzcUBjbGllbnRzIiwiYXVkIjoiaHR0cHM6Ly9kZXYtMHB0eXhocTdtaWV3dzNoMi51cy5hdXRoMC5jb20vYXBpL3YyLyIsImlhdCI6MTcwNzc5ODQ4OSwiZXhwIjoxNzA3Nzk4NDk2LCJhenAiOiJaalhRemNySlJPR1hZeXczbHpnRWNsc0p1bjJUOWYzcSIsInNjb3BlIjoicmVhZDpjbGllbnRfZ3JhbnRzIGNyZWF0ZTpjbGllbnRfZ3JhbnRzIGRlbGV0ZTpjbGllbnRfZ3JhbnRzIHVwZGF0ZTpjbGllbnRfZ3JhbnRzIHJlYWQ6dXNlcnMgdXBkYXRlOnVzZXJzIGRlbGV0ZTp1c2VycyBjcmVhdGU6dXNlcnMgcmVhZDp1c2Vyc19hcHBfbWV0YWRhdGEgdXBkYXRlOnVzZXJzX2FwcF9tZXRhZGF0YSBkZWxldGU6dXNlcnNfYXBwX21ldGFkYXRhIGNyZWF0ZTp1c2Vyc19hcHBfbWV0YWRhdGEgcmVhZDp1c2VyX2N1c3RvbV9ibG9ja3MgY3JlYXRlOnVzZXJfY3VzdG9tX2Jsb2NrcyBkZWxldGU6dXNlcl9jdXN0b21fYmxvY2tzIGNyZWF0ZTp1c2VyX3RpY2tldHMgcmVhZDpjbGllbnRzIHVwZGF0ZTpjbGllbnRzIGRlbGV0ZTpjbGllbnRzIGNyZWF0ZTpjbGllbnRzIHJlYWQ6Y2xpZW50X2tleXMgdXBkYXRlOmNsaWVudF9rZXlzIGRlbGV0ZTpjbGllbnRfa2V5cyBjcmVhdGU6Y2xpZW50X2tleXMgcmVhZDpjb25uZWN0aW9ucyB1cGRhdGU6Y29ubmVjdGlvbnMgZGVsZXRlOmNvbm5lY3Rpb25zIGNyZWF0ZTpjb25uZWN0aW9ucyByZWFkOnJlc291cmNlX3NlcnZlcnMgdXBkYXRlOnJlc291cmNlX3NlcnZlcnMgZGVsZXRlOnJlc291cmNlX3NlcnZlcnMgY3JlYXRlOnJlc291cmNlX3NlcnZlcnMgcmVhZDpkZXZpY2VfY3JlZGVudGlhbHMgdXBkYXRlOmRldmljZV9jcmVkZW50aWFscyBkZWxldGU6ZGV2aWNlX2NyZWRlbnRpYWxzIGNyZWF0ZTpkZXZpY2VfY3JlZGVudGlhbHMgcmVhZDpydWxlcyB1cGRhdGU6cnVsZXMgZGVsZXRlOnJ1bGVzIGNyZWF0ZTpydWxlcyByZWFkOnJ1bGVzX2NvbmZpZ3MgdXBkYXRlOnJ1bGVzX2NvbmZpZ3MgZGVsZXRlOnJ1bGVzX2NvbmZpZ3MgcmVhZDpob29rcyB1cGRhdGU6aG9va3MgZGVsZXRlOmhvb2tzIGNyZWF0ZTpob29rcyByZWFkOmFjdGlvbnMgdXBkYXRlOmFjdGlvbnMgZGVsZXRlOmFjdGlvbnMgY3JlYXRlOmFjdGlvbnMgcmVhZDplbWFpbF9wcm92aWRlciB1cGRhdGU6ZW1haWxfcHJvdmlkZXIgZGVsZXRlOmVtYWlsX3Byb3ZpZGVyIGNyZWF0ZTplbWFpbF9wcm92aWRlciBibGFja2xpc3Q6dG9rZW5zIHJlYWQ6c3RhdHMgcmVhZDppbnNpZ2h0cyByZWFkOnRlbmFudF9zZXR0aW5ncyB1cGRhdGU6dGVuYW50X3NldHRpbmdzIHJlYWQ6bG9ncyByZWFkOmxvZ3NfdXNlcnMgcmVhZDpzaGllbGRzIGNyZWF0ZTpzaGllbGRzIHVwZGF0ZTpzaGllbGRzIGRlbGV0ZTpzaGllbGRzIHJlYWQ6YW5vbWFseV9ibG9ja3MgZGVsZXRlOmFub21hbHlfYmxvY2tzIHVwZGF0ZTp0cmlnZ2VycyByZWFkOnRyaWdnZXJzIHJlYWQ6Z3JhbnRzIGRlbGV0ZTpncmFudHMgcmVhZDpndWFyZGlhbl9mYWN0b3JzIHVwZGF0ZTpndWFyZGlhbl9mYWN0b3JzIHJlYWQ6Z3VhcmRpYW5fZW5yb2xsbWVudHMgZGVsZXRlOmd1YXJkaWFuX2Vucm9sbG1lbnRzIGNyZWF0ZTpndWFyZGlhbl9lbnJvbGxtZW50X3RpY2tldHMgcmVhZDp1c2VyX2lkcF90b2tlbnMgY3JlYXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgZGVsZXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgcmVhZDpjdXN0b21fZG9tYWlucyBkZWxldGU6Y3VzdG9tX2RvbWFpbnMgY3JlYXRlOmN1c3RvbV9kb21haW5zIHVwZGF0ZTpjdXN0b21fZG9tYWlucyByZWFkOmVtYWlsX3RlbXBsYXRlcyBjcmVhdGU6ZW1haWxfdGVtcGxhdGVzIHVwZGF0ZTplbWFpbF90ZW1wbGF0ZXMgcmVhZDptZmFfcG9saWNpZXMgdXBkYXRlOm1mYV9wb2xpY2llcyByZWFkOnJvbGVzIGNyZWF0ZTpyb2xlcyBkZWxldGU6cm9sZXMgdXBkYXRlOnJvbGVzIHJlYWQ6cHJvbXB0cyB1cGRhdGU6cHJvbXB0cyByZWFkOmJyYW5kaW5nIHVwZGF0ZTpicmFuZGluZyBkZWxldGU6YnJhbmRpbmcgcmVhZDpsb2dfc3RyZWFtcyBjcmVhdGU6bG9nX3N0cmVhbXMgZGVsZXRlOmxvZ19zdHJlYW1zIHVwZGF0ZTpsb2dfc3RyZWFtcyBjcmVhdGU6c2lnbmluZ19rZXlzIHJlYWQ6c2lnbmluZ19rZXlzIHVwZGF0ZTpzaWduaW5nX2tleXMgcmVhZDpsaW1pdHMgdXBkYXRlOmxpbWl0cyBjcmVhdGU6cm9sZV9tZW1iZXJzIHJlYWQ6cm9sZV9tZW1iZXJzIGRlbGV0ZTpyb2xlX21lbWJlcnMgcmVhZDplbnRpdGxlbWVudHMgcmVhZDphdHRhY2tfcHJvdGVjdGlvbiB1cGRhdGU6YXR0YWNrX3Byb3RlY3Rpb24gcmVhZDpvcmdhbml6YXRpb25zX3N1bW1hcnkgY3JlYXRlOmF1dGhlbnRpY2F0aW9uX21ldGhvZHMgcmVhZDphdXRoZW50aWNhdGlvbl9tZXRob2RzIHVwZGF0ZTphdXRoZW50aWNhdGlvbl9tZXRob2RzIGRlbGV0ZTphdXRoZW50aWNhdGlvbl9tZXRob2RzIHJlYWQ6b3JnYW5pemF0aW9ucyB1cGRhdGU6b3JnYW5pemF0aW9ucyBjcmVhdGU6b3JnYW5pemF0aW9ucyBkZWxldGU6b3JnYW5pemF0aW9ucyBjcmVhdGU6b3JnYW5pemF0aW9uX21lbWJlcnMgcmVhZDpvcmdhbml6YXRpb25fbWVtYmVycyBkZWxldGU6b3JnYW5pemF0aW9uX21lbWJlcnMgY3JlYXRlOm9yZ2FuaXphdGlvbl9jb25uZWN0aW9ucyByZWFkOm9yZ2FuaXphdGlvbl9jb25uZWN0aW9ucyB1cGRhdGU6b3JnYW5pemF0aW9uX2Nvbm5lY3Rpb25zIGRlbGV0ZTpvcmdhbml6YXRpb25fY29ubmVjdGlvbnMgY3JlYXRlOm9yZ2FuaXphdGlvbl9tZW1iZXJfcm9sZXMgcmVhZDpvcmdhbml6YXRpb25fbWVtYmVyX3JvbGVzIGRlbGV0ZTpvcmdhbml6YXRpb25fbWVtYmVyX3JvbGVzIGNyZWF0ZTpvcmdhbml6YXRpb25faW52aXRhdGlvbnMgcmVhZDpvcmdhbml6YXRpb25faW52aXRhdGlvbnMgZGVsZXRlOm9yZ2FuaXphdGlvbl9pbnZpdGF0aW9ucyBkZWxldGU6cGhvbmVfcHJvdmlkZXJzIGNyZWF0ZTpwaG9uZV9wcm92aWRlcnMgcmVhZDpwaG9uZV9wcm92aWRlcnMgdXBkYXRlOnBob25lX3Byb3ZpZGVycyBkZWxldGU6cGhvbmVfdGVtcGxhdGVzIGNyZWF0ZTpwaG9uZV90ZW1wbGF0ZXMgcmVhZDpwaG9uZV90ZW1wbGF0ZXMgdXBkYXRlOnBob25lX3RlbXBsYXRlcyBjcmVhdGU6ZW5jcnlwdGlvbl9rZXlzIHJlYWQ6ZW5jcnlwdGlvbl9rZXlzIHVwZGF0ZTplbmNyeXB0aW9uX2tleXMgZGVsZXRlOmVuY3J5cHRpb25fa2V5cyByZWFkOnNlc3Npb25zIGRlbGV0ZTpzZXNzaW9ucyByZWFkOnJlZnJlc2hfdG9rZW5zIGRlbGV0ZTpyZWZyZXNoX3Rva2VucyByZWFkOmNsaWVudF9jcmVkZW50aWFscyBjcmVhdGU6Y2xpZW50X2NyZWRlbnRpYWxzIHVwZGF0ZTpjbGllbnRfY3JlZGVudGlhbHMgZGVsZXRlOmNsaWVudF9jcmVkZW50aWFscyIsImd0eSI6ImNsaWVudC1jcmVkZW50aWFscyJ9.z1JkpD1GOPI8flmpW2k7hQ2OAMTIqrjdkSUg_JP_ctIY9AwKQkZv2plzhbexCaL2YtuRK7uDImc_MT2qwFqN8Cknn7PjayE4GsY7Lfd3AL8LDPj3Ht17ZkQMDDRca9chE4M2vH08PRcNRpdy0HoQd6FG9YApXRBnaw5QUBp-_jkyKkB04CEvoXIgxD_YSAvpDDktY2xut_fPGVF1lYwszz_q8BOl8OeBH9WE7-zZILKjbA3z52Lua6p_iUremP6hm3F4NbgmlS1ac1qqpMZl4cTBInbT_u7nHdLL60FA9HROfJqDSpiYroVq8dJHzg9EEvD5IBwZ68B4SH6WkAuNmQ",  "token_type": "Bearer" } 

Please suggest how can I validate the Access_Token.

2023-02-26 23-17-33
Kshitij Raheja

Hey @Tasubilli Ravi Kumar 

There are multiple ways to validate access tokens 

1) The most simple method would be checking the expiry of the access token by default its 60 mins or 3559s you can get the expiry time using the JWT forge component which decodes JWT tokens

https://www.outsystems.com/forge/component-overview/1853/jwt 

Here is the Expiry after decoding your access token


2) There is also another way of doing it which is calling a basic method to check that the token is still valid on a timer and if it is no longer valid then regenerate the token

I would suggest using the first method as that's the best practice and will avoid unnecessary API calls

Let me know if that works for you

Regards,
Kshitij

2021-10-09 07-57-44
Stefan Weber
 
MVP

No offense, but just validating the expiry date of an access token is equivalent to setting an exposed api to public.

2023-02-26 23-17-33
Kshitij Raheja

@Stefan Weber I will take notice and see your walkthrough for doing the best practice to validate access token securely 

2021-10-09 07-57-44
Stefan Weber
 
MVP

Hi,

there are multiple ways on how to validate an access token, ranging from simple and unsecure to highly secure.

* Just validating claims, by encoding the access token using e.g. the JWT Forge component and just checking if the audience and expiry date match and are valid

* Validating the signature using a public key offline. You need the public key which you store e.g. in a site property and again use the JWT Forge component to check if the signature of the of token is valid.

* Validiting the signature using the corresponding public key from the JWKS endpoint of the Identity Provider. Here you extract first the Key claim from the access token and then download the public key from the JWKS endpoint and do the validation.

* Validating using Token Introspection. In this case you are sending the whole token to the token introspection endpoint of the Identity Provider to check if it is valid. This scenario is needed if e.g. tokens can be revoked elsewhere. You can use the OAuth Token Exchange Forge component for Token Introspection.

For a detailled walkthrough and a demo application on how to validate an access token with a public key from a JWKS endpoint please see my article here https://itnext.io/protect-outsystems-rest-apis-using-openid-connect-87a2ac7575c1. This one is explaining the process based von AWS Cognito, but the principles are the same und you would just need to exchange the token url to your identity providers token url.

Best

Stefan

PS: Never post an access token anywhere.

Community GuidelinesBe kind and respectful, give credit to the original source of content, and search for duplicates before posting.