Skip to content

Commit 636e493

Browse files
msukkariclaude
andauthored
feat: add JumpCloud as identity provider for SSO (#997)
* feat: add JumpCloud as identity provider for SSO Adds support for JumpCloud as an OIDC identity provider, enabling SSO authentication. Includes schema definition, SSO provider registration, UI components, analytics tracking, logo, and documentation. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * chore: update CHANGELOG for JumpCloud SSO feature --------- Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
1 parent 1ce1ec8 commit 636e493

File tree

14 files changed

+1074
-1
lines changed

14 files changed

+1074
-1
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
- [EE] Added JumpCloud as an identity provider for SSO authentication. [#997](https://github.com/sourcebot-dev/sourcebot/pull/997)
12+
1013
### Changed
1114
- Require explicit invocation of ask_codebase tool in MCP [#995](https://github.com/sourcebot-dev/sourcebot/pull/995)
1215
- Gate MCP API behind authentication when Ask GitHub is enabled. [#994](https://github.com/sourcebot-dev/sourcebot/pull/994)

docs/docs/configuration/idp.mdx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,4 +520,51 @@ An Authentik connection can be used for [authentication](/docs/configuration/aut
520520
</Steps>
521521
</Accordion>
522522

523+
### JumpCloud
524+
525+
A JumpCloud connection can be used for [authentication](/docs/configuration/auth). JumpCloud supports OIDC (OpenID Connect), which Sourcebot uses to authenticate users.
526+
527+
<Accordion title="instructions">
528+
<Steps>
529+
<Step title="Create an SSO Application in JumpCloud">
530+
To begin, you must create an SSO application in JumpCloud to facilitate the identity provider connection. For more information, see the [JumpCloud OIDC documentation](https://jumpcloud.com/support/sso-with-oidc).
531+
532+
When configuring your application:
533+
- Set the SSO type to "OIDC"
534+
- Add `<sourcebot_url>/api/auth/callback/jumpcloud` to the redirect URIs (ex. https://sourcebot.coolcorp.com/api/auth/callback/jumpcloud)
535+
- Set the login URL to `<sourcebot_url>/login`
536+
537+
After creating the application, note the `CLIENT_ID` and `CLIENT_SECRET`. The issuer URL is typically `https://oauth.id.jumpcloud.com`.
538+
</Step>
539+
<Step title="Define environment variables">
540+
The client id, secret, and issuer URL are provided to Sourcebot via environment variables. These can be named whatever you like
541+
(ex. `JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_ID`, `JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_SECRET`, and `JUMPCLOUD_IDENTITY_PROVIDER_ISSUER`)
542+
</Step>
543+
<Step title="Define the identity provider config">
544+
Create a `identityProvider` object in the [config file](/docs/configuration/config-file) with the following fields:
545+
546+
```json wrap icon="code"
547+
{
548+
"$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json",
549+
"identityProviders": [
550+
{
551+
"provider": "jumpcloud",
552+
"purpose": "sso",
553+
"clientId": {
554+
"env": "JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_ID"
555+
},
556+
"clientSecret": {
557+
"env": "JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_SECRET"
558+
},
559+
"issuer": {
560+
"env": "JUMPCLOUD_IDENTITY_PROVIDER_ISSUER"
561+
}
562+
}
563+
]
564+
}
565+
```
566+
</Step>
567+
</Steps>
568+
</Accordion>
569+
523570

docs/snippets/schemas/v3/identityProvider.schema.mdx

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,115 @@
842842
"issuer"
843843
]
844844
},
845+
"JumpCloudIdentityProviderConfig": {
846+
"type": "object",
847+
"additionalProperties": false,
848+
"properties": {
849+
"provider": {
850+
"const": "jumpcloud"
851+
},
852+
"purpose": {
853+
"const": "sso"
854+
},
855+
"clientId": {
856+
"anyOf": [
857+
{
858+
"type": "object",
859+
"properties": {
860+
"env": {
861+
"type": "string",
862+
"description": "The name of the environment variable that contains the token."
863+
}
864+
},
865+
"required": [
866+
"env"
867+
],
868+
"additionalProperties": false
869+
},
870+
{
871+
"type": "object",
872+
"properties": {
873+
"googleCloudSecret": {
874+
"type": "string",
875+
"description": "The resource name of a Google Cloud secret. Must be in the format `projects/<project-id>/secrets/<secret-name>/versions/<version-id>`. See https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets"
876+
}
877+
},
878+
"required": [
879+
"googleCloudSecret"
880+
],
881+
"additionalProperties": false
882+
}
883+
]
884+
},
885+
"clientSecret": {
886+
"anyOf": [
887+
{
888+
"type": "object",
889+
"properties": {
890+
"env": {
891+
"type": "string",
892+
"description": "The name of the environment variable that contains the token."
893+
}
894+
},
895+
"required": [
896+
"env"
897+
],
898+
"additionalProperties": false
899+
},
900+
{
901+
"type": "object",
902+
"properties": {
903+
"googleCloudSecret": {
904+
"type": "string",
905+
"description": "The resource name of a Google Cloud secret. Must be in the format `projects/<project-id>/secrets/<secret-name>/versions/<version-id>`. See https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets"
906+
}
907+
},
908+
"required": [
909+
"googleCloudSecret"
910+
],
911+
"additionalProperties": false
912+
}
913+
]
914+
},
915+
"issuer": {
916+
"anyOf": [
917+
{
918+
"type": "object",
919+
"properties": {
920+
"env": {
921+
"type": "string",
922+
"description": "The name of the environment variable that contains the token."
923+
}
924+
},
925+
"required": [
926+
"env"
927+
],
928+
"additionalProperties": false
929+
},
930+
{
931+
"type": "object",
932+
"properties": {
933+
"googleCloudSecret": {
934+
"type": "string",
935+
"description": "The resource name of a Google Cloud secret. Must be in the format `projects/<project-id>/secrets/<secret-name>/versions/<version-id>`. See https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets"
936+
}
937+
},
938+
"required": [
939+
"googleCloudSecret"
940+
],
941+
"additionalProperties": false
942+
}
943+
]
944+
}
945+
},
946+
"required": [
947+
"provider",
948+
"purpose",
949+
"clientId",
950+
"clientSecret",
951+
"issuer"
952+
]
953+
},
845954
"BitbucketServerIdentityProviderConfig": {
846955
"type": "object",
847956
"additionalProperties": false,
@@ -1776,6 +1885,115 @@
17761885
"clientSecret"
17771886
]
17781887
},
1888+
{
1889+
"type": "object",
1890+
"additionalProperties": false,
1891+
"properties": {
1892+
"provider": {
1893+
"const": "jumpcloud"
1894+
},
1895+
"purpose": {
1896+
"const": "sso"
1897+
},
1898+
"clientId": {
1899+
"anyOf": [
1900+
{
1901+
"type": "object",
1902+
"properties": {
1903+
"env": {
1904+
"type": "string",
1905+
"description": "The name of the environment variable that contains the token."
1906+
}
1907+
},
1908+
"required": [
1909+
"env"
1910+
],
1911+
"additionalProperties": false
1912+
},
1913+
{
1914+
"type": "object",
1915+
"properties": {
1916+
"googleCloudSecret": {
1917+
"type": "string",
1918+
"description": "The resource name of a Google Cloud secret. Must be in the format `projects/<project-id>/secrets/<secret-name>/versions/<version-id>`. See https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets"
1919+
}
1920+
},
1921+
"required": [
1922+
"googleCloudSecret"
1923+
],
1924+
"additionalProperties": false
1925+
}
1926+
]
1927+
},
1928+
"clientSecret": {
1929+
"anyOf": [
1930+
{
1931+
"type": "object",
1932+
"properties": {
1933+
"env": {
1934+
"type": "string",
1935+
"description": "The name of the environment variable that contains the token."
1936+
}
1937+
},
1938+
"required": [
1939+
"env"
1940+
],
1941+
"additionalProperties": false
1942+
},
1943+
{
1944+
"type": "object",
1945+
"properties": {
1946+
"googleCloudSecret": {
1947+
"type": "string",
1948+
"description": "The resource name of a Google Cloud secret. Must be in the format `projects/<project-id>/secrets/<secret-name>/versions/<version-id>`. See https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets"
1949+
}
1950+
},
1951+
"required": [
1952+
"googleCloudSecret"
1953+
],
1954+
"additionalProperties": false
1955+
}
1956+
]
1957+
},
1958+
"issuer": {
1959+
"anyOf": [
1960+
{
1961+
"type": "object",
1962+
"properties": {
1963+
"env": {
1964+
"type": "string",
1965+
"description": "The name of the environment variable that contains the token."
1966+
}
1967+
},
1968+
"required": [
1969+
"env"
1970+
],
1971+
"additionalProperties": false
1972+
},
1973+
{
1974+
"type": "object",
1975+
"properties": {
1976+
"googleCloudSecret": {
1977+
"type": "string",
1978+
"description": "The resource name of a Google Cloud secret. Must be in the format `projects/<project-id>/secrets/<secret-name>/versions/<version-id>`. See https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets"
1979+
}
1980+
},
1981+
"required": [
1982+
"googleCloudSecret"
1983+
],
1984+
"additionalProperties": false
1985+
}
1986+
]
1987+
}
1988+
},
1989+
"required": [
1990+
"provider",
1991+
"purpose",
1992+
"clientId",
1993+
"clientSecret",
1994+
"issuer"
1995+
]
1996+
},
17791997
{
17801998
"type": "object",
17811999
"additionalProperties": false,

0 commit comments

Comments
 (0)