Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which information gets sent in each API request using OIDC

I'm writing an API back-end that I want to use OpenID Connect (OIDC) to secure. I've been reading the documentation but I'm still a bit confused what process applies to each and every API request. The Open ID Connect code flow appears to be: OpenID Connect code flow Which I'm fine with, as a one-time process. My back-end API sees an authorization code in the HTTP headers, and sends a request to the authorization server to get the id token. Assuming this validates OK, the data requested is returned in the API response.

But assuming the same user will then be making lots of requests to this API, what happens in subsequent requests? Is there some sort of session created in this mechanism? Do I continue to receive the same authorization code? Do I have to keep sending these back channel requests to the authorization server?

Or should I even output the JWT id token as a cookie? In this way I get the self contained id token coming back in future requests, with no need of a server side session, or further round trips.

like image 238
asc99c Avatar asked Jan 29 '23 02:01

asc99c


1 Answers

I've been reading the documentation but I'm still a bit confused what process applies to each and every API request

It is not the API that should follow OpenID connect protocol. It's the client that should do it.

My back-end API sees an authorization code in the HTTP headers, and sends a request to the authorization server to get the id token. Assuming this validates OK, the data requested is returned in the API response.

Authorization code must be used by client application and not by the API endpoint. Also, authorization code must never be exposed to other entities.

You should use id token sent with OpenID Connect to authenticate the end user from your client application. To access API, you should use access tokens.

What to do in API endpoint ?

I think this is where you struggle. Your client application should send a valid access token to get access to API endpoint. From API endpoint, you can use OAuth 2.0 introspection endpoint to validate the tokens.

RFC7662 - OAuth 2.0 Token Introspection

This specification defines a protocol that allows authorized protected resources to query the authorization server to determine the set of metadata for a given token that was presented to them by an OAuth 2.0 client.

Note that, OpenID Connect is built on top of OAuth 2.0. This means you can use anything defined in OAuth 2.0, including introspection endpoint. Use this endpoint to verify the access token validity.

What if you want end user details ?

OpenID Connect defines a user info endpoint

User info endpoint

The UserInfo Endpoint is an OAuth 2.0 Protected Resource that returns Claims about the authenticated End-User. To obtain the requested Claims about the End-User, the Client makes a request to the UserInfo Endpoint using an Access Token obtained through OpenID Connect Authentication. These Claims are normally represented by a JSON object that contains a collection of name and value pairs for the Claims.

Here also, you use access tokens to get user information from this endpoint. The response will let you know the end user to which this token was issued.

Depending on your specific API requirement, you can do a token introspection or obtain user information from user info endpoint. Once that is done you may go ahead and authenticate a session. You might use both endpoints if you need all available information.

Alternatively(instead of sessions) your API can maintain an access token cache. This will remove the need to validate tokens in each an every API call. But be aware that tokens have expiration time. You must consider about token expiration if you are choosing this solution.

p.s - Client vs Resource server

In OpenID Connect and OAuth 2.0 terms, a client could be a simple web page, desktop application or could be even server hosted application.

client An application making protected resource requests on behalf of the resource owner and with its authorization. The term "client" does not imply any particular implementation characteristics (e.g., whether the application executes on a server, a desktop, or other devices).

Obtaining tokens and using them is the duty of the client application.

On the other hand, resource server contains protected resources,

resource server The server hosting the protected resources, capable of accepting and responding to protected resource requests using access tokens.

Resource server exchange it's resources to access tokens. If we match the same scenario to basic authentication, access tokens replaces username/password sent with authentication headers.

like image 163
Kavindu Dodanduwa Avatar answered Feb 13 '23 07:02

Kavindu Dodanduwa