On this page
Single sign-on setup

Connect your identity provider to Nettle

Your team signs in to Nettle with the Google or Microsoft accounts they already use. To make that happen, you create a small app registration in your own admin console and send us the Client ID and Client Secret it gives you. This guide walks you through it, screen by screen.

โฑ About 10โ€“15 minutes ๐Ÿ‘ค For IT / identity admins ๐Ÿ”’ Sign-in only: name and email, never passwords
.nettle.llc
Redirect URI https://auth-your-company.nettle.llc/oauth2/callback

Type the first part of your Nettle address (for dataleague.nettle.llc, type dataleague). Every redirect URI on this page updates to match. Not sure? It's in your welcome email, or ask us.

Choose your identity provider:

Before you begin #

Have these ready:

  • Admin access to your identity provider. For Google, an account that can create projects and OAuth clients in Google Cloud (for example Project Owner or Editor, or OAuth Config Editor on an existing project). For Microsoft, at least the Application Developer role to register the app, and Cloud Application Administrator or higher to grant admin consent.
  • Your redirect URI (above). It must match exactly: https, the auth- prefix, and no trailing slash.
  • Somewhere safe to keep the secret, such as your password manager. Both consoles show the secret only once.

These are the values you'll enter in your console:

SettingValue
Redirect URIhttps://auth-your-company.nettle.llc/oauth2/callback
Application typeWeb application (Google) / Web platform (Microsoft)
Scopes requestedopenid email profile, plus offline access so people stay signed in
App name (suggested)Nettle. Your users see this on the consent screen.
Homepage (if asked)https://your-company.nettle.llc

What Nettle can seeNettle requests only basic sign-in scopes: each user's name, email address and a stable account ID. We can't read mail, files, calendars or your directory, and we never see passwords. Your identity provider handles the password and MFA.

Google Workspace: create an OAuth client #

You'll set up the Google Auth Platform in a Google Cloud project, then create an OAuth client of type Web application. Google Cloud is free for this; no billing account is needed.

Video walkthrough

2 min 23 s ยท Webigenci on YouTube ยท shows the current Google Auth Platform screens. When the video asks for a redirect URI, use yours: https://auth-your-company.nettle.llc/oauth2/callback.

