The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares
Onyx reads Microsoft 365 through four connectors: SharePoint,
OneDrive,
Microsoft Teams,
and Outlook.
All four sign in to Microsoft Graph as an application registered in Microsoft Entra, not as a user,
and they are set up the same way: register an application, grant it permissions, give Onyx a credential.
Each connector’s page says what it needs beyond them.One app registration can serve every connector. Grant it the union of the permissions in the table below,
or register one app per connector to keep the grants apart.
A Microsoft Entra user account holding the Global Administrator or Privileged Role Administrator role.
The connectors need Microsoft Graph application permissions,
and only these two roles can consent to those on behalf of your organization.
Application Administrator and Cloud Application Administrator can register the app but cannot grant it
consent.
An Onyx administrator account
A decision on how the connector authenticates, a client secret or a certificate.
Changing it later means building a new credential and possibly re-indexing.
Some options need more: a Teams administrator for meeting transcripts, described on the Teams page,
and a SharePoint or Global Administrator when you limit the app to specific
sites.
Every connector accepts either a client secret or a certificate.
Use a certificate if you need SharePoint permission sync or Teams channel files,
or if your organization does not permit client secrets. Otherwise a client secret is quicker to set up.
Client secret
Certificate
Indexing files, pages, threads and mail
Yes
Yes
SharePoint permission sync
No
Yes
Teams Include Attachments
No
Yes
OneDrive, Teams and Outlook permission sync
Yes
Yes
Setup effort
Lower. The portal generates the secret for you.
Higher. You create a certificate and upload part of it to Microsoft.
SharePoint will not release its permission data, or the readers of a channel’s files,
to an application that signed in with a secret, whatever permissions you grant it.
Every permission on this page is an Application permission and read only, with one exception:
Sites.FullControl.All on the SharePoint API.
SharePoint shows an item’s access list only to an app with full control of the site.
Onyx reads with it and never writes to SharePoint.
Connector and option
Microsoft Graph application permissions
Also needed
SharePoint files and pages
Sites.Read.All, or Sites.Selected with a read grant on each site
A certificate credential, and User.Read.All on the SharePoint API, plus Sites.FullControl.All on the SharePoint API or, with Sites.Selected, a fullcontrol grant on each site.
OneDrive files
User.Read.All, plus Sites.Read.All or Sites.Selected with a read grant on each personal site
Nothing
OneDrive Auto Sync Permissions
User.Read.All, GroupMember.ReadBasic.All, plus the site permission above
Member.Read.Hidden when groups with hidden membership can access files
The Transcript API access setting in the Teams admin center, and an application access policy granted to the meeting organizers. See Microsoft Teams.
Teams Include Meeting Chats
Chat.Read.All, User.Read.All
Nothing
Outlook mail (always on)
Mail.Read, User.Read.All
Nothing
Outlook Include Calendar
Calendars.Read
Nothing
A new registration already lists a delegated User.Read permission. The connectors never use it,
since they sign in as an application rather than as a person. Leave it or remove it, as you prefer.
Sign in to the Microsoft Entra admin center
or the Azure portal (https://entra.microsoft.us for GCC High or DoD)
and go to App registrations. Select New registration, name it something recognizable,
such as Onyx Microsoft 365 Connector, leave the supported account types and redirect URI at their defaults,
and select Register.
2
Record the two IDs
On the application’s Overview page, copy the Application (client) ID and the Directory (tenant) ID.
Onyx asks for both, and the application access policy for Teams meeting transcripts needs the client ID.
The permissions come from two places in the portal, Microsoft Graph and SharePoint. Add them all first,
then grant consent once at the end.
1
Add the Microsoft Graph application permissions
Go to API permissions → Add a permission → Microsoft Graph → Application permissions,
and add every Graph permission from the table above
for the connectors and options you plan to turn on. Select Add permissions.Add the grants for an option now if you expect to turn it on later, or come back and add them when you do.
To limit the app to specific SharePoint sites, add Sites.Selected instead of Sites.Read.All.
See Limiting the app to specific sites.
2
Add the SharePoint application permissions
Needed for SharePoint permission sync and for Teams Include Attachments.
Select Add a permission → SharePoint → Application permissions, and add Sites.FullControl.All.
SharePoint permission sync also needs User.Read.All here, to match access lists to the people in your directory.Add these under SharePoint, not Microsoft Graph. The two list permissions with the same names,
and adding the Graph one by mistake is a common cause of permission sync failing later.
3
Grant admin consent
Select Grant admin consent for <your organization> and confirm.
Every permission in the list should then show Granted. Until you do this, none of them take effect.
Grant consent again each time you add a permission later.This step needs the Global Administrator or Privileged Role Administrator role.
No other role can consent to Microsoft Graph application permissions,
so if the button is unavailable or consent fails, ask someone with one of those roles to do it.
Microsoft applies a new permission or consent within minutes, but not everywhere at once.
It can take about half an hour before every sign-in carries the new permissions,
so the same check in Onyx can pass and then fail. Wait and retry before you change anything else.
In your app registration, go to Certificates & secrets → Client secrets and select New client secret.
Give it a description, and choose an expiry. Microsoft allows up to 24 months. Select Add.
2
Copy the value immediately
Copy the Value column, not the Secret ID. The value is shown only while you stay on this page.
Once you navigate away you cannot get it back, and you have to create a new secret.
A certificate identifies the Entra application with a key file instead of a password. You need two files,
and both come from the same certificate:
A public certificate (.cer, .pem, or .crt) that you upload to Entra ID
A .pfx file, protected by a password, that you upload to Onyx
Sending the wrong file to the wrong place is the most common problem in this setup.
Either get a certificate from your organization’s certificate authority, or create a self-signed one.
1
Generate the private key and certificate
# Private keyopenssl genrsa -out onyx-m365.key 2048# Self-signed certificate, valid for two yearsopenssl req -new -x509 -days 730 \ -key onyx-m365.key \ -out onyx-m365.crt \ -subj "/CN=Onyx Microsoft 365 Connector"
You are prompted for an export password. Set one and record it: Onyx does not accept an empty password,
asks for it later, and cannot recover it.
3
Check what you have
File
Goes to
onyx-m365.crt
Entra ID
onyx-m365.pfx
Onyx
onyx-m365.key
Neither. Keep it somewhere safe, or delete it.
4
Upload the public certificate to Entra
In your app registration, go to Certificates & secrets → Certificates, select Upload certificate,
choose onyx-m365.crt, add a description, and select Add.
If your certificate authority issues you a .pfx only,
extract the public half for Entra with openssl pkcs12 -in yourcert.pfx -clcerts -nokeys -out yourcert.crt.
Entra takes .cer, .pem, and .crt files only. Uploading the .pfx fails with Upload a certificate (public key)
with one of the following file types: .cer, .pem, .crt. The .pfx goes to Onyx, not to Entra.
Each connector asks for an Authentication Account when you add it. Select a saved account, or select Create New,
pick the tab for your authentication method, and enter the details from your app registration:
Client Secret tab: the Application (client) ID, the Directory (tenant) ID and the secret Value you
copied
Certificate Authentication tab: the two IDs, the .pfx in the Private Key (PFX) field and the export
password you set in the Certificate Password field. Each field is labelled with the connector’s name.
An account created on the form of one Microsoft 365 connector is also listed on the forms of the other three,
so one app registration needs only one credential. Grant the app the permissions of every connector that uses it:
the connector checks report a missing permission.
Credentials created before credential sharing existed stay on the form of their own connector.
By default the app holds Sites.Read.All, which lets it read every SharePoint site in the tenant,
even when a connector names only one. If that is too broad,
grant Sites.Selected instead and authorize the app one site at a time. The app can read nothing until you do.
This applies to both authentication methods, to a user’s OneDrive, which is a site of its own,
and to the SharePoint sites behind Teams channel files.The role you grant depends on what the connector does:
Connector use
Role to grant on each site
Entra permission also needed
SharePoint indexing only
read
Microsoft Graph → Sites.Selected
SharePoint indexing with permission sync
fullcontrol
Microsoft Graph → Sites.Selected. The per-site grant replaces tenant-wide Sites.FullControl.All on the SharePoint API.
OneDrive indexing and permission sync
read
Microsoft Graph → Sites.Selected
Teams Include Attachments
fullcontrol
Microsoft Graph → Files.Read.All, which the connector needs to read channel files. Private and shared channels each have a site of their own.
Granting a site to the app
You need a Global Administrator or SharePoint Administrator account.
The steps below use Microsoft Graph Explorer.
You can do the same with PnP
PowerShell
(Grant-PnPAzureADAppSitePermission).
1
Sign in and consent
Sign in to Graph Explorer,
then select your profile icon → Consent to permissions and enable Sites.FullControl.All.
This lets Graph Explorer grant site permissions. It grants nothing to your Onyx application.
2
Find the site ID
Run a GET request, substituting your tenant and site name:
GET https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/YourSiteName?$select=id
For a OneDrive, the site is contoso-my.sharepoint.com:/personal/jane_contoso_com.
Copy the id from the response. It is a three-part value such as contoso.sharepoint.com,5a58bb09-…,9f2ec1da-….
3
Grant the role
Change the method to POST, using the site ID you just copied:
POST https://graph.microsoft.com/v1.0/sites/{site-id}/permissions
Send this body. Set roles to ["read"] for indexing only, or ["fullcontrol"] for permission sync.
Set id to your Onyx application’s Application (client) ID.
Each connector has Authority Host and Graph API Host under its advanced settings,
and the SharePoint connector has SharePoint Domain Suffix as well. All must describe the same cloud.
Onyx rejects an authority host that does not match the Graph host when you save,
and corrects a domain suffix that does not match the Graph host with a warning in its log.
Indexing stops when the secret or certificate expires. To rotate without downtime:
1
Add the new one alongside the old
In Certificates & secrets, add a new client secret and copy its value, or upload the new public certificate.
Entra holds more than one at a time, and both work until the old one expires.
2
Update the credential in Onyx
In Admin Panel → Connectors, open any Microsoft 365 connector form and expand Saved Accounts.
Select the account that uses this app registration, select Update Credentials, and replace the secret value,
or the .pfx and its password. A shared account updates every connector that uses it.
If you entered the app registration once per connector, update each of those credentials.
3
Delete the old one
Once an indexing attempt has succeeded, delete the previous secret or certificate in Entra.
Credential, consent and certificate problems, with the message each connector shows for them.
Each connector’s page lists the problems that are its own.
invalid_client, Invalid or expired Microsoft Teams credentials, Microsoft rejected the client secret or certificate, or an error that names AADSTS7000215 or AADSTS7000222
Entra does not recognize the secret or certificate, or it belongs to another app registration. For a secret,
check that you copied the Value rather than the Secret ID, and that it has not passed its expiry date.
For a certificate, it has usually expired,
or the .pfx and the uploaded public certificate came from different certificates.
Create a new one and update the credential.
Microsoft does not know this directory
The directory ID or the authority host is wrong. For a national cloud,
set every host from the same row of National clouds.
Upload a certificate (public key) with one of the following file types
You uploaded the .pfx to Entra. Upload the .crt, .cer, or .pem instead, and keep the .pfx for Onyx.
Failed to load certificate, or The PFX bundle could not be opened
Onyx could not open the .pfx, usually because the password is wrong or the file is not a .pfx at all.
Repeat Certificate.
Unsupported app only token
SharePoint permission sync or Teams channel files are running on a client secret credential,
and SharePoint will not release permission data to an app that signed in with a secret.
Check which credential the connector is attached to, and rebuild it with a certificate.
Permissions show as not granted
Admin consent was never given, or was given before you added the last permission.
Select Grant admin consent again.
A permission shows Granted but Microsoft still answers 403
The permission was added on the wrong API. SharePoint checks its own Sites.FullControl.All,
and a Graph permission with the same name does not count.
A setup check passes, then fails minutes later
Microsoft is still applying a permission, consent or application access policy change.
Wait about half an hour and retry before you change anything else.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Onyx Documentation","colors":{"primary":"#0069ED","light":"#4D9CFF","dark":"#0050B4"},"logo":{"light":"https://mintcdn.com/danswer/TrJ0UalhtrxYEGaI/assets/logo/onyx_logo.svg?fit=max\u0026auto=format\u0026n=TrJ0UalhtrxYEGaI\u0026q=85\u0026s=7c6a59073e62a51c501463d3d7d79c42","dark":"https://mintcdn.com/danswer/TrJ0UalhtrxYEGaI/assets/logo/onyx_logo_inverted.svg?fit=max\u0026auto=format\u0026n=TrJ0UalhtrxYEGaI\u0026q=85\u0026s=4e38630166675e463d97d41929b6a99e","href":"https://onyx.app/"},"favicon":"https://mintcdn.com/danswer/TrJ0UalhtrxYEGaI/assets/logo/onyx_favicon.svg?fit=max\u0026auto=format\u0026n=TrJ0UalhtrxYEGaI\u0026q=85\u0026s=6ea820a642e7069f78fe8f46af23a81a","api":{"openapi":["developers/api_reference/openapi.json"]},"navbar":{"links":[{"icon":"github","href":"https://github.com/onyx-dot-app/onyx","label":"onyx-dot-app/onyx"}],"primary":{"type":"button","label":"Onyx Cloud","href":"https://cloud.onyx.app/?utm_source=docs"}},"footer":{"socials":{"github":"https://github.com/onyx-dot-app/onyx","twitter":"https://x.com/onyx_dot_app","linkedin":"https://linkedin.com/company/onyx-dot-app"}},"seo":{"metatags":{"keywords":"enterprise search, onyx ai, onyx, open source ai, enterprise ai, generative ai platform, ai assistant, knowledge management, danswer"}},"integrations":{"posthog":{"apiKey":"phc_ghlrcfXpgWq9XxZeVMfoJpfaISgFGoXhHYOEcBwdulK","apiHost":"https://us.i.posthog.com"}},"banner":{"content":"**Permissions update:** Onyx now uses group-based permissions. [Understand permissions](/admins/permissions/understanding_permissions) or [review migration details](/admins/permissions/whats_changing)","dismissible":true},"contextual":{"options":[],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://onyx.app/"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/TDJ59cGV2X"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"danswer","hasAudioNarration":false,"actualSubdomain":"danswer","customDomains":["docs.onyx.app"],"gitSource":{"type":"github","owner":"onyx-dot-app","repo":"onyx","deployBranch":"docs/live","contentDirectory":"documentation","isPrivate":false,"mountPath":"","label":"","_id":"6ae27ebc5efec986e272d162"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aea074c2d9111c67b18a97e","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Developers","count":161},{"language":"default","tag":"API Reference","count":153},{"language":"default","tag":"Admins","count":129},{"language":"default","tag":"Connectors","count":93},{"language":"default","tag":"Supported Connectors","count":69},{"language":"default","tag":"Connectors \u0026 Credentials","count":38},{"language":"default","tag":"Deployment","count":36},{"language":"default","tag":"Overview","count":27},{"language":"default","tag":"Managing Features","count":19},{"language":"default","tag":"Projects \u0026 Files","count":16}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".rounded-image{border-radius:1rem;margin:8px auto;display:block}.prose table,table{display:table;width:100%;max-width:100%;table-layout:auto}.prose table th{text-align:left!important}.icon-dark-invert [data-component-part=\"card-icon\"] img{background:transparent!important}.dark .icon-dark-invert [data-component-part=\"card-icon\"] img{filter:invert(1)!important}.docs-image-placeholder{align-items:center;background:repeating-linear-gradient(\n 45deg,\n rgba(0, 105, 237, 0.08),\n rgba(0, 105, 237, 0.08) 12px,\n rgba(0, 105, 237, 0.14) 12px,\n rgba(0, 105, 237, 0.14) 24px\n );border:1px dashed rgba(0, 105, 237, 0.55);border-radius:0.75rem;color:#0050b4;display:flex;font-weight:600;justify-content:center;margin:1rem 0;min-height:220px;padding:1.5rem;text-align:center}.dark .docs-image-placeholder{color:#9ec8ff}.permission-pyramid{display:flex;flex-direction:column;gap:0.5rem;margin:1.5rem auto;max-width:760px}.permission-pyramid-layer{align-items:center;border:1px solid rgba(0, 105, 237, 0.18);border-radius:0.75rem;display:flex;flex-direction:column;gap:0.2rem;margin:0 auto;padding:0.85rem 1rem;text-align:center}.permission-pyramid-layer span{font-size:0.9rem}.permission-pyramid-admin{background:#0b1f3a;color:#ffffff;width:100%}.permission-pyramid-org{background:#0050b4;color:#ffffff;width:82%}.permission-pyramid-scoped{background:#4d9cff;color:#07172b;width:62%}.permission-pyramid-basic{background:#eaf4ff;color:#07172b;width:42%}.permission-pyramid-limited{background:#f5f8fc;border-style:dashed;color:#37536f;width:26%}@media (max-width: 640px){.permission-pyramid-admin,.permission-pyramid-org,.permission-pyramid-scoped,.permission-pyramid-basic,.permission-pyramid-limited{width:100%}}"}],"page":{"pagePath":"admins/connectors/official/microsoft-365/setup","slug":"/admins/connectors/official/microsoft-365/setup","pageMetadata":{"title":"Microsoft 365 Setup","description":"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares","href":"/admins/connectors/official/microsoft-365/setup"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,CodeBlock,Heading,Note,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Onyx reads Microsoft 365 through four connectors: `,_jsx(_components.a,{href:`/admins/connectors/official/microsoft-365/sharepoint`,children:`SharePoint`}),`,\n`,_jsx(_components.a,{href:`/admins/connectors/official/microsoft-365/onedrive`,children:`OneDrive`}),`,\n`,_jsx(_components.a,{href:`/admins/connectors/official/microsoft-365/teams`,children:`Microsoft Teams`}),`,\nand `,_jsx(_components.a,{href:`/admins/connectors/official/microsoft-365/outlook`,children:`Outlook`}),`.\nAll four sign in to Microsoft Graph as an application registered in Microsoft Entra, not as a user,\nand they are set up the same way: register an application, grant it permissions, give Onyx a credential.\nEach connector’s page says what it needs beyond them.`]}),`\n`,_jsx(_components.p,{children:`One app registration can serve every connector. Grant it the union of the permissions in the table below,\nor register one app per connector to keep the grants apart.`}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-begin`,children:`Before you begin`}),`\n`,_jsx(_components.p,{children:`You need:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A Microsoft 365 tenant`}),`\n`,_jsxs(_components.li,{children:[`A Microsoft Entra user account holding the `,_jsx(_components.strong,{children:`Global Administrator`}),` or `,_jsx(_components.strong,{children:`Privileged Role Administrator`}),` role.\nThe connectors need Microsoft Graph application permissions,\nand only these two roles can consent to those on behalf of your organization.\n`,_jsx(_components.strong,{children:`Application Administrator`}),` and `,_jsx(_components.strong,{children:`Cloud Application Administrator`}),` can register the app but cannot grant it\nconsent.`]}),`\n`,_jsx(_components.li,{children:`An Onyx administrator account`}),`\n`,_jsx(_components.li,{children:`A decision on how the connector authenticates, a client secret or a certificate.\nChanging it later means building a new credential and possibly re-indexing.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Some options need more: a Teams administrator for meeting transcripts, described on the Teams page,\nand a SharePoint or Global Administrator when you `,_jsx(_components.a,{href:`#limiting-the-app-to-specific-sites`,children:`limit the app to specific\nsites`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-an-authentication-method`,children:`Choose an authentication method`}),`\n`,_jsx(_components.p,{children:`Every connector accepts either a client secret or a certificate.`}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Use a certificate if you need SharePoint permission sync or Teams channel files,\nor if your organization does not permit client secrets. Otherwise a client secret is quicker to set up.`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{children:`Client secret`}),_jsx(_components.th,{children:`Certificate`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Indexing files, pages, threads and mail`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`SharePoint permission sync`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`No`})}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Include Attachments`})]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`No`})}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OneDrive, Teams and Outlook permission sync`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Setup effort`}),_jsx(_components.td,{children:`Lower. The portal generates the secret for you.`}),_jsx(_components.td,{children:`Higher. You create a certificate and upload part of it to Microsoft.`})]})]})]}),`\n`,_jsx(_components.p,{children:`SharePoint will not release its permission data, or the readers of a channel’s files,\nto an application that signed in with a secret, whatever permissions you grant it.`}),`\n`,_jsx(Heading,{level:`2`,id:`permissions`,children:`Permissions`}),`\n`,_jsxs(_components.p,{children:[`Every permission on this page is an `,_jsx(_components.strong,{children:`Application`}),` permission and read only, with one exception:\n`,_jsx(_components.strong,{children:`Sites.FullControl.All`}),` on the `,_jsx(_components.strong,{children:`SharePoint`}),` API.\nSharePoint shows an item’s access list only to an app with full control of the site.\nOnyx reads with it and never writes to SharePoint.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Connector and option`}),_jsx(_components.th,{children:`Microsoft Graph application permissions`}),_jsx(_components.th,{children:`Also needed`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`SharePoint files and pages`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Sites.Read.All`}),`, or `,_jsx(_components.strong,{children:`Sites.Selected`}),` with a `,_jsx(_components.code,{children:`read`}),` grant on each site`]}),_jsx(_components.td,{children:`Nothing`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`SharePoint `,_jsx(_components.strong,{children:`Auto Sync Permissions`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`GroupMember.Read.All`}),`, `,_jsx(_components.strong,{children:`Group.Read.All`}),`, `,_jsx(_components.strong,{children:`Directory.Read.All`}),`, `,_jsx(_components.strong,{children:`User.Read.All`}),`, `,_jsx(_components.strong,{children:`Member.Read.Hidden`})]}),_jsxs(_components.td,{children:[`A certificate credential, and `,_jsx(_components.strong,{children:`User.Read.All`}),` on the `,_jsx(_components.strong,{children:`SharePoint`}),` API, plus `,_jsx(_components.strong,{children:`Sites.FullControl.All`}),` on the `,_jsx(_components.strong,{children:`SharePoint`}),` API or, with `,_jsx(_components.strong,{children:`Sites.Selected`}),`, a `,_jsx(_components.code,{children:`fullcontrol`}),` grant on each site.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OneDrive files`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`User.Read.All`}),`, plus `,_jsx(_components.strong,{children:`Sites.Read.All`}),` or `,_jsx(_components.strong,{children:`Sites.Selected`}),` with a `,_jsx(_components.code,{children:`read`}),` grant on each personal site`]}),_jsx(_components.td,{children:`Nothing`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`OneDrive `,_jsx(_components.strong,{children:`Auto Sync Permissions`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`User.Read.All`}),`, `,_jsx(_components.strong,{children:`GroupMember.ReadBasic.All`}),`, plus the site permission above`]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Member.Read.Hidden`}),` when groups with hidden membership can access files`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Teams channel threads (always on)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Team.ReadBasic.All`}),`, `,_jsx(_components.strong,{children:`Channel.ReadBasic.All`}),`, `,_jsx(_components.strong,{children:`ChannelMessage.Read.All`})]}),_jsx(_components.td,{children:`Nothing`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Auto Sync Permissions`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`ChannelMember.Read.All`}),`, `,_jsx(_components.strong,{children:`User.Read.All`})]}),_jsx(_components.td,{children:`Nothing`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Include Attachments`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Files.Read.All`}),` or `,_jsx(_components.strong,{children:`Sites.Read.All`}),`, `,_jsx(_components.strong,{children:`GroupMember.Read.All`}),`, `,_jsx(_components.strong,{children:`User.Read.All`})]}),_jsxs(_components.td,{children:[`A certificate credential, and `,_jsx(_components.strong,{children:`Sites.FullControl.All`}),` on the `,_jsx(_components.strong,{children:`SharePoint`}),` API or, with `,_jsx(_components.strong,{children:`Sites.Selected`}),`, a `,_jsx(_components.code,{children:`fullcontrol`}),` grant on each channel site`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Include Inline Images`})]}),_jsx(_components.td,{children:`Nothing more`}),_jsx(_components.td,{children:`Image extraction and analysis turned on in the Onyx search settings`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Include Meeting Transcripts`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`OnlineMeetingTranscript.Read.All`}),`, `,_jsx(_components.strong,{children:`OnlineMeetings.Read.All`}),`, `,_jsx(_components.strong,{children:`User.Read.All`})]}),_jsxs(_components.td,{children:[`The `,_jsx(_components.strong,{children:`Transcript API access`}),` setting in the Teams admin center, and an application access policy granted to the meeting organizers. See `,_jsx(_components.a,{href:`/admins/connectors/official/microsoft-365/teams#configure-microsoft-teams`,children:`Microsoft Teams`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Include Meeting Chats`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Chat.Read.All`}),`, `,_jsx(_components.strong,{children:`User.Read.All`})]}),_jsx(_components.td,{children:`Nothing`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Outlook mail (always on)`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Mail.Read`}),`, `,_jsx(_components.strong,{children:`User.Read.All`})]}),_jsx(_components.td,{children:`Nothing`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Outlook `,_jsx(_components.strong,{children:`Include Calendar`})]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Calendars.Read`})}),_jsx(_components.td,{children:`Nothing`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`A new registration already lists a delegated `,_jsx(_components.strong,{children:`User.Read`}),` permission. The connectors never use it,\nsince they sign in as an application rather than as a person. Leave it or remove it, as you prefer.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`register-the-application`,children:`Register the application`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create the registration`,children:_jsxs(_components.p,{children:[`Sign in to the `,_jsx(_components.a,{href:`https://entra.microsoft.com`,children:`Microsoft Entra admin center`}),`\nor the `,_jsx(_components.a,{href:`https://portal.azure.com/`,children:`Azure portal`}),` (`,_jsx(_components.code,{children:`https://entra.microsoft.us`}),` for GCC High or DoD)\nand go to `,_jsx(_components.strong,{children:`App registrations`}),`. Select `,_jsx(_components.strong,{children:`New registration`}),`, name it something recognizable,\nsuch as `,_jsx(_components.code,{children:`Onyx Microsoft 365 Connector`}),`, leave the supported account types and redirect URI at their defaults,\nand select `,_jsx(_components.strong,{children:`Register`}),`.`]})}),_jsx(Step,{title:`Record the two IDs`,children:_jsxs(_components.p,{children:[`On the application’s `,_jsx(_components.strong,{children:`Overview`}),` page, copy the `,_jsx(_components.strong,{children:`Application (client) ID`}),` and the `,_jsx(_components.strong,{children:`Directory (tenant) ID`}),`.\nOnyx asks for both, and the application access policy for Teams meeting transcripts needs the client ID.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`grant-permissions`,children:`Grant permissions`}),`\n`,_jsx(_components.p,{children:`The permissions come from two places in the portal, Microsoft Graph and SharePoint. Add them all first,\nthen grant consent once at the end.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Add the Microsoft Graph application permissions`,children:[_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`API permissions → Add a permission → Microsoft Graph → Application permissions`}),`,\nand add every Graph permission from the `,_jsx(_components.a,{href:`#permissions`,children:`table above`}),`\nfor the connectors and options you plan to turn on. Select `,_jsx(_components.strong,{children:`Add permissions`}),`.`]}),_jsxs(_components.p,{children:[`Add the grants for an option now if you expect to turn it on later, or come back and add them when you do.\nTo limit the app to specific SharePoint sites, add `,_jsx(_components.strong,{children:`Sites.Selected`}),` instead of `,_jsx(_components.strong,{children:`Sites.Read.All`}),`.\nSee `,_jsx(_components.a,{href:`#limiting-the-app-to-specific-sites`,children:`Limiting the app to specific sites`}),`.`]})]}),_jsxs(Step,{title:`Add the SharePoint application permissions`,children:[_jsxs(_components.p,{children:[`Needed for SharePoint permission sync and for Teams `,_jsx(_components.strong,{children:`Include Attachments`}),`.\nSelect `,_jsx(_components.strong,{children:`Add a permission → SharePoint → Application permissions`}),`, and add `,_jsx(_components.strong,{children:`Sites.FullControl.All`}),`.\nSharePoint permission sync also needs `,_jsx(_components.strong,{children:`User.Read.All`}),` here, to match access lists to the people in your directory.`]}),_jsxs(_components.p,{children:[`Add these under `,_jsx(_components.strong,{children:`SharePoint`}),`, not Microsoft Graph. The two list permissions with the same names,\nand adding the Graph one by mistake is a common cause of permission sync failing later.`]})]}),_jsxs(Step,{title:`Grant admin consent`,children:[_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Grant admin consent for \u003cyour organization>`}),` and confirm.\nEvery permission in the list should then show `,_jsx(_components.strong,{children:`Granted`}),`. Until you do this, none of them take effect.\nGrant consent again each time you add a permission later.`]}),_jsxs(_components.p,{children:[`This step needs the `,_jsx(_components.strong,{children:`Global Administrator`}),` or `,_jsx(_components.strong,{children:`Privileged Role Administrator`}),` role.\nNo other role can consent to Microsoft Graph application permissions,\nso if the button is unavailable or consent fails, ask someone with one of those roles to do it.`]})]})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Microsoft applies a new permission or consent within minutes, but not everywhere at once.\nIt can take about half an hour before every sign-in carries the new permissions,\nso the same check in Onyx can pass and then fail. Wait and retry before you change anything else.`})}),`\n`,_jsx(Heading,{level:`2`,id:`create-the-credential`,children:`Create the credential`}),`\n`,_jsx(Heading,{level:`3`,id:`client-secret`,children:`Client secret`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add a secret`,children:_jsxs(_components.p,{children:[`In your app registration, go to `,_jsx(_components.strong,{children:`Certificates \u0026 secrets → Client secrets`}),` and select `,_jsx(_components.strong,{children:`New client secret`}),`.\nGive it a description, and choose an expiry. Microsoft allows up to 24 months. Select `,_jsx(_components.strong,{children:`Add`}),`.`]})}),_jsx(Step,{title:`Copy the value immediately`,children:_jsxs(_components.p,{children:[`Copy the `,_jsx(_components.strong,{children:`Value`}),` column, not the `,_jsx(_components.strong,{children:`Secret ID`}),`. The value is shown only while you stay on this page.\nOnce you navigate away you cannot get it back, and you have to create a new secret.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`certificate`,children:`Certificate`}),`\n`,_jsx(_components.p,{children:`A certificate identifies the Entra application with a key file instead of a password. You need two files,\nand both come from the same certificate:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`public certificate`}),` (`,_jsx(_components.code,{children:`.cer`}),`, `,_jsx(_components.code,{children:`.pem`}),`, or `,_jsx(_components.code,{children:`.crt`}),`) that you upload to Entra ID`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`.pfx`}),` file`]}),`, protected by a password, that you upload to Onyx`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Sending the wrong file to the wrong place is the most common problem in this setup.\nEither get a certificate from your organization’s certificate authority, or create a self-signed one.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Generate the private key and certificate`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Private key`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`openssl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` genrsa`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -out`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` onyx-m365.key`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 2048`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Self-signed certificate, valid for two years`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`openssl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` req`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -x509`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -days`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 730`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` onyx-m365.key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -out`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` onyx-m365.crt`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -subj`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"/CN=Onyx Microsoft 365 Connector\"`})]}),`\n`]})})})}),_jsxs(Step,{title:`Package the private key as a .pfx`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`openssl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pkcs12`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -inkey`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` onyx-m365.key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -in`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` onyx-m365.crt`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -out`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` onyx-m365.pfx`})]}),`\n`]})})}),_jsx(_components.p,{children:`You are prompted for an export password. Set one and record it: Onyx does not accept an empty password,\nasks for it later, and cannot recover it.`})]}),_jsx(Step,{title:`Check what you have`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`File`}),_jsx(_components.th,{children:`Goes to`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onyx-m365.crt`})}),_jsx(_components.td,{children:`Entra ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onyx-m365.pfx`})}),_jsx(_components.td,{children:`Onyx`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onyx-m365.key`})}),_jsx(_components.td,{children:`Neither. Keep it somewhere safe, or delete it.`})]})]})]})}),_jsx(Step,{title:`Upload the public certificate to Entra`,children:_jsxs(_components.p,{children:[`In your app registration, go to `,_jsx(_components.strong,{children:`Certificates \u0026 secrets → Certificates`}),`, select `,_jsx(_components.strong,{children:`Upload certificate`}),`,\nchoose `,_jsx(_components.code,{children:`onyx-m365.crt`}),`, add a description, and select `,_jsx(_components.strong,{children:`Add`}),`.`]})})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`If your certificate authority issues you a `,_jsx(_components.code,{children:`.pfx`}),` only,\nextract the public half for Entra with `,_jsx(_components.code,{children:`openssl pkcs12 -in yourcert.pfx -clcerts -nokeys -out yourcert.crt`}),`.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Entra takes `,_jsx(_components.code,{children:`.cer`}),`, `,_jsx(_components.code,{children:`.pem`}),`, and `,_jsx(_components.code,{children:`.crt`}),` files only. Uploading the `,_jsx(_components.code,{children:`.pfx`}),` fails with `,_jsx(_components.em,{children:`Upload a certificate (public key)\nwith one of the following file types: .cer, .pem, .crt`}),`. The `,_jsx(_components.code,{children:`.pfx`}),` goes to Onyx, not to Entra.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`enter-the-credential-in-onyx`,children:`Enter the credential in Onyx`}),`\n`,_jsxs(_components.p,{children:[`Each connector asks for an `,_jsx(_components.strong,{children:`Authentication Account`}),` when you add it. Select a saved account, or select `,_jsx(_components.strong,{children:`Create New`}),`,\npick the tab for your authentication method, and enter the details from your app registration:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client Secret`}),` tab: the `,_jsx(_components.strong,{children:`Application (client) ID`}),`, the `,_jsx(_components.strong,{children:`Directory (tenant) ID`}),` and the secret `,_jsx(_components.strong,{children:`Value`}),` you\ncopied`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Certificate Authentication`}),` tab: the two IDs, the `,_jsx(_components.code,{children:`.pfx`}),` in the `,_jsx(_components.strong,{children:`Private Key (PFX)`}),` field and the export\npassword you set in the `,_jsx(_components.strong,{children:`Certificate Password`}),` field. Each field is labelled with the connector’s name.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`An account created on the form of one Microsoft 365 connector is also listed on the forms of the other three,\nso one app registration needs only one credential. Grant the app the permissions of every connector that uses it:\nthe connector checks report a missing permission.\nCredentials created before credential sharing existed stay on the form of their own connector.`}),`\n`,_jsx(Heading,{level:`2`,id:`limiting-the-app-to-specific-sites`,children:`Limiting the app to specific sites`}),`\n`,_jsxs(_components.p,{children:[`By default the app holds `,_jsx(_components.strong,{children:`Sites.Read.All`}),`, which lets it read every SharePoint site in the tenant,\neven when a connector names only one. If that is too broad,\ngrant `,_jsx(_components.strong,{children:`Sites.Selected`}),` instead and authorize the app one site at a time. The app can read nothing until you do.\nThis applies to both authentication methods, to a user’s OneDrive, which is a site of its own,\nand to the SharePoint sites behind Teams channel files.`]}),`\n`,_jsx(_components.p,{children:`The role you grant depends on what the connector does:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Connector use`}),_jsx(_components.th,{children:`Role to grant on each site`}),_jsx(_components.th,{children:`Entra permission also needed`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`SharePoint indexing only`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read`})}),_jsxs(_components.td,{children:[`Microsoft Graph → `,_jsx(_components.strong,{children:`Sites.Selected`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`SharePoint indexing with permission sync`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`fullcontrol`})}),_jsxs(_components.td,{children:[`Microsoft Graph → `,_jsx(_components.strong,{children:`Sites.Selected`}),`. The per-site grant replaces tenant-wide `,_jsx(_components.strong,{children:`Sites.FullControl.All`}),` on the SharePoint API.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OneDrive indexing and permission sync`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`read`})}),_jsxs(_components.td,{children:[`Microsoft Graph → `,_jsx(_components.strong,{children:`Sites.Selected`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Teams `,_jsx(_components.strong,{children:`Include Attachments`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`fullcontrol`})}),_jsxs(_components.td,{children:[`Microsoft Graph → `,_jsx(_components.strong,{children:`Files.Read.All`}),`, which the connector needs to read channel files. Private and shared channels each have a site of their own.`]})]})]})]}),`\n`,_jsxs(Accordion,{title:`Granting a site to the app`,id:`granting-a-site-to-the-app`,children:[_jsxs(_components.p,{children:[`You need a Global Administrator or SharePoint Administrator account.\nThe steps below use `,_jsx(_components.a,{href:`https://developer.microsoft.com/en-us/graph/graph-explorer`,children:`Microsoft Graph Explorer`}),`.\nYou can do the same with `,_jsx(_components.a,{href:`https://pnp.github.io/powershell/cmdlets/Grant-PnPAzureADAppSitePermission.html`,children:`PnP\nPowerShell`}),`\n(`,_jsx(_components.code,{children:`Grant-PnPAzureADAppSitePermission`}),`).`]}),_jsxs(Steps,{children:[_jsx(Step,{title:`Sign in and consent`,children:_jsxs(_components.p,{children:[`Sign in to Graph Explorer,\nthen select your profile icon → `,_jsx(_components.strong,{children:`Consent to permissions`}),` and enable `,_jsx(_components.strong,{children:`Sites.FullControl.All`}),`.\nThis lets Graph Explorer grant site permissions. It grants nothing to your Onyx application.`]})}),_jsxs(Step,{title:`Find the site ID`,children:[_jsxs(_components.p,{children:[`Run a `,_jsx(_components.strong,{children:`GET`}),` request, substituting your tenant and site name:`]}),_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/YourSiteName?$select=id`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`For a OneDrive, the site is `,_jsx(_components.code,{children:`contoso-my.sharepoint.com:/personal/jane_contoso_com`}),`.\nCopy the `,_jsx(_components.code,{children:`id`}),` from the response. It is a three-part value such as `,_jsx(_components.code,{children:`contoso.sharepoint.com,5a58bb09-…,9f2ec1da-…`}),`.`]})]}),_jsxs(Step,{title:`Grant the role`,children:[_jsxs(_components.p,{children:[`Change the method to `,_jsx(_components.strong,{children:`POST`}),`, using the site ID you just copied:`]}),_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`POST https://graph.microsoft.com/v1.0/sites/{site-id}/permissions`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`Send this body. Set `,_jsx(_components.code,{children:`roles`}),` to `,_jsx(_components.code,{children:`[\"read\"]`}),` for indexing only, or `,_jsx(_components.code,{children:`[\"fullcontrol\"]`}),` for permission sync.\nSet `,_jsx(_components.code,{children:`id`}),` to your Onyx application’s `,_jsx(_components.strong,{children:`Application (client) ID`}),`.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"roles\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"read\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"grantedToIdentities\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"application\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"00000000-0000-0000-0000-000000000000\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"displayName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Onyx Microsoft 365 Connector\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.p,{children:[`A successful grant returns `,_jsx(_components.code,{children:`201 Created`}),`.`]})]}),_jsxs(Step,{title:`Verify`,children:[_jsxs(_components.p,{children:[`Change the method back to `,_jsx(_components.strong,{children:`GET`}),` on the same URL,\nand confirm the role you granted appears against your application.`]}),_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET https://graph.microsoft.com/v1.0/sites/{site-id}/permissions`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]})]}),_jsx(_components.p,{children:`Repeat the last three steps for every site the connector indexes.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`national-clouds`,children:`National clouds`}),`\n`,_jsxs(_components.p,{children:[`Each connector has `,_jsx(_components.strong,{children:`Authority Host`}),` and `,_jsx(_components.strong,{children:`Graph API Host`}),` under its advanced settings,\nand the SharePoint connector has `,_jsx(_components.strong,{children:`SharePoint Domain Suffix`}),` as well. All must describe the same cloud.\nOnyx rejects an authority host that does not match the Graph host when you save,\nand corrects a domain suffix that does not match the Graph host with a warning in its log.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Cloud`}),_jsx(_components.th,{children:`Authority Host`}),_jsx(_components.th,{children:`Graph API Host`}),_jsx(_components.th,{children:`Domain Suffix`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Commercial`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://login.microsoftonline.com`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://graph.microsoft.com`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sharepoint.com`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`US Government (GCC High)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://login.microsoftonline.us`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://graph.microsoft.us`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sharepoint.us`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`US Government (DoD)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://login.microsoftonline.us`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://dod-graph.microsoft.us`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sharepoint.us`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`China (21Vianet)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://login.chinacloudapi.cn`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://microsoftgraph.chinacloudapi.cn`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sharepoint.cn`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Germany`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://login.microsoftonline.de`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://graph.microsoft.de`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sharepoint.de`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`rotating-the-secret-or-certificate`,children:`Rotating the secret or certificate`}),`\n`,_jsx(_components.p,{children:`Indexing stops when the secret or certificate expires. To rotate without downtime:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add the new one alongside the old`,children:_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Certificates \u0026 secrets`}),`, add a new client secret and copy its value, or upload the new public certificate.\nEntra holds more than one at a time, and both work until the old one expires.`]})}),_jsx(Step,{title:`Update the credential in Onyx`,children:_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Admin Panel → Connectors`}),`, open any Microsoft 365 connector form and expand `,_jsx(_components.strong,{children:`Saved Accounts`}),`.\nSelect the account that uses this app registration, select `,_jsx(_components.strong,{children:`Update Credentials`}),`, and replace the secret value,\nor the `,_jsx(_components.code,{children:`.pfx`}),` and its password. A shared account updates every connector that uses it.\nIf you entered the app registration once per connector, update each of those credentials.`]})}),_jsx(Step,{title:`Delete the old one`,children:_jsx(_components.p,{children:`Once an indexing attempt has succeeded, delete the previous secret or certificate in Entra.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(_components.p,{children:`Credential, consent and certificate problems, with the message each connector shows for them.\nEach connector’s page lists the problems that are its own.`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`invalid_client, Invalid or expired Microsoft Teams credentials, Microsoft rejected the client secret or certificate, or an error that names AADSTS7000215 or AADSTS7000222`,id:`invalid-client-invalid-or-expired-microsoft-teams-credentials-microsoft-rejected-the-client-secret-or-certificate-or-an-error-that-names-aadsts7000215-or-aadsts7000222`,children:_jsxs(_components.p,{children:[`Entra does not recognize the secret or certificate, or it belongs to another app registration. For a secret,\ncheck that you copied the `,_jsx(_components.strong,{children:`Value`}),` rather than the `,_jsx(_components.strong,{children:`Secret ID`}),`, and that it has not passed its expiry date.\nFor a certificate, it has usually expired,\nor the `,_jsx(_components.code,{children:`.pfx`}),` and the uploaded public certificate came from different certificates.\nCreate a new one and update the credential.`]})}),_jsx(Accordion,{title:`Microsoft does not know this directory`,id:`microsoft-does-not-know-this-directory`,children:_jsxs(_components.p,{children:[`The directory ID or the authority host is wrong. For a national cloud,\nset every host from the same row of `,_jsx(_components.a,{href:`#national-clouds`,children:`National clouds`}),`.`]})}),_jsx(Accordion,{title:`Upload a certificate (public key) with one of the following file types`,id:`upload-a-certificate-public-key-with-one-of-the-following-file-types`,children:_jsxs(_components.p,{children:[`You uploaded the `,_jsx(_components.code,{children:`.pfx`}),` to Entra. Upload the `,_jsx(_components.code,{children:`.crt`}),`, `,_jsx(_components.code,{children:`.cer`}),`, or `,_jsx(_components.code,{children:`.pem`}),` instead, and keep the `,_jsx(_components.code,{children:`.pfx`}),` for Onyx.`]})}),_jsx(Accordion,{title:`Failed to load certificate, or The PFX bundle could not be opened`,id:`failed-to-load-certificate-or-the-pfx-bundle-could-not-be-opened`,children:_jsxs(_components.p,{children:[`Onyx could not open the `,_jsx(_components.code,{children:`.pfx`}),`, usually because the password is wrong or the file is not a `,_jsx(_components.code,{children:`.pfx`}),` at all.\nRepeat `,_jsx(_components.a,{href:`#certificate`,children:`Certificate`}),`.`]})}),_jsx(Accordion,{title:`Unsupported app only token`,id:`unsupported-app-only-token`,children:_jsxs(_components.p,{children:[`SharePoint permission sync or Teams channel files are running on a client secret credential,\nand SharePoint will not release permission data to an app that signed in with a secret.\nCheck which credential the connector is attached to, and rebuild it with a `,_jsx(_components.a,{href:`#certificate`,children:`certificate`}),`.`]})}),_jsx(Accordion,{title:`Permissions show as not granted`,id:`permissions-show-as-not-granted`,children:_jsxs(_components.p,{children:[`Admin consent was never given, or was given before you added the last permission.\nSelect `,_jsx(_components.strong,{children:`Grant admin consent`}),` again.`]})}),_jsx(Accordion,{title:`A permission shows Granted but Microsoft still answers 403`,id:`a-permission-shows-granted-but-microsoft-still-answers-403`,children:_jsxs(_components.p,{children:[`The permission was added on the wrong API. SharePoint checks its own `,_jsx(_components.strong,{children:`Sites.FullControl.All`}),`,\nand a Graph permission with the same name does not count.`]})}),_jsx(Accordion,{title:`A setup check passes, then fails minutes later`,id:`a-setup-check-passes-then-fails-minutes-later`,children:_jsx(_components.p,{children:`Microsoft is still applying a permission, consent or application access policy change.\nWait about half an hour and retry before you change anything else.`})}),_jsx(Accordion,{title:`Indexing worked, then stopped on a fixed date`,id:`indexing-worked-then-stopped-on-a-fixed-date`,children:_jsxs(_components.p,{children:[`The secret or certificate expired. See `,_jsx(_components.a,{href:`#rotating-the-secret-or-certificate`,children:`Rotating the secret or certificate`}),`.`]})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Microsoft 365 Setup","description":"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares","href":"/admins/connectors/official/microsoft-365/setup"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you begin","slug":"before-you-begin","depth":2,"children":[]},{"title":"Choose an authentication method","slug":"choose-an-authentication-method","depth":2,"children":[]},{"title":"Permissions","slug":"permissions","depth":2,"children":[]},{"title":"Register the application","slug":"register-the-application","depth":2,"children":[]},{"title":"Grant permissions","slug":"grant-permissions","depth":2,"children":[]},{"title":"Create the credential","slug":"create-the-credential","depth":2,"children":[{"title":"Client secret","slug":"client-secret","depth":3,"children":[]},{"title":"Certificate","slug":"certificate","depth":3,"children":[]},{"title":"Enter the credential in Onyx","slug":"enter-the-credential-in-onyx","depth":3,"children":[]}]},{"title":"Limiting the app to specific sites","slug":"limiting-the-app-to-specific-sites","depth":2,"children":[]},{"title":"National clouds","slug":"national-clouds","depth":2,"children":[]},{"title":"Rotating the secret or certificate","slug":"rotating-the-secret-or-certificate","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"danswer","siteName":"Onyx Documentation","title":"Microsoft 365 Setup - Onyx Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T19:45:05.701Z","originalFileLocation":"admins/connectors/official/microsoft-365/setup.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares\">\u003cmeta data-mint-head name=\"keywords\" content=\"enterprise search, onyx ai, onyx, open source ai, enterprise ai, generative ai platform, ai assistant, knowledge management, danswer\">\u003cmeta data-mint-head name=\"application-name\" content=\"Onyx Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Microsoft 365 Setup - Onyx Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Onyx Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://danswer.mintlify.site/_mintlify/api/og/v2?division=Microsoft+365\u0026amp;title=Microsoft+365+Setup\u0026amp;description=The+Microsoft+Entra+app+registration%2C+permissions+and+credential+that+every+Microsoft+365+connector+shares\u0026amp;theme=602dd50adaaee2498be7103f\u0026amp;signature=59a7f31e684fcf37e6b553fa10f9eb2dcf33b47ec96fb44b54688167840f9dd4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Microsoft 365 Setup - Onyx Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://danswer.mintlify.site/_mintlify/api/og/v2?division=Microsoft+365\u0026amp;title=Microsoft+365+Setup\u0026amp;description=The+Microsoft+Entra+app+registration%2C+permissions+and+credential+that+every+Microsoft+365+connector+shares\u0026amp;theme=602dd50adaaee2498be7103f\u0026amp;signature=59a7f31e684fcf37e6b553fa10f9eb2dcf33b47ec96fb44b54688167840f9dd4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/danswer/dnsxLL69h2aR36l9/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Onyx Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0069ED\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/admins/connectors/official/microsoft-365/setup.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.onyx.app/#organization\",\"name\":\"Onyx Documentation\",\"url\":\"https://docs.onyx.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/danswer/TrJ0UalhtrxYEGaI/assets/logo/onyx_logo.svg?fit=max\u0026auto=format\u0026n=TrJ0UalhtrxYEGaI\u0026q=85\u0026s=7c6a59073e62a51c501463d3d7d79c42\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.onyx.app#website\",\"name\":\"Onyx Documentation\",\"url\":\"https://docs.onyx.app\",\"publisher\":{\"@id\":\"https://docs.onyx.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup#webpage\",\"url\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup\",\"name\":\"Microsoft 365 Setup\",\"description\":\"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares\",\"dateModified\":\"2026-10-28T19:45:05.701Z\",\"isPartOf\":{\"@id\":\"https://docs.onyx.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Connectors\",\"item\":\"https://docs.onyx.app/admins/connectors/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Supported Connectors\",\"item\":\"https://docs.onyx.app/admins/connectors/official/airtable\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Microsoft 365 Setup\",\"item\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup#article\",\"headline\":\"Microsoft 365 Setup\",\"name\":\"Microsoft 365 Setup\",\"description\":\"The Microsoft Entra app registration, permissions and credential that every Microsoft 365 connector shares\",\"url\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup\",\"mainEntityOfPage\":{\"@id\":\"https://docs.onyx.app/admins/connectors/official/microsoft-365/setup#webpage\"},\"dateModified\":\"2026-10-28T19:45:05.701Z\",\"publisher\":{\"@id\":\"https://docs.onyx.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.onyx.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Onyx Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Onyx Documentation","nav":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://onyx.app/"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/TDJ59cGV2X"}]},"tabs":[{"tab":"Overview","icon":"house","pages":[{"title":"Overview","href":"/welcome"}]},{"tab":"Deployment","icon":"server","pages":[{"title":"Deployment","href":"/deployment/overview"}]},{"tab":"Admins","icon":"user-shield","pages":[{"group":"Getting Started","pages":[{"title":"Overview","icon":"chart-simple","href":"/admins/overview"},{"title":"Enterprise Edition","icon":"building","href":"/admins/getting_started/enterprise_edition"}]},{"group":"Language Models","pages":[{"title":"Overview","icon":"sliders","href":"/admins/ai_models/overview"},{"group":"Supported Providers","icon":"microchip","pages":[{"title":"OpenAI","icon":"bolt","href":"/admins/ai_models/openai"},{"title":"Anthropic","icon":"brain","href":"/admins/ai_models/anthropic"},{"title":"Ollama","icon":"robot","href":"/admins/ai_models/ollama"},{"title":"LM Studio","icon":"desktop","href":"/admins/ai_models/lm_studio"},{"title":"Azure OpenAI","icon":"microsoft","href":"/admins/ai_models/azure_openai"},{"title":"Amazon Bedrock","icon":"aws","href":"/admins/ai_models/bedrock"},{"title":"Google Vertex AI","icon":"google","href":"/admins/ai_models/google_ai"},{"title":"OpenRouter","icon":"robot","href":"/admins/ai_models/openrouter"},{"title":"Bifrost","icon":"server","href":"/admins/ai_models/bifrost"},{"title":"Portkey","icon":"server","href":"/admins/ai_models/portkey"},{"title":"Vercel AI Gateway","icon":"server","href":"/admins/ai_models/vercel_ai_gateway"},{"title":"Nebius TokenFactory","icon":"server","href":"/admins/ai_models/nebius_tokenfactory"},{"title":"LiteLLM Proxy","icon":"server","href":"/admins/ai_models/litellm_proxy"},{"title":"Custom Inference Provider","icon":"server","href":"/admins/ai_models/custom_inference_provider"}]}]},{"group":"Connectors","pages":[{"title":"Overview","icon":"circle-nodes","href":"/admins/connectors/overview"},{"group":"Supported Connectors","icon":"plug","pages":[{"title":"Airtable","href":"/admins/connectors/official/airtable"},{"title":"Asana","href":"/admins/connectors/official/asana"},{"title":"Axero","href":"/admins/connectors/official/axero"},{"title":"Bitbucket","href":"/admins/connectors/official/bitbucket"},{"title":"BookStack","href":"/admins/connectors/official/bookstack"},{"title":"Braintrust","href":"/admins/connectors/official/braintrust"},{"title":"Box","href":"/admins/connectors/official/box"},{"title":"Canvas","href":"/admins/connectors/official/canvas"},{"title":"ClickUp","href":"/admins/connectors/official/clickup"},{"title":"Coda","href":"/admins/connectors/official/coda"},{"group":"Confluence","pages":[{"title":"Confluence overview","href":"/admins/connectors/official/confluence"},{"title":"Confluence Cloud","href":"/admins/connectors/official/confluence-cloud"},{"title":"Confluence Data Center and Server","href":"/admins/connectors/official/confluence-data-center"}]},{"title":"Discord","href":"/admins/connectors/official/discord"},{"title":"Discourse","href":"/admins/connectors/official/discourse"},{"title":"Document360","href":"/admins/connectors/official/document360"},{"title":"Dropbox","href":"/admins/connectors/official/dropbox"},{"title":"Drupal Wiki","href":"/admins/connectors/official/drupal_wiki"},{"title":"Egnyte","href":"/admins/connectors/official/egnyte"},{"title":"File","href":"/admins/connectors/official/file"},{"title":"Fireflies","href":"/admins/connectors/official/fireflies"},{"title":"Freshdesk","href":"/admins/connectors/official/freshdesk"},{"title":"GitBook","href":"/admins/connectors/official/gitbook"},{"title":"GitHub","href":"/admins/connectors/official/github"},{"title":"GitLab","href":"/admins/connectors/official/gitlab"},{"group":"Gmail","pages":[{"title":"Gmail Overview","href":"/admins/connectors/official/gmail/overview"},{"title":"Gmail OAuth","href":"/admins/connectors/official/gmail/oauth"},{"title":"Gmail Service Account","href":"/admins/connectors/official/gmail/service_account"}]},{"group":"Google Drive","pages":[{"title":"Google Drive Overview","href":"/admins/connectors/official/google_drive/overview"},{"title":"Google Drive OAuth","href":"/admins/connectors/official/google_drive/oauth"},{"title":"Google Drive Service Account","href":"/admins/connectors/official/google_drive/service_account"}]},{"title":"Google Sites","href":"/admins/connectors/official/google_sites"},{"title":"Google Cloud Storage","href":"/admins/connectors/official/google_storage"},{"title":"Gong","href":"/admins/connectors/official/gong"},{"title":"Guru","href":"/admins/connectors/official/guru"},{"title":"Highspot","href":"/admins/connectors/official/highspot"},{"title":"HubSpot","href":"/admins/connectors/official/hubspot"},{"title":"Email (IMAP)","href":"/admins/connectors/official/imap"},{"title":"Jira","href":"/admins/connectors/official/jira"},{"title":"Linear","href":"/admins/connectors/official/linear"},{"title":"Loopio","href":"/admins/connectors/official/loopio"},{"title":"LumApps","href":"/admins/connectors/official/lumapps"},{"title":"MediaWiki","description":"Access wiki articles from MediaWiki","href":"/admins/connectors/official/mediawiki"},{"group":"Microsoft 365","pages":[{"title":"Microsoft 365 Setup","href":"/admins/connectors/official/microsoft-365/setup"},{"title":"SharePoint","description":"Index files and pages from the SharePoint sites in your Microsoft 365 tenant","href":"/admins/connectors/official/microsoft-365/sharepoint"},{"title":"OneDrive","href":"/admins/connectors/official/microsoft-365/onedrive"},{"title":"Microsoft Teams","href":"/admins/connectors/official/microsoft-365/teams"},{"title":"Outlook","href":"/admins/connectors/official/microsoft-365/outlook"}]},{"title":"Notion","href":"/admins/connectors/official/notion"},{"title":"Oracle Cloud Storage","href":"/admins/connectors/official/oci_storage"},{"title":"Outline","href":"/admins/connectors/official/outline"},{"title":"Productboard","href":"/admins/connectors/official/productboard"},{"title":"Cloudflare R2","href":"/admins/connectors/official/r2"},{"title":"Salesforce","href":"/admins/connectors/official/salesforce"},{"group":"S3","pages":[{"title":"S3 Overview","href":"/admins/connectors/official/s3/overview"},{"title":"S3 Access Keys","href":"/admins/connectors/official/s3/access-keys"},{"title":"S3 Assume Role","href":"/admins/connectors/official/s3/assume-role"},{"title":"S3 IAM Role","href":"/admins/connectors/official/s3/iam-role"}]},{"group":"Slack","pages":[{"title":"Slack Indexed","href":"/admins/connectors/official/slack/slack_indexed"},{"title":"Slack Federated","href":"/admins/connectors/official/slack/slack_federated"}]},{"title":"Slab","href":"/admins/connectors/official/slab"},{"title":"TestRail","href":"/admins/connectors/official/testrail"},{"title":"Web","href":"/admins/connectors/official/web"},{"title":"Wikipedia","href":"/admins/connectors/official/wikipedia"},{"title":"XenForo","href":"/admins/connectors/official/xenforo"},{"title":"YouTrack","href":"/admins/connectors/official/youtrack"},{"title":"Zendesk","href":"/admins/connectors/official/zendesk"},{"title":"Zoom","href":"/admins/connectors/official/zoom"},{"title":"Zulip","href":"/admins/connectors/official/zulip"}]}]},{"group":"Managing Features","pages":[{"group":"RAG and Search","icon":"magnifying-glass","pages":[{"title":"RAG and Search","icon":"magnifying-glass","href":"/admins/managing_features/rag_and_search"},{"title":"Connectors","icon":"plug","href":"/admins/managing_features/connectors_link"},{"title":"Index Settings","icon":"database","href":"/admins/advanced_configs/search_configs"},{"title":"Document Sets","icon":"folder-open","href":"/admins/managing_features/document_sets"},{"title":"OpenSearch Document Index Migration","icon":"arrow-right-arrow-left","href":"/admins/advanced_configs/opensearch_document_index_migration"},{"title":"Object Store Migration","icon":"arrow-right-arrow-left","href":"/admins/advanced_configs/object_store_migration"}]},{"title":"Chat Preferences","icon":"comment","href":"/admins/managing_features/chat"},{"title":"Custom Agents","icon":"robot","href":"/admins/agents/overview"},{"group":"Plugins","icon":"plug","pages":[{"title":"Overview","icon":"plug","href":"/admins/plugins/overview"},{"title":"MCP","icon":"server","href":"/admins/plugins/mcp"},{"title":"OpenAPI","icon":"code","href":"/admins/plugins/openapi"},{"title":"Craft Apps","icon":"hammer","href":"/admins/plugins/craft_apps"}]},{"group":"Built-in Actions","pages":[{"title":"Web Search","icon":"globe","href":"/admins/actions/web_search"},{"title":"Code Interpreter","icon":"code","href":"/admins/actions/code_interpreter"},{"title":"Image Generation","icon":"image","href":"/admins/actions/image_generation"},{"title":"Voice","icon":"microphone","href":"/admins/actions/voice_mode"},{"title":"Coding Agent","icon":"code-branch","href":"/admins/actions/coding_agent"}]},{"group":"Craft","icon":"hammer","pages":[{"title":"Overview","icon":"hammer","href":"/admins/managing_features/craft"},{"title":"Skills","icon":"wand-magic-sparkles","href":"/admins/managing_features/craft_skills"}]}]},{"group":"Access Control","pages":[{"title":"Users and Groups","icon":"users","href":"/admins/user_management/users_and_groups"},{"title":"Understanding Permissions","icon":"shield-check","href":"/admins/permissions/understanding_permissions"},{"title":"What's Changing in Permissions","icon":"arrow-right-arrow-left","href":"/admins/permissions/whats_changing"},{"title":"SCIM","icon":"arrows-rotate","href":"/deployment/authentication/scim"},{"title":"Service Accounts","icon":"key","href":"/admins/user_management/api_keys"}]},{"group":"Advanced Configs","pages":[{"title":"Spending Limits","icon":"dollar-sign","href":"/admins/advanced_configs/spending_limits"},{"title":"White Labeling","icon":"brush","href":"/admins/advanced_configs/white_labeling"},{"title":"Language Model Access Controls","icon":"lock","href":"/admins/advanced_configs/llm_access_controls"},{"title":"Security \u0026 Hardening","icon":"shield","href":"/admins/advanced_configs/security_hardening"},{"title":"Hook Extensions","icon":"webhook","href":"/admins/advanced_configs/hook_extensions"},{"title":"Tracing","icon":"chart-line","href":"/admins/advanced_configs/tracing"},{"title":"Terraform Provider","icon":"cubes","href":"/admins/advanced_configs/terraform_provider"},{"title":"Slack Bot","icon":"slack","href":"/admins/getting_started/slack_bot_setup"},{"title":"Discord Bot","icon":"discord","href":"/admins/miscellaneous/discord_bot"}]},{"group":"Usage \u0026 Analytics","pages":[{"title":"Usage Analytics","icon":"chart-line","href":"/admins/analytics/overview"},{"title":"Query History","icon":"clock-rotate-left","href":"/admins/analytics/query_history"},{"title":"Custom Analytics","icon":"chart-mixed","href":"/admins/analytics/custom_analytics"}]},{"group":"Auditing","pages":[{"title":"Audit Logs \u0026 SIEM Integration","icon":"shield-check","href":"/admins/auditing/audit_logs"}]},{"group":"Plans \u0026 Billing","pages":[{"title":"Plans \u0026 Billing","icon":"wallet","href":"/admins/billing/overview"},{"title":"Subscribe to a Plan","icon":"credit-card","href":"/admins/billing/subscribing"},{"title":"Manage Your Subscription","icon":"gear","href":"/admins/billing/manage"},{"title":"Troubleshooting","icon":"wrench","href":"/admins/billing/troubleshooting"}]},{"group":"Miscellaneous","pages":[{"title":"Contact Us","icon":"comments","href":"/admins/miscellaneous/contact_us"}]}]},{"tab":"Developers","icon":"square-terminal","pages":[{"title":"Developers","href":"/developers/overview"}]},{"tab":"Security","icon":"shield","pages":[{"title":"Security","href":"/security/architecture/system_description"}]},{"tab":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"Agent Wiki","icon":"book","hidden":true,"pages":[{"title":"Agent Wiki","href":"/agent-wiki/welcome"}]}]},"basePath":"","title":"Microsoft 365 Setup - Onyx Documentation","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":["10e4515597"],"chunks":["BannerMarkdown-C79IUEr8.js","dist-DE3EVdvd.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-DK3K4Z1S.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}