I'm attempting to build an application that will have access to all of an organization's calendars (users, rooms, etc).
Currently my auth flow will sign in on behalf of a tenant user and make use of refresh tokens to access needed resources. As soon as I make a request to:
https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events
My application is responded with a 401
From my gathering, it seems that this flow is limited to a single user's scope. Although the tenant admin should have permission to see any of the room resources, the room is technically a user itself so the API will respond with a forbidden error. It now seems that the proper flow is a tenant admin must grant permission to my application using the new Service OAuth Flow.
Reading through this post it seems that the API is making use of OAuth client credentials grant type (app only tokens). Instead of using the /oauth/common
endpoint I now have to use /oauth/tenant-id
which I can retrieve via the JWT token returned in the code+id_token
response type. This leads to my first question:
Is using the OpenID flow the only way to initially retrieve the tenant ID?
Next is where things get a little fuzzy for me.
We now have to generate an X.509 SSL certificate and upload the fingerprint/value to our Azure application manifest. Easy enough.
Then according to the discussion in Office 365 Rest API - Daemon week authentication we build a specific JWT, base64 encode it, and sign it with our cert.
I haven't actually gotten to the last few steps here but I will post my results when I can. I'm just making sure that I seem to be following the correct procedure for what resources I'm trying to access. I know the service tokens are a fairly new feature, it's just unfortunate that I had to find the flow of sending the signed JWT on Stackoverflow rather than official MSFT documentation...
I also noticed that since we're using the client credentials flow we will not receive a refresh_token
in the response. So for my final question:
When accessing different resources (ie Graph API/Office365 API) do I just get a different access token for each resource using my signed request instead of using refresh tokens for multiple resources?
If the general direction I seem to be going is correct let me know! Any help is greatly appreciated.