Step-by-step

  1. Create a Google Cloud project

    Go to console.cloud.google.com/projectcreate, signed in with your Google Workspace admin account. You can also reuse an existing project, but a dedicated one keeps things tidy.

    • Project name: Nettle SSO (or anything you like).
    • Organization: choose your company's organization. This is what lets you restrict sign-in to your own staff in step 3.

    Click Create, then make sure the new project is selected in the project picker at the top of the page.

    The New Project form. Project and organization names here are examples. Screenshot: Wasp docs.
  2. Open Google Auth Platform and click Get started

    Open Google Auth Platform (search for "Google Auth Platform" in the console search bar, or go to APIs & Services โ†’ OAuth consent screen). If the project hasn't been configured yet, you'll see Google Auth Platform not configured yet. Click Get started.

    Google Auth Platform โ†’ Overview, before setup. Screenshot: Wasp docs.

    Already see Overview, Branding, Audience and Clients with no "Get started" button? The project is already configured. Skip to step 5.

  3. Fill in the project configuration

    The wizard has four short sections:

    1. App Information: App name Nettle, and a User support email (your IT helpdesk group or your own address). Click Next.
    2. Audience: choose who can sign in:
      • Internal (recommended): only accounts in your Google Workspace organization. Google itself blocks everyone else.
      • External: any Google account. Pick this only if people outside your Workspace organization need access; Nettle then admits only the email domains you send us.
      Internal is available only if the project belongs to a Google Workspace or Cloud Identity organization (step 1).
    3. Contact Information: an email address Google can contact about the project.
    4. Finish: agree to the Google API Services User Data Policy, then click Create.
    Section 1, App Information. Use Nettle as the app name. Screenshot: Wasp docs.
    Section 2, Audience. Choose Internal unless you need outside accounts. Screenshot: Wasp docs.
  4. Publish the app (External audience only) Optional

    Skip this step if you chose Internal.

    New External apps start in Testing. Open Audience and click Publish app, then Confirm. Because Nettle requests only basic sign-in scopes (name, email, profile), publishing needs no Google verification or review. You don't need to add test users.

    Audience page: Publish app is under Publishing status. Ignore the Test users section. Screenshot: Wasp docs.
  5. Create the OAuth client

    Go to Clients in the left menu and click + Create client. On a brand-new project, the Overview page has a Create OAuth client button that leads to the same place.

    The Overview page after setup, with Create OAuth client. Screenshot: Cloudflare docs.

    Fill in the form:

    • Application type: Web application
    • Name: Nettle (internal label; users don't see it)
    • Authorized JavaScript origins: leave empty
    • Authorized redirect URIs: click + Add URI and paste:
    Redirect URI https://auth-your-company.nettle.llc/oauth2/callback

    Click Create.

    Callouts 1 to 4: Application type, Name, redirect URI, Create. The redirect URI shown is another product's; enter yours from above. Screenshot: Wasp docs.

    Google notes that changes "may take 5 minutes to a few hours" to take effect. If a first test sign-in shows redirect_uri_mismatch, wait a few minutes and try again.

  6. Copy the Client ID and Client Secret

    The OAuth client created dialog shows both values. Copy each with its copy icon, or click Download JSON, and store them in your password manager before clicking OK.

    The Client ID ends in .apps.googleusercontent.com and the secret starts with GOCSPX-. Values are redacted here. Screenshot: NetBird docs.

    The secret is shown only onceSince 2025, Google never shows a client secret again after you close this dialog; afterwards you'll see only its last four characters. If you lose it, open the client and use Add secret to make a new one.

  7. Send the credentials to Nettle

    You now have a Client ID and a Client Secret. Follow Send your credentials to Nettle. Never put the secret in plain email.

Microsoft Entra ID: register an app #

You'll create an app registration in the Microsoft Entra admin center, add a client secret, and confirm the sign-in permissions. Entra ID is the new name for Azure Active Directory, and the steps are the same in the Azure portal.

Video walkthrough

1 min 31 s ยท Outright Systems on YouTube ยท uses the current (2026) app-registration screens in the Azure portal; the Entra admin center has the same pages. Use your redirect URI, not the one in the video. Mixing up the secret Value and Secret ID? Watch this 4-minute explainer.

Step-by-step

  1. Open App registrations

    Sign in to the Microsoft Entra admin center with at least the Application Developer role. If you have more than one tenant, use the Settings icon in the top bar to switch to the one your staff sign in with.

    Go to Entra ID โ†’ App registrations and click + New registration.

  2. Register the application

    • Name: Nettle. Users may see this name when they sign in.
    • Supported account types: Single tenant only. Older versions of the screen label it Accounts in this organizational directory only.
    • Redirect URI: choose platform Web and paste:
    Redirect URI https://auth-your-company.nettle.llc/oauth2/callback

    Click Register.

    Register an application. The name and redirect URI shown are examples; enter Nettle and your redirect URI. Newer tenants show Supported account types as a drop-down instead of radio buttons. Screenshot: Microsoft Learn.

    No redirect URI field on your form? Register first, then open Authentication โ†’ Add a platform (or Add Redirect URI) โ†’ Web, and paste it there. Leave the front-channel logout URL and the implicit-grant checkboxes empty.

  3. Copy the Client ID and Tenant ID

    You land on the app's Overview page. Copy two values from Essentials:

    • Application (client) ID: this is your Client ID
    • Directory (tenant) ID: this is your Tenant ID

    Ignore Object ID; it's a different value.

    Overview โ†’ Essentials. The two highlighted GUIDs are the values to send us. Screenshot: Microsoft Learn.
  4. Create a client secret

    Go to Certificates & secrets โ†’ Client secrets and click + New client secret.

    • Description: Nettle SSO
    • Expires: we suggest 365 days. The maximum is 24 months; when it expires, sign-in stops (see rotating secrets). Note the date in your calendar.

    Click Add.

    Certificates & secrets โ†’ New client secret. Screenshot: Microsoft Learn.

    The new secret appears in the table. Copy the Value column now using its copy icon, and store it in your password manager.

    Copy the Value, not the Secret ID. Screenshot: Microsoft Learn.

    Value, not Secret ID, and only onceThe table has two similar columns: Value is the secret, and Secret ID is just its identifier. The Value is hidden for good once you leave the page. Sending the Secret ID is the #1 cause of error AADSTS7000215.

  5. Add sign-in permissions and grant admin consent

    Go to API permissions. Microsoft Graph โ†’ User.Read is already there. Add the standard sign-in permissions:

    1. Click + Add a permission โ†’ Microsoft Graph โ†’ Delegated permissions.
    2. Under OpenId permissions, tick email, offline_access, openid and profile.
    3. Click Add permissions.
    Microsoft Graph โ†’ Delegated permissions โ†’ OpenId permissions. Screenshot: Microsoft Learn.

    Then click Grant admin consent for <your organization> and confirm with Yes. Every row's status should turn to a green Granted. This needs the Cloud Application Administrator role or higher, and it means your users won't see a consent prompt.

    The Grant admin consent button above the permissions list. This example from another product also lists Directory.Read.All and GroupMember.Read.All; Nettle does not need those, so don't add them. Screenshot: Cloudflare docs.
  6. Add the email claim

    Nettle identifies people by email address. To make sure Microsoft always includes it:

    1. Go to Token configuration โ†’ + Add optional claim.
    2. Token type ID, tick email, click Add.
    3. If asked, tick Turn on the Microsoft Graph email permission and confirm.
    Token configuration with the email claim added. Screenshot: Cloudflare docs.

    The claim is filled from each user's Email (mail) attribute. Accounts without a mailbox or email address can't sign in to Nettle, so check that service or shared accounts have one set.

  7. Restrict who can sign in Optional

    By default, everyone in your tenant can sign in to the app (and Nettle then checks their email domain). To allow only specific people or groups:

    1. Go to Entra ID โ†’ Enterprise applications โ†’ All applications and open Nettle.
    2. Under Properties, set Assignment required? to Yes and click Save.
    3. Under Users and groups, click + Add user/group and assign the people or groups who should have access.
    Properties. Set the highlighted toggle to Yes. Older screens label it User assignment required?. Screenshot: Microsoft Learn.
    Users and groups โ†’ + Add user/group. Screenshot: Microsoft Learn.

    With assignment required, users can't consent for themselves, so do step 5's Grant admin consent first. Assigning groups needs Entra ID P1 or P2; nested groups aren't supported.

  8. Send the credentials to Nettle

    You now have a Client ID, a Tenant ID and a Client Secret (the Value). Follow Send your credentials to Nettle. Never put the secret in plain email.

Send your credentials to Nettle #

When you're done, you'll have:

ValueGoogleMicrosoftSensitive?
Client IDEnds in .apps.googleusercontent.comApplication (client) ID, a GUIDNo
Tenant IDN/ADirectory (tenant) ID, a GUIDNo
Client SecretStarts with GOCSPX-The secret Value, not the Secret IDYes
Email domain(s)The domains allowed to sign in, for example yourcompany.comNo
  1. Email the Client ID, the Tenant ID (Microsoft only) and your allowed email domains to info@nettle.llc from your company address, with your workspace name in the subject.
  2. Send the Client Secret separately as a one-time link: paste it into share.doppler.com (free, no account needed, end-to-end encrypted), set it to expire after 1 view, and email us the link. Your password manager's secure share (for example 1Password or Bitwarden Send) works too.
  3. We'll add the credentials to your workspace and agree a time with you to test sign-in before switching your team over. Until then, your current sign-in keeps working.

Never paste the Client Secret into email, chat or a ticketAnyone with the secret and Client ID can pretend to be your Nettle app to your identity provider. If a secret is exposed, rotate it (see below) and let us know.

Rotating and expiring secrets #

Microsoft secrets expire

Every Entra ID client secret has an expiry date, at most 24 months from creation. When it passes, sign-in to Nettle stops working with error AADSTS7000222. To avoid downtime:

  1. About a month before expiry, add a new client secret to the same app registration (Certificates & secrets โ†’ New client secret). The old one keeps working alongside it.
  2. Send us the new secret the same secure way as before.
  3. Once we confirm the switch, delete the old secret.

Google secrets don't expire

Google client secrets stay valid until you disable or delete them. To rotate one, open the client in Google Auth Platform โ†’ Clients, click Add secret, send us the new secret, and once we confirm, Disable and then delete the old one. A client can hold two secrets at once, so there's no downtime.

A client's details page: Client ID (1), the current secret (2) and + Add secret. Values are blurred. Screenshot: Wasp docs.

Troubleshooting #

Most sign-in problems come from a small mismatch between your console and what Nettle sends. Find the error your users see below. Error codes appear on the Google or Microsoft error page, often under "Error details" or "Troubleshooting details".

Google

GoogleError 400: redirect_uri_mismatch

Cause: the redirect URI Nettle sent is not in the client's Authorized redirect URIs.

Fix: open Google Auth Platform โ†’ Clients, select your client, and add https://auth-your-company.nettle.llc/oauth2/callback exactly: https, the auth- prefix, no trailing slash, no spaces. Save, then allow time for the change to apply. Google notes it "may take 5 minutes to a few hours".

GoogleError 403: org_internal

Cause: the app's audience is Internal and the person is signing in with an account outside your Google Workspace organization, often a personal Gmail account or a second signed-in account.

Fix: have them sign in with their work account (use an incognito window if they're signed in to several). If people outside your organization really do need access, switch Audience โ†’ User type to External and publish the app.

GoogleError 403: access_denied

Cause: the person clicked Cancel on the consent screen, or the app is External and still in Testing with a restricted user list.

Fix: retry and click Continue. If it persists, go to Audience and click Publish app. Publishing needs no Google review, because Nettle uses only the basic sign-in scopes.

GoogleError 400: admin_policy_enforced

Cause: your Google Workspace admin settings block third-party apps that haven't been explicitly trusted.

Fix: a Workspace super admin opens admin.google.com โ†’ Security โ†’ Access and data control โ†’ API controls โ†’ Manage third-party app access, adds the app by its Client ID, and sets it to Trusted.

GoogleError 401: invalid_client or "The OAuth client was not found."

Cause: the Client ID or secret we have doesn't match your client. Usually a copy-paste slip (a missing character or extra whitespace), a client from a different project, or a secret that was disabled.

Fix: re-copy the Client ID from Clients. Google shows a secret in full only once, so if you no longer have it, open the client, click Add secret, and send us the new one.

GoogleError 401: deleted_client

Cause: the OAuth client was deleted. Google also deletes clients automatically after about six months with no sign-ins, after emailing the project owners a notice.

Fix: a deleted client can be restored within 30 days from Google Auth Platform โ†’ Clients. After that, create a new client (Google step 5) and send us the new Client ID and secret.

GoogleThe consent screen shows an unfamiliar name, or no app name

Google shows your app's name and logo on the consent screen only after brand verification, which is optional. Until then the consent screen may leave them out. Sign-in works either way. To show "Nettle", submit the branding for verification under Google Auth Platform โ†’ Verification Center.

Microsoft

MicrosoftAADSTS50011: The redirect URI specified in the request does not match

Cause: the redirect URI is missing from the app registration, or registered under the wrong platform type.

Fix: open App registrations โ†’ your app โ†’ Authentication and make sure https://auth-your-company.nettle.llc/oauth2/callback is listed under the Web platform, not "Single-page application" or "Mobile and desktop". It must match exactly, with no trailing slash.

MicrosoftAADSTS7000215: Invalid client secret provided

Cause: almost always the Secret ID was copied instead of the secret Value. They sit side by side in the same table.

Fix: the Value can't be shown again, so create a new client secret (Microsoft step 4), copy the Value column immediately, send it to us, and delete the old secret.

MicrosoftAADSTS7000222: The provided client secret keys are expired

Cause: the client secret passed its expiry date.

Fix: create a new secret under Certificates & secrets, send it to us, then delete the expired one. See Rotating and expiring secrets to avoid this next time.

MicrosoftAADSTS700016: Application was not found in the directory

Cause: the Client ID or Tenant ID we have doesn't match, for example an ID from a different tenant, or the Object ID copied instead of the Application (client) ID.

Fix: on the app's Overview page, re-copy Application (client) ID and Directory (tenant) ID and send them to us. The Object ID is a different value.

MicrosoftAADSTS50105: The signed in user is not assigned to a role for the application

Cause: Assignment required? is turned on and this person (or a group they're in) isn't assigned.

Fix: Enterprise applications โ†’ your app โ†’ Users and groups โ†’ Add user/group. Assigning groups needs Entra ID P1 or P2, and nested groups aren't supported.

MicrosoftAADSTS65001 or AADSTS90094: consent required / "Need admin approval"

Cause: your tenant doesn't let users consent to apps themselves, or Assignment required? is on. Either way, users can't click through the consent prompt.

Fix: an admin with the Cloud Application Administrator role or higher opens API permissions and clicks Grant admin consent for <your organization> (Microsoft step 5).

MicrosoftAADSTS50020: User account from identity provider does not exist in tenant

Cause: the person signed in with a personal Microsoft account or an account from another organization, and the app is single tenant.

Fix: sign in with the work account from your tenant. For external collaborators, invite them as guests in your tenant first.

MicrosoftAADSTS53003: Access has been blocked by Conditional Access policies

Cause: one of your Conditional Access policies (device, location, MFA) blocked the sign-in. This is working as intended from Entra's side.

Fix: check Entra ID โ†’ Monitoring & health โ†’ Sign-in logs for the failed sign-in. It names the policy that applied. Adjust the policy or meet its requirements.

MicrosoftSign-in succeeds at Microsoft but Nettle says access denied

Cause: the user has no email address in Entra ID (no mailbox and an empty mail attribute), so no email claim reaches Nettle, or the email's domain isn't one you asked us to allow.

Fix: make sure the email optional claim is added (Microsoft step 6) and the user's Email field is set in their Entra ID profile. If they use a different domain, tell us to add it.

Any provider

AnySign-in worked for me but not for a colleague

Check the colleague's email domain is one you sent us, that they're assigned to the app (Microsoft with assignment required), and that they're using the right account. A private/incognito window rules out a cached session with a different account. If it still fails, send us the time of the attempt and their email address and we'll check our logs.

AnyA loop between Nettle and the sign-in page

Usually a browser blocking third-party cookies on a tightly locked-down profile, or a system clock that's far off. Try a private window and check the device clock. If it persists, email us with the browser and time of the attempt.

FAQ #

Do we have to do this? Nettle sign-in already works for us.

Today, some workspaces sign in through an OAuth app that Nettle operates for you. Bringing your own credentials puts the app inside your Google Cloud or Entra ID tenant, so your admins control it. You decide who can sign in, see sign-in logs, enforce your own conditional-access and MFA policies, and can revoke access instantly. We'll schedule the switch with you so nobody is locked out.

Will our users notice anything?

The first time each person signs in after the switch, they'll see a one-time consent screen with the app name you chose (for example "Nettle wants to know your name and email address"). After that, sign-in looks the same as before. For Microsoft, granting admin consent (Microsoft step 5) removes the screen for everyone.

Can we limit which people can sign in?

Yes, at two layers. In your identity provider: with Microsoft, turn on Assignment required (Microsoft step 7) and assign users or groups; with Google, choose an Internal audience to restrict sign-in to your Workspace organization. In Nettle: we only admit the email domains you give us.

We use Okta, OneLogin, Ping, JumpCloud or another provider.

Nettle works with any standards-compliant OpenID Connect provider. The steps are similar: create an OIDC web application with the redirect URI above and the openid email profile scopes, then send us the issuer URL, Client ID and Client Secret. Email us and we'll send the specifics for your provider.

Can we use one app for several Nettle workspaces?

Yes. Add each workspace's redirect URI to the same client: Google allows several Authorized redirect URIs, and Microsoft allows several Web redirect URIs. Then send us the same Client ID and secret for each workspace.

What happens if we delete the app or the secret?

Sign-in to Nettle stops working right away, but data in Nettle is not affected. This also works as an emergency off-switch. To restore access, create a new secret (or a new app) and send it to us.

Need a hand?

Email us a screenshot of where you're stuck, or ask for a short screen-share and we'll set it up together.