Using Power Automate to Configure Graph API Site.Selected Permission
Tags: powerautomate, microsoftgraph, lowcode, powerplatform
Published: 2022-08-08 17:10:00

Microsoft Graph is a powerful tool. It can give you access to user information, SharePoint files, and Office tenant settings. Because of this, admins need to be careful when granting permission to the the many Graph endpoints. The permission options for Graph are usually all-or-nothing. The SharePoint permission options, for example, are either Site.Read.All or Site.ReadWrite.All. When it says “All”, it means *all*. Granting this permission gives an app or a user access to every SharePoint site in the tenant. This is not ideal from a security perspective and requires admins to closely monitor any use of the SharePoint endpoints.

Fortunately, Microsoft has added a third permission option called Site.Selected. This allows admins to restrict Graph access to specified sites and control read/write access per site. However, you can only configure these settings through the Graph API itself. The lack of a GUI for this setting means you have to send a minimum of three API requests to get all the information needed to setup the permissions. Doing this manually can get annoying after a while so I setup a flow to do it for me. 

This flow takes in the name and id of the app, the name of the SharePoint site and whether the app should have write access to the site.

![Flow Trigger Block](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9b4lob9db529w09hlvua.png)

It follows my standard format of initializing the variables first followed by scope blocks in a Try-Catch-Finally configuration. The four variables that this flow uses are the following:

- IsError: Used for error catching
- SiteId : The Id for the site specified in the trigger. This will be gathered as part of the flow.
- Roles: This JSON array tells Graph what kind of permissions the app should be given. I’ve set the default value to just be “Read”.
- AccessToken: This is the access token needed for the Graph API requests. Since Graph uses Bearer tokens, I’ve already set that portion of the token and the rest will be acquired by a call to the authorization endpoint.

![Variable Initialization Blocks](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4637n9j16jlniy99utri.png)

The first thing this flow does is check if the app needs Write access and updates the Roles variable if needed.

![Condition block checks Write Access](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pv8zpc6weznjoeis63yr.png)

It then gets and saves the access token to use to get the SharePoint site's Id.

![Getting & Saving Access Token](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/24iuhza3jol5byfd4q0a.png)

![Getting & Saving Site Id](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1aliv4jb88q9ugrsmuqf.png)

Once all that information is saved, it builds the request body and sends the POST request to the SharePoint site to configure the permissions.

![Sending Request to Update Permissions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wuxf7ae5h0pfeoxnpku.png)

If any of the blocks encounter an error, the flow goes to the Catch scope, updates the IsError variable to true. At the very end of the flow, it checks to see if an error was caught. If it was, it forces the flow to Terminate with a Failed status. If not, the flow completes successfully and now your app should be able to access only the SharePoint site you specified.

![Flow Completion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/un8rzqfefn4e7uguvp75.png)

The Site.Selected Graph permission opens up new opportunities for your employees to create applications that use Graph to interact with SharePoint sites without compromising the security of your entire tenant. This permission was critical to my work of encouraging employees to build their own automation solutions.