Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.
SAML 2.0 is the XML-based single sign-on standard most enterprise identity providers (IdPs) support. You exchange two sets of values: CloudThinker’s service provider (SP) details go into your IdP, and your IdP’s details go back into CloudThinker.
The wizard at Admin Settings → Identity and access → Setup SSO → SAML 2.0 has three steps: Protocol, SP Metadata and IdP Config.
Direction
Values
Where you find them
CloudThinker → your IdP
ACS URL (Assertion Consumer Service), ending in /api/v1/sso/saml/acs, and SP Entity ID, ending in /api/v1/sso/saml/metadata
The SP Metadata step, each with a copy button. Both are the same for every connection, so you can copy them before entering any IdP values and send them to your IdP admin.
Your IdP → CloudThinker
IdP Entity ID, SSO URL, IdP Certificate
Your IdP’s SAML app, or its metadata URL. Import takes a URL only; there’s no file upload or pasted XML.
Attributes your IdP sends
Email (required), first name, last name
Your IdP’s attribute mapping
On the IdP Config step, paste your IdP’s metadata URL into the field at the top and click Import. CloudThinker fills IdP Entity ID, SSO URL and IdP Certificate, plus SLO URL and Name ID Format when the metadata includes them.
CloudThinker reads the user’s email from an email, mail, emailAddress or Microsoft emailaddress claim, and falls back to the NameID when it’s an email. If your NameID isn’t an email (for example Persistent or Transient), you must send an email attribute, or sign-in fails. First and last name come from firstName/givenName and lastName/surname.
Start the wizard, choose SAML 2.0, click Next, and keep the SP Metadata step open while you work in your IdP. Every provider also needs a Display Name on the IdP Config step; any label works, for example Company SSO.
Okta
Microsoft Entra ID
Google Workspace
AWS IAM Identity Center
OneLogin
Other SAML 2.0 provider
1
Create a SAML app integration
In the Okta Admin Console, go to Applications → Applications → Create App Integration → SAML 2.0. Name it CloudThinker.
2
Configure SAML settings
Okta field
Value
Single sign-on URL
CloudThinker’s ACS URL
Audience URI (SP Entity ID)
CloudThinker’s SP Entity ID
Name ID format
EmailAddress
Application username
Email
Assertion Signature (under Show Advanced Settings)
Signed
3
Add attribute statements
Name
Value
email
user.email
firstName
user.firstName
lastName
user.lastName
4
Copy the IdP metadata
Save the app. On its Sign On tab, click View SAML setup instructions. Copy the metadata URL, or copy Identity Provider Single Sign-On URL, Identity Provider Issuer and X.509 Certificate.
5
Assign people in Okta
On the app’s Assignments tab, assign the users or groups who need CloudThinker.
6
Finish in CloudThinker
Click Next to reach IdP Config. Import the metadata URL, or enter Identity Provider Issuer as IdP Entity ID, Identity Provider Single Sign-On URL as SSO URL, and X.509 Certificate as IdP Certificate. Click Create Connection.
1
Create an enterprise application
In the Azure portal, go to Microsoft Entra ID → Enterprise applications → New application → Create your own application. Name it CloudThinker, select Integrate any other application you don’t find in the gallery, and click Create.
2
Set up single sign-on
Open the app, go to Single sign-on → SAML, and edit Basic SAML Configuration:
Entra field
Value
Identifier (Entity ID)
CloudThinker’s SP Entity ID
Reply URL (Assertion Consumer Service URL)
CloudThinker’s ACS URL
Save.
3
Check attributes and claims
Entra’s default claims (emailaddress, givenname, surname) work as-is. Confirm emailaddress maps to user.mail and that your users have the mail attribute set.If some users have no mail attribute (common for cloud-only accounts), map emailaddress to user.userprincipalname instead. That only works when every UPN is on a verified domain.
4
Check the signing option
Under SAML Certificates, click Edit and set Signing Option to Sign SAML assertion or Sign SAML response and assertion. Sign SAML response alone fails.
5
Copy the federation metadata
Under SAML Certificates, copy the App Federation Metadata Url. Alternatively, download Certificate (Base64) and copy the Login URL and Microsoft Entra Identifier.
6
Assign users and finish in CloudThinker
Assign users or groups under Users and groups. In CloudThinker’s IdP Config step, Import the metadata URL, or enter the Entra Identifier as IdP Entity ID, the Login URL as SSO URL, and the Base64 certificate as IdP Certificate. Click Create Connection.
1
Create a custom SAML app
In the Google Admin console, go to Apps → Web and mobile apps → Add app → Add custom SAML app. Name it CloudThinker and click Continue.
2
Copy Google's IdP details
On Google Identity Provider details, copy the SSO URL, Entity ID and Certificate, or download the metadata. Click Continue.
3
Enter CloudThinker's SP details
Google field
Value
ACS URL
CloudThinker’s ACS URL
Entity ID
CloudThinker’s SP Entity ID
Name ID format
EMAIL
Name ID
Basic Information > Primary email
Signed response
Leave unchecked. Google signs the assertion by default.
Click Continue.
4
Map attributes
Google Directory attribute
App attribute
Primary email
email
First name
firstName
Last name
lastName
Click Finish. Then turn User access to ON for everyone, or for the organizational units that need CloudThinker.
5
Finish in CloudThinker
Google offers a metadata file, not a URL, and Import only takes a URL, so enter the values by hand. On the IdP Config step, enter Google’s Entity ID as IdP Entity ID, its SSO URL as SSO URL, and its certificate as IdP Certificate. Click Create Connection.
1
Add a custom SAML application
In the AWS console, go to IAM Identity Center → Applications → Add application → I have an application I want to set up → SAML 2.0. Name it CloudThinker.
2
Copy the IAM Identity Center metadata
Under IAM Identity Center metadata, copy the SAML metadata file URL, or the sign-in URL, issuer URL and certificate.
3
Enter the application metadata
IAM Identity Center field
Value
Application ACS URL
CloudThinker’s ACS URL
Application SAML audience
CloudThinker’s SP Entity ID
Submit the application.
4
Map attributes
Open Actions → Edit attribute mappings and add:
Attribute in the application
Maps to
Format
Subject
${user:email}
emailAddress
email
${user:email}
unspecified
firstName
${user:givenName}
unspecified
lastName
${user:familyName}
unspecified
5
Assign users and finish in CloudThinker
Assign users or groups to the app. In CloudThinker, Import the metadata URL, or enter the issuer URL as IdP Entity ID, the sign-in URL as SSO URL, and the certificate as IdP Certificate. Click Create Connection.
1
Add a SAML custom connector
In the OneLogin admin portal, go to Applications → Applications → Add App, search for SAML Custom Connector (Advanced), name it CloudThinker, and save.
2
Configure the connector
On the Configuration tab:
OneLogin field
Value
Audience (EntityID)
CloudThinker’s SP Entity ID
Recipient
CloudThinker’s ACS URL
ACS (Consumer) URL
CloudThinker’s ACS URL
ACS (Consumer) URL Validator
The ACS URL as a regex with dots escaped. For an ACS URL of https://api.example.com/api/v1/sso/saml/acs, enter ^https://api\.example\.com/api/v1/sso/saml/acs$, using the host from the ACS URL you copied
SAML signature element
Assertion or Both
3
Add parameters
On the Parameters tab, add email (Email), firstName (First Name) and lastName (Last Name), each with Include in SAML assertion checked.
4
Copy the IdP details
On the SSO tab, copy the Issuer URL, the SAML 2.0 Endpoint (HTTP) and the X.509 certificate.
5
Assign users and finish in CloudThinker
Add users on the Users tab. In CloudThinker, enter the Issuer URL as IdP Entity ID, the SAML 2.0 Endpoint as SSO URL, and the certificate as IdP Certificate. Click Create Connection.
1
Create a SAML app in your provider
Put CloudThinker’s ACS URL in your provider’s “Reply URL”, “ACS URL” or “Recipient” field, and the SP Entity ID in its “Audience” or “Entity ID” field. Send the user’s email as the NameID and as an email attribute, plus firstName and lastName. Sign the assertion.
2
Fill in IdP Config
Field
What to enter
Display Name
Any label, for example Company SSO
IdP Entity ID
Your provider’s entity ID, sometimes called “Issuer”
SSO URL
Your provider’s single sign-on endpoint
IdP Certificate
The X.509 signing certificate, including the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- lines
SLO URL (Optional)
Your provider’s single logout endpoint
Name ID Format
Email Address (default). Also offered: Persistent, Transient, Unspecified. With any of these, your IdP must also send an email attribute.
Click Create Connection.
Success state: the dialog shows SSO Connection Created and the connection is Active. Next, run the connection test and a test sign-in from Set up single sign-on.
Users enter their email on the CloudThinker sign-in page and click Continue with SSO. Opening CloudThinker from your IdP’s app dashboard (IdP-initiated sign-in) is not accepted.
Signed assertions required
Your IdP must sign the SAML assertion. Signing only the outer response isn’t enough.
Clock tolerance of 120 seconds
Assertions are rejected if your IdP’s clock and CloudThinker’s differ by more than two minutes.
Encrypted assertions not supported
CloudThinker has no SP decryption key. Turn off assertion encryption in your IdP, or sign-in fails.
AuthnRequests are unsigned
CloudThinker doesn’t sign the requests it sends. If your IdP requires signed AuthnRequests, turn that requirement off for this app.
No single logout
Signing out of CloudThinker ends only the CloudThinker session. CloudThinker stores the SLO URL but doesn’t send logout requests to your IdP or accept them from it.
One signing certificate
The IdP Certificate field holds one certificate. There’s no secondary certificate, so plan rotations as a cutover. See Rotate the IdP certificate.
SP Metadata URL after creation
Some IdPs can import an SP metadata URL. It appears on Manage → Configuration once the connection exists.
CloudThinker creates the account on the person’s first SSO sign-in, with the Auto-assigned organization role (default Viewer) and Auto-assigned workspaces you set.
The person has a pending invitation
The invitation’s role and workspaces apply instead. If the organization has no free seat, sign-in fails with “This organization has reached its seat limit.”
The person already has a CloudThinker account with the same email
CloudThinker links that account to your IdP. No duplicate is created.
Provisioning is Manual and the person has no account or invitation
Sign-in is refused. Invite them first.
You want IdP groups to decide access
SAML sign-in reads only email and name, not groups. Use SCIM to map groups to workspaces.
The organization Owner is exempt from Require SSO and can still sign in with an email code. See If your IdP is unavailable for the steps and the mailbox to set up first.
CloudThinker doesn’t warn before the stored certificate expires and doesn’t show its expiry date. Check the date in your IdP and set your own reminder.CloudThinker checks signatures against one certificate, so sign-ins fail between the moment your IdP starts signing with the new certificate and the moment you save it in CloudThinker. Keep that gap to a minute or two.
1
Prepare the new certificate in your IdP
Create or upload the new signing certificate, but don’t make it active yet. Copy it, including the BEGIN and END lines.
2
Switch your IdP to the new certificate
Make the new certificate active for the CloudThinker app.
3
Save it in CloudThinker right away
Open Manage → Configuration on the Single sign-on card, paste the certificate into IdP Certificate, and click Save Changes.
4
Test
Run the connection test from Manage → Overview, then sign in through SSO in a private window.Success state: the test passes Certificate Valid and the sign-in lands you in CloudThinker.
If something goes wrong, the Owner can still sign in with an email code and fix the certificate.
The ACS URL in your IdP must match CloudThinker’s ACS URL exactly, including https:// and with no trailing slash. Copy it again from the SP Metadata step or from Manage → Configuration.
'Audience mismatch' or 'Entity ID mismatch'
The audience or entity ID in your IdP must match CloudThinker’s SP Entity ID exactly. The comparison is case-sensitive.
Connection test fails on Certificate Valid
Paste the full certificate, including the BEGIN and END lines, with no extra characters. If your IdP rotated its certificate, paste the new one on Manage → Configuration and click Save Changes. To avoid this next time, follow Rotate the IdP certificate.
Sign-in works from CloudThinker but not from the IdP dashboard
That’s expected. IdP-initiated sign-in is off. Ask users to start at the CloudThinker sign-in page.
'SSO authentication failed. Please try again or contact your administrator.'
CloudThinker shows this one message for every rejected SAML response, so check these in order:
Assertion not signed: your IdP signs only the response. Turn on assertion signing (see your provider’s tab above).
Assertion encrypted: turn off assertion encryption for the CloudThinker app.
Wrong certificate: paste the IdP’s current signing certificate on Manage → Configuration.
Clock drift: your IdP’s clock is more than two minutes off.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"CloudThinker","colors":{"primary":"#0c93c0","light":"#2897c1","dark":"#0c93c0"},"logo":{"light":"https://mintcdn.com/cloudthinker/-4m9DUjwzDxHfABz/logo/light.svg?fit=max\u0026auto=format\u0026n=-4m9DUjwzDxHfABz\u0026q=85\u0026s=a56a571509d1cd246f5b0e68db015e5f","dark":"https://mintcdn.com/cloudthinker/-4m9DUjwzDxHfABz/logo/dark.svg?fit=max\u0026auto=format\u0026n=-4m9DUjwzDxHfABz\u0026q=85\u0026s=4252f33496bbaa527e5408338963a31e"},"favicon":"https://mintcdn.com/cloudthinker/PoYnb4baZ54aMMQW/favicon.ico?fit=max\u0026auto=format\u0026n=PoYnb4baZ54aMMQW\u0026q=85\u0026s=6570e99ed2a763d9632c8f933fe9c164","background":{"color":{"light":"#eef0f3","dark":"#000000"}},"navbar":{"links":[{"href":"https://discord.com/invite/sRBWRWtaNR","label":"Community"},{"href":"https://cloudthinker.io/blogs","label":"Blog"},{"href":"https://cloudthinker.io/contact","label":"Contact us"}],"primary":{"type":"button","label":"Open app","href":"https://app.cloudthinker.io"}},"footer":{"socials":{"x":"https://x.com/cloudthinkerio?s=21","linkedin":"https://www.linkedin.com/company/cloud-thinker","github":"https://github.com/cloudthinker-ai","discord":"https://discord.com/invite/sRBWRWtaNR","youtube":"https://www.youtube.com/@cloudthinkerai"}},"seo":{"indexing":"navigable"},"fonts":{"family":"Poppins"},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"metadata":{"timestamp":false},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"vi","href":""},{"language":"ja","href":""},{"language":"ko","href":""}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"cloudthinker","hasAudioNarration":false,"actualSubdomain":"cloudthinker","customDomains":["docs.cloudthinker.io"],"gitSource":{"type":"github","owner":"nhat-tranvan","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adddcaa087fb564296de741","collectionId":"6a0410ef-ac7e-420e-bb09-2fef712f563e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adddcaa087fb564296de741"},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{},"buildId":"6adddcaa087fb564296de741","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"Platform","count":67},{"language":"vi","tag":"Nền tảng","count":64},{"language":"en","tag":"Platform","count":63},{"language":"ja","tag":"プラットフォーム","count":63},{"language":"ko","tag":"플랫폼","count":63},{"language":"default","tag":"Connections","count":52},{"language":"vi","tag":"Kết nối","count":49},{"language":"en","tag":"Connections","count":48},{"language":"ja","tag":"接続","count":48},{"language":"ko","tag":"연결","count":48},{"language":"en","tag":"Products","count":29},{"language":"ja","tag":"プロダクト","count":29},{"language":"ko","tag":"제품","count":29},{"language":"vi","tag":"Sản phẩm","count":29},{"language":"default","tag":"Resources","count":26},{"language":"default","tag":"Products","count":24},{"language":"default","tag":"Learn","count":18},{"language":"default","tag":"Agentic Infrastructure Operations - Engineer Edition","count":18},{"language":"default","tag":"Get started","count":13},{"language":"en","tag":"Get started","count":13},{"language":"en","tag":"Resources","count":13},{"language":"ja","tag":"はじめに","count":13},{"language":"ja","tag":"リソース","count":13},{"language":"ko","tag":"시작하기","count":13},{"language":"ko","tag":"리소스","count":13},{"language":"vi","tag":"Bắt đầu","count":13},{"language":"vi","tag":"Tài nguyên","count":13},{"language":"en","tag":"Learn","count":12},{"language":"en","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"ja","tag":"Observability \u0026 Monitoring","count":12},{"language":"ja","tag":"学ぶ","count":12},{"language":"ja","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"ko","tag":"Observability \u0026 Monitoring","count":12},{"language":"ko","tag":"배우기","count":12},{"language":"ko","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"vi","tag":"Observability \u0026 Monitoring","count":12},{"language":"vi","tag":"Học","count":12},{"language":"vi","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"en","tag":"Monitoring","count":11},{"language":"en","tag":"Resolve","count":11},{"language":"ja","tag":"Resolve","count":11},{"language":"ko","tag":"Resolve","count":11},{"language":"vi","tag":"Resolve","count":11},{"language":"default","tag":"Resolve","count":9},{"language":"vi","tag":"Databases","count":9},{"language":"ja","tag":"Databases","count":8},{"language":"ko","tag":"Databases","count":8},{"language":"en","tag":"Work where you are","count":7},{"language":"default","tag":"Review","count":6},{"language":"default","tag":"Set up","count":6}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"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":"editor-v7-file-tree","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":"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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":".ct-landing a,a.ct-featured{text-decoration:none!important}a.ct-featured{display:block;margin:1.25rem 0 1rem;padding:1.75rem 1.75rem 1.5rem;border:1px solid rgba(12,147,192,.45)!important;border-radius:16px;background:radial-gradient(120% 160% at 0 0,rgba(12,147,192,.14),transparent 55%),#fff;box-shadow:0 12px 32px -16px rgba(12,147,192,.45);transition:border-color .15s ease,transform .15s ease,box-shadow .15s ease}a.ct-featured:hover{border-color:#0c93c0!important;transform:translateY(-1px);box-shadow:0 16px 40px -16px rgba(12,147,192,.6)}.dark a.ct-featured{border-color:rgba(40,151,193,.45)!important;background:radial-gradient(120% 160% at 0 0,rgba(40,151,193,.16),transparent 55%),#05070a;box-shadow:0 12px 32px -16px rgba(40,151,193,.35)}.dark a.ct-featured:hover{border-color:#2897c1!important}.ct-featured-head{display:flex;align-items:center;gap:.75rem;margin-bottom:.875rem}.ct-featured-icon{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:999px;background:rgba(12,147,192,.12);color:#0a7aa0}.dark .ct-featured-icon{background:rgba(40,151,193,.14);color:#5bb8e0}.ct-eyebrow{font-size:.75rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:#0a7aa0}.dark .ct-eyebrow{color:#5bb8e0}.ct-hero h1,.ct-title{font-weight:600;color:#0b1a2b}.ct-title{font-size:1.375rem;line-height:1.3}.dark .ct-card .ct-card-head span,.dark .ct-card h3,.dark .ct-hero h1,.dark .ct-section>h2,.dark .ct-step h3,.dark .ct-title{color:#f5f5f7}.ct-body{margin:.5rem 0 0!important;font-weight:400!important;font-size:1rem;max-width:46rem;color:#5b6577;line-height:1.6}.dark .ct-body,.dark .ct-hero .ct-promise,.dark .ct-hero p.ct-lead,.dark .ct-section>p.ct-section-lead{color:#a1a1a6}.ct-cta{display:inline-block;margin-top:1rem;font-weight:600;color:#0a7aa0}.dark .ct-cta{color:#5bb8e0}.ct-illustration{margin:1.5rem 0}.ct-illustration img{max-width:720px;margin:0 auto}.ct-iso-scene{margin:1.5rem 0 2rem;border:1px solid rgba(12,147,192,.18);border-radius:16px;background:#fff;overflow:hidden}.dark .ct-iso-scene{border-color:rgba(40,151,193,.22);background:#000}.ct-illustration img,.ct-iso-scene .ct-iso-svg{display:block;width:100%;height:auto}.ct-landing{max-width:1120px;margin:0 auto;padding:3rem 1.5rem 5rem}.ct-landing a{border-bottom-width:0}.ct-kicker{font-size:.8125rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#0c93c0}.dark .ct-card .ct-tagline,.dark .ct-hero .ct-promise strong,.dark .ct-kicker{color:#2897c1}.ct-hero{text-align:center;padding:1.5rem 0 1rem}.ct-hero h1{margin:.75rem 0 0;font-size:clamp(2.25rem,5vw,3.75rem);line-height:1.05;letter-spacing:-.03em;-webkit-text-fill-color:currentColor;background:0 0}.ct-hero .ct-promise{margin:1rem auto 0;font-size:clamp(1.125rem,2.2vw,1.5rem);color:#5b6577}.ct-hero .ct-promise strong,.ct-section>h2{color:#0c93c0;font-weight:600}.ct-hero p.ct-lead{max-width:44rem;margin:1rem auto 0;font-size:1.0625rem;line-height:1.65;color:#5b6577}.ct-actions{display:flex;flex-wrap:wrap;gap:.75rem;justify-content:center;margin-top:1.75rem}.ct-btn{display:inline-flex;align-items:center;gap:.5rem;padding:.7rem 1.25rem;border-radius:999px;font-weight:600;font-size:.95rem;transition:transform .15s ease,background .15s ease}.ct-btn:hover{transform:translateY(-1px)}.ct-btn-primary{background:#0c93c0;color:#fff!important}.ct-btn-primary:hover{background:#0a7aa0}.ct-btn-ghost{border:1px solid rgba(12,147,192,.35)!important;color:#0b1a2b!important}.dark .ct-btn-ghost{color:#f5f5f7!important;border-color:rgba(40,151,193,.4)!important}.ct-landing .ct-iso-scene{margin-top:2.5rem}.ct-section{margin-top:4.5rem}.ct-section>h2{margin:.4rem 0 0;font-size:1.75rem;letter-spacing:-.02em;color:#0b1a2b;-webkit-text-fill-color:currentColor;background:0 0}.ct-section>p.ct-section-lead{margin:.5rem 0 0;color:#5b6577;max-width:46rem}.ct-steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin-top:1.5rem}.ct-step{display:block;padding:1.25rem;border-radius:14px;border:1px solid rgba(12,147,192,.18)!important;background:#fff;transition:border-color .15s ease,transform .15s ease}.dark .ct-step{background:#05070a;border-color:rgba(40,151,193,.22)!important}.ct-step:hover{border-color:#0c93c0!important;transform:translateY(-1px)}.ct-step-num{display:inline-flex;width:1.75rem;height:1.75rem;border-radius:999px;align-items:center;justify-content:center;font-size:.85rem;font-weight:700;color:#fff;background:#0c93c0}.ct-card h3,.ct-step h3{margin:.75rem 0 .25rem;font-size:1.05rem}.ct-card p,.ct-step p{margin:0;font-size:.925rem;line-height:1.55;color:#5b6577}.dark .ct-card p,.dark .ct-landing td,.dark .ct-step p{color:#a1a1a6}.ct-grid{display:grid;gap:1rem;margin-top:1.5rem}.ct-grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ct-grid-5{grid-template-columns:repeat(5,minmax(0,1fr))}.ct-card{display:flex;flex-direction:column;padding:1.25rem;border-radius:14px;border:1px solid rgba(12,147,192,.18);background:#fff}.dark .ct-card{background:#05070a;border-color:rgba(40,151,193,.22)}.ct-card .ct-card-head{display:flex;align-items:center;gap:.6rem}.ct-card .ct-card-head span,.ct-card h3,.ct-step h3{font-weight:600;color:#0b1a2b}.ct-card .ct-tagline{margin-top:.75rem;font-size:1.05rem;font-weight:600;line-height:1.35;color:#0c93c0}.ct-card .ct-links{margin-top:auto;padding-top:1rem;display:flex;gap:1rem;font-size:.9rem;font-weight:600}.ct-card .ct-links a{color:#0c93c0!important}.dark .ct-card .ct-links a,.dark .ct-card-head .ct-arrow,.dark .ct-landing td a{color:#2897c1!important}a.ct-card{transition:border-color .15s ease,transform .15s ease}a.ct-card:hover{border-color:#0c93c0!important;transform:translateY(-1px)}.ct-strip{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:1.25rem}.ct-strip a{display:inline-flex;align-items:center;gap:.45rem;padding:.55rem .95rem;border-radius:999px;border:1px solid rgba(12,147,192,.25)!important;font-size:.9rem;font-weight:500;color:#0b1a2b!important}.dark .ct-strip a{color:#f5f5f7!important;border-color:rgba(40,151,193,.3)!important}.ct-strip a:hover{border-color:#0c93c0!important}@media (max-width:900px){.ct-grid-3,.ct-grid-5,.ct-steps{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:560px){.ct-landing{padding:2rem 1rem 4rem}.ct-grid-3,.ct-grid-5,.ct-steps{grid-template-columns:minmax(0,1fr)}}.ct-landing table{width:100%;margin-top:1.25rem;border-collapse:collapse;font-size:.925rem}.ct-landing th{text-align:left;font-weight:600;padding:.7rem .9rem;border-bottom:1px solid rgba(12,147,192,.3)}.ct-landing td{vertical-align:top;padding:.8rem .9rem;border-bottom:1px solid rgba(12,147,192,.12);color:#5b6577;line-height:1.55}.ct-landing td:first-child{font-weight:600;color:#0b1a2b;width:22%}.dark .ct-landing td:first-child{color:#f5f5f7}.ct-landing td a{color:#0c93c0!important;font-weight:600}.ct-product{padding:1.1rem 1.2rem}.ct-product .ct-tagline{margin-top:.55rem;font-size:1rem}.ct-product p{margin-top:.3rem}.ct-card-head .ct-arrow{margin-left:auto;font-weight:500!important;color:#0c93c0!important;transition:transform .15s ease}a.ct-product:hover .ct-arrow{transform:translateX(3px)}html:not(.dark) .ct-card,html:not(.dark) .ct-iso-scene,html:not(.dark) .ct-step{background:#f6f7f9}html:not(.dark) .ct-iso-scene{border-color:rgba(12,147,192,.12)}html:not(.dark) #content-area,html:not(.dark) .prose,html:not(.dark) body{color:#2b3240}html:not(.dark) .prose :where(h1, h2, h3, h4, strong){color:#1c2230}html:not(.dark) .ct-card .ct-card-head span,html:not(.dark) .ct-card h3,html:not(.dark) .ct-hero h1,html:not(.dark) .ct-section>h2,html:not(.dark) .ct-step h3{color:#1c2230}"}],"page":{"pagePath":"guide/security/sso-saml","slug":"/guide/security/sso-saml","pageMetadata":{"title":"Set Up SAML SSO","description":"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.","icon":"shield","href":"/guide/security/sso-saml"},"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: \"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.\"\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`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Heading,Step,Steps,Tab,Table,Tabs,Tip}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`SAML 2.0 is the XML-based single sign-on standard most enterprise identity providers (IdPs) support. You exchange two sets of values: CloudThinker’s service provider (SP) details go into your IdP, and your IdP’s details go back into CloudThinker.`}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`An organization on the `,_jsx(_components.strong,{children:`Scale`}),`, `,_jsx(_components.strong,{children:`Scale Plus`}),` or `,_jsx(_components.strong,{children:`Enterprise`}),` plan.`]}),`\n`,_jsxs(_components.li,{children:[`The organization `,_jsx(_components.strong,{children:`Owner`}),` role and a verified email domain. See `,_jsx(_components.a,{href:`/guide/security/sso`,children:`Set up single sign-on`}),`.`]}),`\n`,_jsx(_components.li,{children:`Admin access to your identity provider.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-you-exchange`,children:`What you exchange`}),`\n`,_jsxs(_components.p,{children:[`The wizard at `,_jsx(_components.strong,{children:`Admin Settings → Identity and access → Setup SSO → SAML 2.0`}),` has three steps: `,_jsx(_components.strong,{children:`Protocol`}),`, `,_jsx(_components.strong,{children:`SP Metadata`}),` and `,_jsx(_components.strong,{children:`IdP Config`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Direction`}),_jsx(_components.th,{children:`Values`}),_jsx(_components.th,{children:`Where you find them`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CloudThinker → your IdP`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`ACS URL (Assertion Consumer Service)`}),`, ending in `,_jsx(_components.code,{children:`/api/v1/sso/saml/acs`}),`, and `,_jsx(_components.strong,{children:`SP Entity ID`}),`, ending in `,_jsx(_components.code,{children:`/api/v1/sso/saml/metadata`})]}),_jsxs(_components.td,{children:[`The `,_jsx(_components.strong,{children:`SP Metadata`}),` step, each with a copy button. Both are the same for every connection, so you can copy them before entering any IdP values and send them to your IdP admin.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Your IdP → CloudThinker`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`IdP Entity ID`}),`, `,_jsx(_components.strong,{children:`SSO URL`}),`, `,_jsx(_components.strong,{children:`IdP Certificate`})]}),_jsxs(_components.td,{children:[`Your IdP’s SAML app, or its metadata URL. `,_jsx(_components.strong,{children:`Import`}),` takes a URL only; there’s no file upload or pasted XML.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Attributes your IdP sends`}),_jsx(_components.td,{children:`Email (required), first name, last name`}),_jsx(_components.td,{children:`Your IdP’s attribute mapping`})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`IdP Config`}),` step, paste your IdP’s metadata URL into the field at the top and click `,_jsx(_components.strong,{children:`Import`}),`. CloudThinker fills `,_jsx(_components.strong,{children:`IdP Entity ID`}),`, `,_jsx(_components.strong,{children:`SSO URL`}),` and `,_jsx(_components.strong,{children:`IdP Certificate`}),`, plus `,_jsx(_components.strong,{children:`SLO URL`}),` and `,_jsx(_components.strong,{children:`Name ID Format`}),` when the metadata includes them.`]})}),`\n`,_jsxs(_components.p,{children:[`CloudThinker reads the user’s email from an `,_jsx(_components.code,{children:`email`}),`, `,_jsx(_components.code,{children:`mail`}),`, `,_jsx(_components.code,{children:`emailAddress`}),` or Microsoft `,_jsx(_components.code,{children:`emailaddress`}),` claim, and falls back to the NameID when it’s an email. If your NameID isn’t an email (for example `,_jsx(_components.strong,{children:`Persistent`}),` or `,_jsx(_components.strong,{children:`Transient`}),`), you must send an email attribute, or sign-in fails. First and last name come from `,_jsx(_components.code,{children:`firstName`}),`/`,_jsx(_components.code,{children:`givenName`}),` and `,_jsx(_components.code,{children:`lastName`}),`/`,_jsx(_components.code,{children:`surname`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`configure-your-provider`,children:`Configure your provider`}),`\n`,_jsxs(_components.p,{children:[`Start the wizard, choose `,_jsx(_components.strong,{children:`SAML 2.0`}),`, click `,_jsx(_components.strong,{children:`Next`}),`, and keep the `,_jsx(_components.strong,{children:`SP Metadata`}),` step open while you work in your IdP. Every provider also needs a `,_jsx(_components.strong,{children:`Display Name`}),` on the `,_jsx(_components.strong,{children:`IdP Config`}),` step; any label works, for example `,_jsx(_components.code,{children:`Company SSO`}),`.`]}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Okta`,id:`okta`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Create a SAML app integration`,children:_jsxs(_components.p,{children:[`In the Okta Admin Console, go to `,_jsx(_components.strong,{children:`Applications → Applications → Create App Integration → SAML 2.0`}),`. Name it `,_jsx(_components.strong,{children:`CloudThinker`}),`.`]})}),_jsx(Step,{title:`Configure SAML settings`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Okta field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Single sign-on URL`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience URI (SP Entity ID)`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`SP Entity ID`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Name ID format`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`EmailAddress`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Application username`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Email`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Assertion Signature`}),` (under `,_jsx(_components.strong,{children:`Show Advanced Settings`}),`)`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Signed`})})]})]})]})}),_jsx(Step,{title:`Add attribute statements`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Name`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`email`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`user.email`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`firstName`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`user.firstName`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`lastName`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`user.lastName`})})]})]})]})}),_jsx(Step,{title:`Copy the IdP metadata`,children:_jsxs(_components.p,{children:[`Save the app. On its `,_jsx(_components.strong,{children:`Sign On`}),` tab, click `,_jsx(_components.strong,{children:`View SAML setup instructions`}),`. Copy the metadata URL, or copy `,_jsx(_components.strong,{children:`Identity Provider Single Sign-On URL`}),`, `,_jsx(_components.strong,{children:`Identity Provider Issuer`}),` and `,_jsx(_components.strong,{children:`X.509 Certificate`}),`.`]})}),_jsx(Step,{title:`Assign people in Okta`,children:_jsxs(_components.p,{children:[`On the app’s `,_jsx(_components.strong,{children:`Assignments`}),` tab, assign the users or groups who need CloudThinker.`]})}),_jsx(Step,{title:`Finish in CloudThinker`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Next`}),` to reach `,_jsx(_components.strong,{children:`IdP Config`}),`. `,_jsx(_components.strong,{children:`Import`}),` the metadata URL, or enter `,_jsx(_components.strong,{children:`Identity Provider Issuer`}),` as `,_jsx(_components.strong,{children:`IdP Entity ID`}),`, `,_jsx(_components.strong,{children:`Identity Provider Single Sign-On URL`}),` as `,_jsx(_components.strong,{children:`SSO URL`}),`, and `,_jsx(_components.strong,{children:`X.509 Certificate`}),` as `,_jsx(_components.strong,{children:`IdP Certificate`}),`. Click `,_jsx(_components.strong,{children:`Create Connection`}),`.`]})})]})}),_jsx(Tab,{title:`Microsoft Entra ID`,id:`microsoft-entra-id`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Create an enterprise application`,children:_jsxs(_components.p,{children:[`In the `,_jsx(_components.a,{href:`https://portal.azure.com`,children:`Azure portal`}),`, go to `,_jsx(_components.strong,{children:`Microsoft Entra ID → Enterprise applications → New application → Create your own application`}),`. Name it `,_jsx(_components.strong,{children:`CloudThinker`}),`, select `,_jsx(_components.strong,{children:`Integrate any other application you don’t find in the gallery`}),`, and click `,_jsx(_components.strong,{children:`Create`}),`.`]})}),_jsxs(Step,{title:`Set up single sign-on`,children:[_jsxs(_components.p,{children:[`Open the app, go to `,_jsx(_components.strong,{children:`Single sign-on → SAML`}),`, and edit `,_jsx(_components.strong,{children:`Basic SAML Configuration`}),`:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Entra field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Identifier (Entity ID)`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`SP Entity ID`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Reply URL (Assertion Consumer Service URL)`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`})]})]})]})]}),_jsx(_components.p,{children:`Save.`})]}),_jsxs(Step,{title:`Check attributes and claims`,children:[_jsxs(_components.p,{children:[`Entra’s default claims (`,_jsx(_components.code,{children:`emailaddress`}),`, `,_jsx(_components.code,{children:`givenname`}),`, `,_jsx(_components.code,{children:`surname`}),`) work as-is. Confirm `,_jsx(_components.code,{children:`emailaddress`}),` maps to `,_jsx(_components.code,{children:`user.mail`}),` and that your users have the mail attribute set.`]}),_jsxs(_components.p,{children:[`If some users have no mail attribute (common for cloud-only accounts), map `,_jsx(_components.code,{children:`emailaddress`}),` to `,_jsx(_components.code,{children:`user.userprincipalname`}),` instead. That only works when every UPN is on a verified domain.`]})]}),_jsx(Step,{title:`Check the signing option`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`SAML Certificates`}),`, click `,_jsx(_components.strong,{children:`Edit`}),` and set `,_jsx(_components.strong,{children:`Signing Option`}),` to `,_jsx(_components.strong,{children:`Sign SAML assertion`}),` or `,_jsx(_components.strong,{children:`Sign SAML response and assertion`}),`. `,_jsx(_components.strong,{children:`Sign SAML response`}),` alone fails.`]})}),_jsx(Step,{title:`Copy the federation metadata`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`SAML Certificates`}),`, copy the `,_jsx(_components.strong,{children:`App Federation Metadata Url`}),`. Alternatively, download `,_jsx(_components.strong,{children:`Certificate (Base64)`}),` and copy the `,_jsx(_components.strong,{children:`Login URL`}),` and `,_jsx(_components.strong,{children:`Microsoft Entra Identifier`}),`.`]})}),_jsx(Step,{title:`Assign users and finish in CloudThinker`,children:_jsxs(_components.p,{children:[`Assign users or groups under `,_jsx(_components.strong,{children:`Users and groups`}),`. In CloudThinker’s `,_jsx(_components.strong,{children:`IdP Config`}),` step, `,_jsx(_components.strong,{children:`Import`}),` the metadata URL, or enter the Entra Identifier as `,_jsx(_components.strong,{children:`IdP Entity ID`}),`, the Login URL as `,_jsx(_components.strong,{children:`SSO URL`}),`, and the Base64 certificate as `,_jsx(_components.strong,{children:`IdP Certificate`}),`. Click `,_jsx(_components.strong,{children:`Create Connection`}),`.`]})})]})}),_jsx(Tab,{title:`Google Workspace`,id:`google-workspace`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Create a custom SAML app`,children:_jsxs(_components.p,{children:[`In the `,_jsx(_components.a,{href:`https://admin.google.com`,children:`Google Admin console`}),`, go to `,_jsx(_components.strong,{children:`Apps → Web and mobile apps → Add app → Add custom SAML app`}),`. Name it `,_jsx(_components.strong,{children:`CloudThinker`}),` and click `,_jsx(_components.strong,{children:`Continue`}),`.`]})}),_jsx(Step,{title:`Copy Google's IdP details`,children:_jsxs(_components.p,{children:[`On `,_jsx(_components.strong,{children:`Google Identity Provider details`}),`, copy the `,_jsx(_components.strong,{children:`SSO URL`}),`, `,_jsx(_components.strong,{children:`Entity ID`}),` and `,_jsx(_components.strong,{children:`Certificate`}),`, or download the metadata. Click `,_jsx(_components.strong,{children:`Continue`}),`.`]})}),_jsxs(Step,{title:`Enter CloudThinker's SP details`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Google field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ACS URL`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Entity ID`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`SP Entity ID`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Name ID format`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`EMAIL`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Name ID`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Basic Information > Primary email`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Signed response`})}),_jsx(_components.td,{children:`Leave unchecked. Google signs the assertion by default.`})]})]})]}),_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Continue`}),`.`]})]}),_jsxs(Step,{title:`Map attributes`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Google Directory attribute`}),_jsx(_components.th,{children:`App attribute`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Primary email`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`email`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`First name`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`firstName`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Last name`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`lastName`})})]})]})]}),_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Finish`}),`. Then turn `,_jsx(_components.strong,{children:`User access`}),` to `,_jsx(_components.strong,{children:`ON for everyone`}),`, or for the organizational units that need CloudThinker.`]})]}),_jsx(Step,{title:`Finish in CloudThinker`,children:_jsxs(_components.p,{children:[`Google offers a metadata file, not a URL, and `,_jsx(_components.strong,{children:`Import`}),` only takes a URL, so enter the values by hand. On the `,_jsx(_components.strong,{children:`IdP Config`}),` step, enter Google’s `,_jsx(_components.strong,{children:`Entity ID`}),` as `,_jsx(_components.strong,{children:`IdP Entity ID`}),`, its `,_jsx(_components.strong,{children:`SSO URL`}),` as `,_jsx(_components.strong,{children:`SSO URL`}),`, and its certificate as `,_jsx(_components.strong,{children:`IdP Certificate`}),`. Click `,_jsx(_components.strong,{children:`Create Connection`}),`.`]})})]})}),_jsx(Tab,{title:`AWS IAM Identity Center`,id:`aws-iam-identity-center`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Add a custom SAML application`,children:_jsxs(_components.p,{children:[`In the AWS console, go to `,_jsx(_components.strong,{children:`IAM Identity Center → Applications → Add application → I have an application I want to set up → SAML 2.0`}),`. Name it `,_jsx(_components.strong,{children:`CloudThinker`}),`.`]})}),_jsx(Step,{title:`Copy the IAM Identity Center metadata`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`IAM Identity Center metadata`}),`, copy the SAML metadata file URL, or the sign-in URL, issuer URL and certificate.`]})}),_jsxs(Step,{title:`Enter the application metadata`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`IAM Identity Center field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Application ACS URL`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Application SAML audience`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`SP Entity ID`})]})]})]})]}),_jsx(_components.p,{children:`Submit the application.`})]}),_jsxs(Step,{title:`Map attributes`,children:[_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Actions → Edit attribute mappings`}),` and add:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Attribute in the application`}),_jsx(_components.th,{children:`Maps to`}),_jsx(_components.th,{children:`Format`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Subject`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:\"${user:email}\"})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`emailAddress`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`email`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:\"${user:email}\"})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`unspecified`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`firstName`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:\"${user:givenName}\"})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`unspecified`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`lastName`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:\"${user:familyName}\"})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`unspecified`})})]})]})]})]}),_jsx(Step,{title:`Assign users and finish in CloudThinker`,children:_jsxs(_components.p,{children:[`Assign users or groups to the app. In CloudThinker, `,_jsx(_components.strong,{children:`Import`}),` the metadata URL, or enter the issuer URL as `,_jsx(_components.strong,{children:`IdP Entity ID`}),`, the sign-in URL as `,_jsx(_components.strong,{children:`SSO URL`}),`, and the certificate as `,_jsx(_components.strong,{children:`IdP Certificate`}),`. Click `,_jsx(_components.strong,{children:`Create Connection`}),`.`]})})]})}),_jsx(Tab,{title:`OneLogin`,id:`onelogin`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Add a SAML custom connector`,children:_jsxs(_components.p,{children:[`In the OneLogin admin portal, go to `,_jsx(_components.strong,{children:`Applications → Applications → Add App`}),`, search for `,_jsx(_components.strong,{children:`SAML Custom Connector (Advanced)`}),`, name it `,_jsx(_components.strong,{children:`CloudThinker`}),`, and save.`]})}),_jsxs(Step,{title:`Configure the connector`,children:[_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`Configuration`}),` tab:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`OneLogin field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience (EntityID)`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`SP Entity ID`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Recipient`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ACS (Consumer) URL`})}),_jsxs(_components.td,{children:[`CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ACS (Consumer) URL Validator`})}),_jsxs(_components.td,{children:[`The ACS URL as a regex with dots escaped. For an ACS URL of `,_jsx(_components.code,{children:`https://api.example.com/api/v1/sso/saml/acs`}),`, enter `,_jsx(_components.code,{children:`^https://api\\\\.example\\\\.com/api/v1/sso/saml/acs$`}),`, using the host from the ACS URL you copied`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`SAML signature element`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Assertion`}),` or `,_jsx(_components.code,{children:`Both`})]})]})]})]})]}),_jsx(Step,{title:`Add parameters`,children:_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`Parameters`}),` tab, add `,_jsx(_components.code,{children:`email`}),` (Email), `,_jsx(_components.code,{children:`firstName`}),` (First Name) and `,_jsx(_components.code,{children:`lastName`}),` (Last Name), each with `,_jsx(_components.strong,{children:`Include in SAML assertion`}),` checked.`]})}),_jsx(Step,{title:`Copy the IdP details`,children:_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`SSO`}),` tab, copy the `,_jsx(_components.strong,{children:`Issuer URL`}),`, the `,_jsx(_components.strong,{children:`SAML 2.0 Endpoint (HTTP)`}),` and the X.509 certificate.`]})}),_jsx(Step,{title:`Assign users and finish in CloudThinker`,children:_jsxs(_components.p,{children:[`Add users on the `,_jsx(_components.strong,{children:`Users`}),` tab. In CloudThinker, enter the Issuer URL as `,_jsx(_components.strong,{children:`IdP Entity ID`}),`, the SAML 2.0 Endpoint as `,_jsx(_components.strong,{children:`SSO URL`}),`, and the certificate as `,_jsx(_components.strong,{children:`IdP Certificate`}),`. Click `,_jsx(_components.strong,{children:`Create Connection`}),`.`]})})]})}),_jsx(Tab,{title:`Other SAML 2.0 provider`,id:`other-saml-2-0-provider`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Create a SAML app in your provider`,children:_jsxs(_components.p,{children:[`Put CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`}),` in your provider’s “Reply URL”, “ACS URL” or “Recipient” field, and the `,_jsx(_components.strong,{children:`SP Entity ID`}),` in its “Audience” or “Entity ID” field. Send the user’s email as the NameID and as an `,_jsx(_components.code,{children:`email`}),` attribute, plus `,_jsx(_components.code,{children:`firstName`}),` and `,_jsx(_components.code,{children:`lastName`}),`. Sign the assertion.`]})}),_jsxs(Step,{title:`Fill in IdP Config`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`What to enter`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Display Name`})}),_jsxs(_components.td,{children:[`Any label, for example `,_jsx(_components.code,{children:`Company SSO`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`IdP Entity ID`})}),_jsx(_components.td,{children:`Your provider’s entity ID, sometimes called “Issuer”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`SSO URL`})}),_jsx(_components.td,{children:`Your provider’s single sign-on endpoint`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`IdP Certificate`})}),_jsxs(_components.td,{children:[`The X.509 signing certificate, including the `,_jsx(_components.code,{children:`-----BEGIN CERTIFICATE-----`}),` and `,_jsx(_components.code,{children:`-----END CERTIFICATE-----`}),` lines`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`SLO URL (Optional)`})}),_jsx(_components.td,{children:`Your provider’s single logout endpoint`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Name ID Format`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Email Address`}),` (default). Also offered: `,_jsx(_components.strong,{children:`Persistent`}),`, `,_jsx(_components.strong,{children:`Transient`}),`, `,_jsx(_components.strong,{children:`Unspecified`}),`. With any of these, your IdP must also send an `,_jsx(_components.code,{children:`email`}),` attribute.`]})]})]})]}),_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Create Connection`}),`.`]})]})]})})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success state:`}),` the dialog shows `,_jsx(_components.strong,{children:`SSO Connection Created`}),` and the connection is `,_jsx(_components.strong,{children:`Active`}),`. Next, run the connection test and a test sign-in from `,_jsx(_components.a,{href:`/guide/security/sso#create-the-connection`,children:`Set up single sign-on`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-cloudthinker-handles-saml-sign-ins`,children:`How CloudThinker handles SAML sign-ins`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Behavior`}),_jsx(_components.th,{children:`What it means for you`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sign-in starts at CloudThinker`}),_jsxs(_components.td,{children:[`Users enter their email on the CloudThinker sign-in page and click `,_jsx(_components.strong,{children:`Continue with SSO`}),`. Opening CloudThinker from your IdP’s app dashboard (IdP-initiated sign-in) is not accepted.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Signed assertions required`}),_jsx(_components.td,{children:`Your IdP must sign the SAML assertion. Signing only the outer response isn’t enough.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Clock tolerance of 120 seconds`}),_jsx(_components.td,{children:`Assertions are rejected if your IdP’s clock and CloudThinker’s differ by more than two minutes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Encrypted assertions not supported`}),_jsx(_components.td,{children:`CloudThinker has no SP decryption key. Turn off assertion encryption in your IdP, or sign-in fails.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AuthnRequests are unsigned`}),_jsx(_components.td,{children:`CloudThinker doesn’t sign the requests it sends. If your IdP requires signed AuthnRequests, turn that requirement off for this app.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No single logout`}),_jsxs(_components.td,{children:[`Signing out of CloudThinker ends only the CloudThinker session. CloudThinker stores the `,_jsx(_components.strong,{children:`SLO URL`}),` but doesn’t send logout requests to your IdP or accept them from it.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`One signing certificate`}),_jsxs(_components.td,{children:[`The `,_jsx(_components.strong,{children:`IdP Certificate`}),` field holds one certificate. There’s no secondary certificate, so plan rotations as a cutover. See `,_jsx(_components.a,{href:`#rotate-the-idp-certificate`,children:`Rotate the IdP certificate`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`SP Metadata URL after creation`}),_jsxs(_components.td,{children:[`Some IdPs can import an SP metadata URL. It appears on `,_jsx(_components.strong,{children:`Manage → Configuration`}),` once the connection exists.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-happens-on-first-sign-in`,children:`What happens on first sign-in`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`If`}),_jsx(_components.th,{children:`Then`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Provisioning is `,_jsx(_components.strong,{children:`Just-in-time`})]}),_jsxs(_components.td,{children:[`CloudThinker creates the account on the person’s first SSO sign-in, with the `,_jsx(_components.strong,{children:`Auto-assigned organization role`}),` (default `,_jsx(_components.strong,{children:`Viewer`}),`) and `,_jsx(_components.strong,{children:`Auto-assigned workspaces`}),` you set.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The person has a pending invitation`}),_jsx(_components.td,{children:`The invitation’s role and workspaces apply instead. If the organization has no free seat, sign-in fails with “This organization has reached its seat limit.”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The person already has a CloudThinker account with the same email`}),_jsx(_components.td,{children:`CloudThinker links that account to your IdP. No duplicate is created.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Provisioning is `,_jsx(_components.strong,{children:`Manual`}),` and the person has no account or invitation`]}),_jsx(_components.td,{children:`Sign-in is refused. Invite them first.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`You want IdP groups to decide access`}),_jsxs(_components.td,{children:[`SAML sign-in reads only email and name, not groups. Use `,_jsx(_components.a,{href:`/guide/security/scim#map-groups-to-workspaces`,children:`SCIM`}),` to map groups to workspaces.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Set the provisioning mode and default role in `,_jsx(_components.a,{href:`/guide/security/sso`,children:`Set up single sign-on`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`if-your-idp-is-unavailable`,children:`If your IdP is unavailable`}),`\n`,_jsxs(_components.p,{children:[`The organization Owner is exempt from `,_jsx(_components.strong,{children:`Require SSO`}),` and can still sign in with an email code. See `,_jsx(_components.a,{href:`/guide/security/sso#if-your-idp-is-unavailable`,children:`If your IdP is unavailable`}),` for the steps and the mailbox to set up first.`]}),`\n`,_jsx(Heading,{level:`2`,id:`rotate-the-idp-certificate`,children:`Rotate the IdP certificate`}),`\n`,_jsx(_components.p,{children:`CloudThinker doesn’t warn before the stored certificate expires and doesn’t show its expiry date. Check the date in your IdP and set your own reminder.`}),`\n`,_jsx(_components.p,{children:`CloudThinker checks signatures against one certificate, so sign-ins fail between the moment your IdP starts signing with the new certificate and the moment you save it in CloudThinker. Keep that gap to a minute or two.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Prepare the new certificate in your IdP`,children:_jsxs(_components.p,{children:[`Create or upload the new signing certificate, but don’t make it active yet. Copy it, including the `,_jsx(_components.code,{children:`BEGIN`}),` and `,_jsx(_components.code,{children:`END`}),` lines.`]})}),_jsx(Step,{title:`Switch your IdP to the new certificate`,children:_jsx(_components.p,{children:`Make the new certificate active for the CloudThinker app.`})}),_jsx(Step,{title:`Save it in CloudThinker right away`,children:_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Manage → Configuration`}),` on the `,_jsx(_components.strong,{children:`Single sign-on`}),` card, paste the certificate into `,_jsx(_components.strong,{children:`IdP Certificate`}),`, and click `,_jsx(_components.strong,{children:`Save Changes`}),`.`]})}),_jsxs(Step,{title:`Test`,children:[_jsxs(_components.p,{children:[`Run the connection test from `,_jsx(_components.strong,{children:`Manage → Overview`}),`, then sign in through SSO in a private window.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success state:`}),` the test passes `,_jsx(_components.strong,{children:`Certificate Valid`}),` and the sign-in lands you in CloudThinker.`]})]})]}),`\n`,_jsx(_components.p,{children:`If something goes wrong, the Owner can still sign in with an email code and fix the certificate.`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Your IdP reports an invalid ACS or reply URL`,id:`your-idp-reports-an-invalid-acs-or-reply-url`,children:_jsxs(_components.p,{children:[`The ACS URL in your IdP must match CloudThinker’s `,_jsx(_components.strong,{children:`ACS URL`}),` exactly, including `,_jsx(_components.code,{children:`https://`}),` and with no trailing slash. Copy it again from the `,_jsx(_components.strong,{children:`SP Metadata`}),` step or from `,_jsx(_components.strong,{children:`Manage → Configuration`}),`.`]})}),_jsx(Accordion,{title:`'Audience mismatch' or 'Entity ID mismatch'`,id:`audience-mismatch-or-entity-id-mismatch`,children:_jsxs(_components.p,{children:[`The audience or entity ID in your IdP must match CloudThinker’s `,_jsx(_components.strong,{children:`SP Entity ID`}),` exactly. The comparison is case-sensitive.`]})}),_jsx(Accordion,{title:`Connection test fails on Certificate Valid`,id:`connection-test-fails-on-certificate-valid`,children:_jsxs(_components.p,{children:[`Paste the full certificate, including the `,_jsx(_components.code,{children:`BEGIN`}),` and `,_jsx(_components.code,{children:`END`}),` lines, with no extra characters. If your IdP rotated its certificate, paste the new one on `,_jsx(_components.strong,{children:`Manage → Configuration`}),` and click `,_jsx(_components.strong,{children:`Save Changes`}),`. To avoid this next time, follow `,_jsx(_components.a,{href:`#rotate-the-idp-certificate`,children:`Rotate the IdP certificate`}),`.`]})}),_jsx(Accordion,{title:`Sign-in works from CloudThinker but not from the IdP dashboard`,id:`sign-in-works-from-cloudthinker-but-not-from-the-idp-dashboard`,children:_jsx(_components.p,{children:`That’s expected. IdP-initiated sign-in is off. Ask users to start at the CloudThinker sign-in page.`})}),_jsxs(Accordion,{title:`'SSO authentication failed. Please try again or contact your administrator.'`,id:`sso-authentication-failed-please-try-again-or-contact-your-administrator`,children:[_jsx(_components.p,{children:`CloudThinker shows this one message for every rejected SAML response, so check these in order:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Assertion not signed`}),`: your IdP signs only the response. Turn on assertion signing (see your provider’s tab above).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Assertion encrypted`}),`: turn off assertion encryption for the CloudThinker app.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Wrong certificate`}),`: paste the IdP’s current signing certificate on `,_jsx(_components.strong,{children:`Manage → Configuration`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Clock drift`}),`: your IdP’s clock is more than two minutes off.`]}),`\n`]})]}),_jsx(Accordion,{title:`Sign-in fails with a valid configuration`,id:`sign-in-fails-with-a-valid-configuration`,children:_jsxs(_components.p,{children:[`Check that the user is assigned to the CloudThinker app in your IdP, then match the message they see against `,_jsx(_components.a,{href:`/guide/security/sso#troubleshooting`,children:`Finding out why an SSO sign-in failed`}),`.`]})}),_jsx(Accordion,{title:`Names show as email addresses`,id:`names-show-as-email-addresses`,children:_jsxs(_components.p,{children:[`Your IdP isn’t sending first and last name. Add `,_jsx(_components.code,{children:`firstName`}),` and `,_jsx(_components.code,{children:`lastName`}),` (or `,_jsx(_components.code,{children:`givenName`}),` and `,_jsx(_components.code,{children:`surname`}),`) in your provider’s attribute mapping.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Test and require SSO`,icon:`key`,href:`/guide/security/sso`,children:_jsx(_components.p,{children:`Run the connection test, choose provisioning, and turn on Require SSO`})}),_jsx(Card,{title:`SCIM provisioning`,icon:`users-gear`,href:`/guide/security/scim`,children:_jsx(_components.p,{children:`Sync users and groups from your IdP automatically`})})]})]})}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":"Set Up SAML SSO","description":"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.","icon":"shield","href":"/guide/security/sso-saml"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"What you exchange","slug":"what-you-exchange","depth":2,"children":[]},{"title":"Configure your provider","slug":"configure-your-provider","depth":2,"children":[]},{"title":"How CloudThinker handles SAML sign-ins","slug":"how-cloudthinker-handles-saml-sign-ins","depth":2,"children":[]},{"title":"What happens on first sign-in","slug":"what-happens-on-first-sign-in","depth":2,"children":[]},{"title":"If your IdP is unavailable","slug":"if-your-idp-is-unavailable","depth":2,"children":[]},{"title":"Rotate the IdP certificate","slug":"rotate-the-idp-certificate","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"cloudthinker","siteName":"CloudThinker","title":"Set Up SAML SSO - CloudThinker","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/guide/security/sso-saml","matchLevel":0},"vi":{"href":"/guide/security/sso-saml","matchLevel":0},"ja":{"href":"/guide/security/sso-saml","matchLevel":0},"ko":{"href":"/guide/security/sso-saml","matchLevel":0}}},"lastModified":"2026-10-25T10:41:40.923Z","originalFileLocation":"guide/security/sso-saml.mdx","locale":"en"},"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=\"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.\">\u003cmeta data-mint-head name=\"application-name\" content=\"CloudThinker\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_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/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Set Up SAML SSO - CloudThinker\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"CloudThinker\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.cloudthinker.io/guide/security/sso-saml\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cloudthinker.mintlify.app/_mintlify/api/og/v2?division=Identity+and+access\u0026amp;title=Set+Up+SAML+SSO\u0026amp;description=Connect+Okta%2C+Microsoft+Entra+ID%2C+Google+Workspace%2C+AWS+IAM+Identity+Center%2C+OneLogin+or+any+SAML+2.0+identity+provider.\u0026amp;theme=a662466b4ca99701c5f8fbf0\u0026amp;signature=cdc9a483606570ce3f4b4df25eb87ccdceac9a4103c1179a30ec1cad613e9612\">\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=\"Set Up SAML SSO - CloudThinker\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cloudthinker.mintlify.app/_mintlify/api/og/v2?division=Identity+and+access\u0026amp;title=Set+Up+SAML+SSO\u0026amp;description=Connect+Okta%2C+Microsoft+Entra+ID%2C+Google+Workspace%2C+AWS+IAM+Identity+Center%2C+OneLogin+or+any+SAML+2.0+identity+provider.\u0026amp;theme=a662466b4ca99701c5f8fbf0\u0026amp;signature=cdc9a483606570ce3f4b4df25eb87ccdceac9a4103c1179a30ec1cad613e9612\">\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/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"CloudThinker\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0c93c0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.cloudthinker.io/guide/security/sso-saml\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guide/security/sso-saml.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.cloudthinker.io/#organization\",\"name\":\"CloudThinker\",\"url\":\"https://docs.cloudthinker.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/cloudthinker/-4m9DUjwzDxHfABz/logo/light.svg?fit=max\u0026auto=format\u0026n=-4m9DUjwzDxHfABz\u0026q=85\u0026s=a56a571509d1cd246f5b0e68db015e5f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.cloudthinker.io#website\",\"name\":\"CloudThinker\",\"url\":\"https://docs.cloudthinker.io\",\"publisher\":{\"@id\":\"https://docs.cloudthinker.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.cloudthinker.io/guide/security/sso-saml#webpage\",\"url\":\"https://docs.cloudthinker.io/guide/security/sso-saml\",\"name\":\"Set Up SAML SSO\",\"description\":\"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.\",\"dateModified\":\"2026-10-25T10:41:40.923Z\",\"isPartOf\":{\"@id\":\"https://docs.cloudthinker.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.cloudthinker.io/guide/security/sso-saml#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.cloudthinker.io/guide/security/sso-saml#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Identity and access\",\"item\":\"https://docs.cloudthinker.io/guide/security/sso\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Set Up SAML SSO\",\"item\":\"https://docs.cloudthinker.io/guide/security/sso-saml\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.cloudthinker.io/guide/security/sso-saml#article\",\"headline\":\"Set Up SAML SSO\",\"name\":\"Set Up SAML SSO\",\"description\":\"Connect Okta, Microsoft Entra ID, Google Workspace, AWS IAM Identity Center, OneLogin or any SAML 2.0 identity provider.\",\"url\":\"https://docs.cloudthinker.io/guide/security/sso-saml\",\"mainEntityOfPage\":{\"@id\":\"https://docs.cloudthinker.io/guide/security/sso-saml#webpage\"},\"dateModified\":\"2026-10-25T10:41:40.923Z\",\"publisher\":{\"@id\":\"https://docs.cloudthinker.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.cloudthinker.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"CloudThinker\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"CloudThinker","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Get started","pages":[{"title":"Get started","href":""}]},{"tab":"Products","pages":[{"title":"Products","href":"/guide/incident/overview"}]},{"tab":"Platform","pages":[{"title":"Platform","href":"/guide/connections/overview"}]},{"tab":"Enterprise","groups":[{"group":"Security and trust","pages":[{"title":"Security and Trust","icon":"shield-halved","href":"/guide/security/overview"},{"title":"Data Protection","icon":"user-shield","href":"/guide/security/data-protection"},{"title":"Custom Guardrails","icon":"eye-slash","href":"/guide/security/custom-guardrails"},{"title":"Bring Your Own Key (BYOK)","icon":"key","href":"/guide/byok"}]},{"group":"Identity and access","pages":[{"title":"Set Up Single Sign-On","description":"Verify your email domain, connect a SAML or OIDC identity provider, choose provisioning, and require SSO for your organization.","icon":"key","href":"/guide/security/sso"},{"title":"Set Up SAML SSO","icon":"shield","href":"/guide/security/sso-saml"},{"title":"Set Up OIDC SSO","description":"Connect Google, Microsoft Entra ID, Okta or any OpenID Connect identity provider to CloudThinker with an issuer URL and client ID.","icon":"id-badge","href":"/guide/security/sso-oidc"},{"title":"SCIM Provisioning","icon":"users-gear","href":"/guide/security/scim"},{"title":"Roles and Permissions","icon":"user-shield","href":"/guide/security/roles"}]},{"group":"Governance","pages":[{"title":"Audit Logs","icon":"clipboard-list","href":"/guide/security/audit-logs"}]}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/guide/api/overview"}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/learn/aio/introduction"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"Pricing","href":"https://cloudthinker.io/pricing"}]},{"language":"vi","tabs":[{"tab":"Bắt đầu","pages":[{"title":"Bắt đầu","href":""}]},{"tab":"Sản phẩm","pages":[{"title":"Sản phẩm","href":"/vi/guide/incident/overview"}]},{"tab":"Nền tảng","pages":[{"title":"Nền tảng","href":"/vi/guide/connections/overview"}]},{"tab":"Doanh nghiệp","groups":[{"group":"Bảo mật","pages":[{"title":"Bảo Mật \u0026 Xác Thực","icon":"shield-halved","href":"/vi/guide/security/overview"},{"title":"Data Protection","icon":"user-shield","href":"/guide/security/data-protection"},{"title":"Custom Guardrails","icon":"eye-slash","href":"/guide/security/custom-guardrails"},{"title":"Tự Cung Cấp Khóa (BYOK)","icon":"key","href":"/vi/guide/byok"}]},{"group":"Danh tính và truy cập","pages":[{"title":"Single Sign-On (SSO)","description":"Cấu hình SSO SAML hoặc OIDC với Google Workspace, Azure AD, AWS IAM Identity Center, Okta và nhiều hơn nữa","icon":"key","href":"/vi/guide/security/sso"},{"title":"Set Up SAML SSO","icon":"shield","href":"/guide/security/sso-saml"},{"title":"Set Up OIDC SSO","description":"Connect Google, Microsoft Entra ID, Okta or any OpenID Connect identity provider to CloudThinker with an issuer URL and client ID.","icon":"id-badge","href":"/guide/security/sso-oidc"},{"title":"Thiết Lập Cấp Phép SCIM","icon":"users-gear","href":"/vi/guide/security/scim"},{"title":"Roles and Permissions","icon":"user-shield","href":"/guide/security/roles"}]},{"group":"Quản trị","pages":[{"title":"Audit Logs","icon":"clipboard-list","href":"/guide/security/audit-logs"}]}]},{"tab":"Nhà phát triển","pages":[{"title":"Nhà phát triển","href":"/vi/guide/api/overview"}]},{"tab":"Tài nguyên","pages":[{"title":"Tài nguyên","href":"/vi/learn/aio/introduction"}]},{"tab":"Nhật ký thay đổi","pages":[{"title":"Nhật ký thay đổi","href":"/changelog"}]},{"tab":"Bảng giá","href":"https://cloudthinker.io/pricing"}]},{"language":"ja","tabs":[{"tab":"はじめに","pages":[{"title":"はじめに","href":""}]},{"tab":"プロダクト","pages":[{"title":"プロダクト","href":"/ja/guide/incident/overview"}]},{"tab":"プラットフォーム","pages":[{"title":"プラットフォーム","href":"/ja/guide/connections/overview"}]},{"tab":"エンタープライズ","groups":[{"group":"セキュリティ","pages":[{"title":"セキュリティと認証","icon":"shield-halved","href":"/ja/guide/security/overview"},{"title":"Data Protection","icon":"user-shield","href":"/guide/security/data-protection"},{"title":"Custom Guardrails","icon":"eye-slash","href":"/guide/security/custom-guardrails"},{"title":"Bring Your Own Key (BYOK)","icon":"key","href":"/ja/guide/byok"}]},{"group":"IDとアクセス","pages":[{"title":"シングルサインオン(SSO)","description":"Google Workspace、Azure AD、AWS IAM Identity Center、Oktaなどを使ったSAMLまたはOIDC SSOの設定","icon":"key","href":"/ja/guide/security/sso"},{"title":"Set Up SAML SSO","icon":"shield","href":"/guide/security/sso-saml"},{"title":"Set Up OIDC SSO","description":"Connect Google, Microsoft Entra ID, Okta or any OpenID Connect identity provider to CloudThinker with an issuer URL and client ID.","icon":"id-badge","href":"/guide/security/sso-oidc"},{"title":"SCIMプロビジョニングの設定","icon":"users-gear","href":"/ja/guide/security/scim"},{"title":"Roles and Permissions","icon":"user-shield","href":"/guide/security/roles"}]},{"group":"ガバナンス","pages":[{"title":"Audit Logs","icon":"clipboard-list","href":"/guide/security/audit-logs"}]}]},{"tab":"開発者","pages":[{"title":"開発者","href":"/ja/guide/api/overview"}]},{"tab":"リソース","pages":[{"title":"リソース","href":"/ja/learn/aio/introduction"}]},{"tab":"変更履歴","pages":[{"title":"変更履歴","href":"/changelog"}]},{"tab":"料金","href":"https://cloudthinker.io/pricing"}]},{"language":"ko","tabs":[{"tab":"시작하기","pages":[{"title":"시작하기","href":""}]},{"tab":"제품","pages":[{"title":"제품","href":"/ko/guide/incident/overview"}]},{"tab":"플랫폼","pages":[{"title":"플랫폼","href":"/ko/guide/connections/overview"}]},{"tab":"엔터프라이즈","groups":[{"group":"보안","pages":[{"title":"보안 및 인증","icon":"shield-halved","href":"/ko/guide/security/overview"},{"title":"Data Protection","icon":"user-shield","href":"/guide/security/data-protection"},{"title":"Custom Guardrails","icon":"eye-slash","href":"/guide/security/custom-guardrails"},{"title":"자체 키 사용 (BYOK)","icon":"key","href":"/ko/guide/byok"}]},{"group":"ID 및 액세스","pages":[{"title":"싱글 사인온(SSO)","description":"Google Workspace, Azure AD, AWS IAM Identity Center, Okta 등으로 SAML 또는 OIDC SSO 구성","icon":"key","href":"/ko/guide/security/sso"},{"title":"Set Up SAML SSO","icon":"shield","href":"/guide/security/sso-saml"},{"title":"Set Up OIDC SSO","description":"Connect Google, Microsoft Entra ID, Okta or any OpenID Connect identity provider to CloudThinker with an issuer URL and client ID.","icon":"id-badge","href":"/guide/security/sso-oidc"},{"title":"SCIM 프로비저닝 설정","icon":"users-gear","href":"/ko/guide/security/scim"},{"title":"Roles and Permissions","icon":"user-shield","href":"/guide/security/roles"}]},{"group":"거버넌스","pages":[{"title":"Audit Logs","icon":"clipboard-list","href":"/guide/security/audit-logs"}]}]},{"tab":"개발자","pages":[{"title":"개발자","href":"/ko/guide/api/overview"}]},{"tab":"리소스","pages":[{"title":"리소스","href":"/ko/learn/aio/introduction"}]},{"tab":"변경 로그","pages":[{"title":"변경 로그","href":"/changelog"}]},{"tab":"요금","href":"https://cloudthinker.io/pricing"}]}]},"title":"Set Up SAML SSO - CloudThinker","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}