Does Microsoft Graph API /search() work when using

2020-05-06 03:39发布

问题:

I am trying to use the graph API (v1.0) to search for files and folders within our team's sharepoint/onedrive folders but when using an app-only token I consistently get no results for any /search(...) request I try.

I have an registered and application with https://apps.dev.microsoft.com and have requested and granted consent for the permissions stated in the API Documentation;

User.ReadWrite.All, Group.Read.All, Sites.Read.All, Sites.ReadWrite.All, Group.ReadWrite.All, Sites.Manage.All, Files.ReadWrite.All, User.Read.All, Files.Read.All, Sites.FullControl.All

When I request a token from https://login.microsoftonline.com/ I can see the granted permissions in the payload.

Using this token I can successfully access the drive and retrieve information about its contents using drive/root

I have a small test folder structure that contains a few simple text files.

I can confirm that this token gives me access to my files and folders by calling drives/{driveid}/items/{folderid}/children recursively to build a complete tree structure.

However, when I try to search the drive for filenames or text phrases that I know exist I get no results at all, no matter what combination of paths or search terms I use. I've never seen a search result from an app-only token.

Examples that I've tried;

sites/root/drive/search(q='test')

drive/root/search(q='test')

drives/{driveid}/search(q='test')

drives/{driveid}/root/search(q='test')

The phrase "test" exists both as a filename and also within the text content of some of the files.

I get an HTTP:200 response but the value collection https://graph.microsoft.com/v1.0/$metadata#Collection(driveItem) is always empty.

I'm building http requests in my application (Coldfusion), not using a SDK. I wondered if I was having encoding problems so have tried various approaches of url-encoding the search part of the url (q='test') etc. I've also tried running the same requests with Postman and cUrl but the results are the same. Empty.

The only thing that works is when I try the same searches using the Graph Explorer I get the results I would expect to see.

I know that Explorer uses a different type of token so I'm wondering if this is and issues related to my token being app-only.

Does anyone know if .../search() actually work for app-only tokens?

回答1:

Does anyone know if .../search() actually work for app-only tokens?

The answer is yes, ../search() actually work for app-only tokens

Based on my test, the following search API works well for app-only token

https://graph.microsoft.com/v1.0/drive/root/microsoft.graph.search(q='test')

    https://graph.microsoft.com/v1.0/drives/{driveid}/root/microsoft.graph.search(q='test')

    https://graph.microsoft.com/v1.0/drives/{driveid}/microsoft.graph.search(q='test')

https://graph.microsoft.com/v1.0/sites/root/drive/search(q='test')

For permission config, just put "Files.Read.All, Files.ReadWrite.All, Sites.Read.All, Sites.ReadWrite.All" into the GraphScopes in the project config file as docs states.

Above answer is based on your description:****register app in http://apps.dev.microsoft.com/. You can ignore the SDK although it is the best choice. If you don't have a project config with GraphScopes, you need to pass the scope to auth request, it is difficult for operation.

If your app-only mean register app in SharePoint online, then the Graph Search API won't work. SharePoint doesn't share AccessToken with Graph directly.



回答2:

Here is the same question again. The answer has been commented by a microsoft developer. He confirmed, it was a bug.