Platform sign-in
Let your people open your customer workspaces in eSignStack with a login link from your app or with your own OpenID Connect provider.
A platform has two ways to sign its people in without a separate eSignStack password:
- Login links: your server asks for a single-use link for one person and one workspace, then redirects them to it.
- Sign in with your platform (OIDC): you register your OpenID Connect provider, and people sign in with their platform account.
Both identify a person by your own ID for them, never by email. Both give people managed memberships in your workspaces: memberships that follow what you send and are never mixed up with memberships added by hand.
Note
eSignStack turns on platform sign-in for your platform. Until it's on, login link requests return 403 and your sign-in page isn't available.
Login links
Call with a platform key that has the login_links:write ability:
POST /api/v1/login_links
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"workspace": "ws_01J8Z3Q4M7X2V5N9K6T1R0WABC",
"actor": {
"external_id": "user_4821",
"email": "jane@example.com",
"name": "Jane Doe",
"role": "admin",
"email_verified": true
},
"return_to": "/acme-dental/envelopes"
}| Field | Notes |
|---|---|
workspace |
A workspace your platform owns, in the same mode as the key. |
actor.external_id |
Your ID for the person. Required. |
actor.email |
Required. |
actor.role |
The workspace role: admin, developer or member. Never owner. |
actor.email_verified |
Set true only if you verified the address yourself. Defaults to false. |
return_to |
Optional path in eSignStack to land on, such as /acme-dental/envelopes. Full URLs are rejected. |
The response has a single-use url that expires after 60 seconds. Redirect the browser to it right away. Without return_to, the person lands on the workspace dashboard.
First sign-in
- New email: we create an eSignStack account and add the person to the workspace with the role you sent. Later links update the role. Without
email_verified: true, the account's email stays unverified and envelopes already sent to that address aren't linked to it. - Email already has an eSignStack account: nothing is linked silently. If you sent
email_verified: true, we email that address a confirmation link (valid for 60 minutes); once the account holder confirms, the sign-in is linked. If you didn't, the sign-in is refused. - Existing account whose email was never verified: confirming takes the account over. Its password stops working, two-factor authentication is removed and its other sessions end.
Remove a person
POST /api/v1/login_identities/user_4821/deprovision
Authorization: Bearer sk_live_…This removes every membership that login links created for user_4821 and ends their platform sessions at once. Their eSignStack account, workspaces of their own and your workspaces' documents are untouched. A later login link signs them in again.
Sign in with your platform (OIDC)
Register your provider
A platform admin opens Sign-in (identity provider) in the platform console and fills in:
- Display name and an optional Logo URL, shown on your sign-in page.
- Issuer: your HTTPS issuer URL, exactly as it appears in your discovery document. We read the discovery document and signing keys when you save, and pin them.
- Client ID and Client secret.
- Tenant claim (default
tenants): the ID token claim that lists the person's workspaces. - Role mapping: one
your role=workspace roleper line, such asdirector=admin. Workspace roles areadminormember. - Platform workspaces require a sign-in through this provider within the last 12 hours (on by default).
- Platform role claim (optional): a claim that grants console roles (
admin,developer,billingorsupport). Each grant is audited. - Console MFA (optional): accepted
amrand/oracrvalues. When set, platform admins must sign in through your provider with a matching value to open the console.
After saving, the page lists what to give your provider and where to link people:
| Setting | Value |
|---|---|
| Redirect URI | https://esignstack.app/sso/{provider}/callback |
| Back-channel logout URI | https://esignstack.app/sso/{provider}/backchannel-logout |
| Start sign-in | https://esignstack.app/sso/{provider}/start |
| Your sign-in page | https://esignstack.app/login/{your-platform} |
Disable turns the provider off. You can also manage it with the API (/identity_providers, live platform key with identity_providers:write).
The sign-in flow
We use the authorization code flow with PKCE (S256), state and nonce, scope openid email profile, and send the client secret in the token request body. A sign-in must finish within 10 minutes of starting.
The ID token must:
- be signed with RS256 or ES256 by a key in your published key set (
noneand HMAC are refused); - have
issexactly equal to the registered issuer, andaudcontaining the client ID (withazpequal to it when there are several audiences); - pass
exp,iatandnoncechecks, allowing two minutes of clock skew; - include
emailandemail_verifiedas the booleantrue.
A person is identified by your issuer and their sub. The same account rules as login links apply: an existing account with the same email is linked only after its holder confirms by email.
Claims
| Claim | Used for |
|---|---|
sub |
The person's ID. Required. |
email, email_verified |
Account email. email_verified must be true. |
name |
Display name for a new account. |
| Tenant claim | [{ "external_id": "customer_1001", "role": "director" }] |
sid |
Lets back-channel logout end one session. |
amr, acr |
Checked against Console MFA, if set. |
| Platform role claim | Grants a console role, if configured. |
Each external_id matches only a workspace of your platform with that external ID. Each role goes through the role mapping; admin and member pass through unmapped, any other unmapped role grants nothing, and owner is never granted.
Membership sync
Memberships are synced at every OIDC sign-in: added, role-updated, or removed when the tenant claim no longer lists the workspace. Memberships added by hand, or by login links, are never touched. A person with no workspace who isn't a platform member is refused.
Sign-out and removal
- Back-channel logout: when your provider posts a logout token to the back-channel logout URI, we end the matching platform sessions at once (by
sid, or every session for thesub). - Deprovision: call
POST /api/v1/identity_providers/{provider}/subjects/{sub}/deprovisionwith a live platform key. It removes the memberships your provider manages for that person and ends their platform sessions.
Recent platform sign-in
By default, your workspaces are reachable only in a session started through your platform (a login link or your provider) in the last 12 hours, so a person you remove loses access quickly. Sessions from a password or Google sign-in don't count. When a session gets too old and you have a provider, eSignStack sends the browser back through it to sign in again.
If you've registered a provider, you can let people use your workspaces with a password or Google sign-in too: clear Platform workspaces require a sign-in through this provider within the last 12 hours. Workspaces people own themselves are never affected.
Audit log
Each step is recorded in the console's Audit log, including sso.login_link_issued, sso.signed_in, sso.user_provisioned, sso.membership_granted, sso.membership_role_changed, sso.membership_revoked, sso.account_link_requested, sso.account_link_confirmed, sso.platform_role_granted, sso.sessions_revoked, sso.deprovisioned, sso.sign_in_refused and identity_provider.updated.