mirror of
https://github.com/open-webui/open-webui
synced 2025-01-19 09:16:44 +00:00
Merge pull request #8638 from Tryanks/oauth2-github
refactor: Extend OIDC support to all OAuth authentication methods
This commit is contained in:
commit
382dece228
@ -362,6 +362,30 @@ MICROSOFT_REDIRECT_URI = PersistentConfig(
|
|||||||
os.environ.get("MICROSOFT_REDIRECT_URI", ""),
|
os.environ.get("MICROSOFT_REDIRECT_URI", ""),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
GITHUB_CLIENT_ID = PersistentConfig(
|
||||||
|
"GITHUB_CLIENT_ID",
|
||||||
|
"oauth.github.client_id",
|
||||||
|
os.environ.get("GITHUB_CLIENT_ID", ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
GITHUB_CLIENT_SECRET = PersistentConfig(
|
||||||
|
"GITHUB_CLIENT_SECRET",
|
||||||
|
"oauth.github.client_secret",
|
||||||
|
os.environ.get("GITHUB_CLIENT_SECRET", ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
GITHUB_CLIENT_SCOPE = PersistentConfig(
|
||||||
|
"GITHUB_CLIENT_SCOPE",
|
||||||
|
"oauth.github.scope",
|
||||||
|
os.environ.get("GITHUB_CLIENT_SCOPE", "user:email"),
|
||||||
|
)
|
||||||
|
|
||||||
|
GITHUB_CLIENT_REDIRECT_URI = PersistentConfig(
|
||||||
|
"GITHUB_CLIENT_REDIRECT_URI",
|
||||||
|
"oauth.github.redirect_uri",
|
||||||
|
os.environ.get("GITHUB_CLIENT_REDIRECT_URI", ""),
|
||||||
|
)
|
||||||
|
|
||||||
OAUTH_CLIENT_ID = PersistentConfig(
|
OAUTH_CLIENT_ID = PersistentConfig(
|
||||||
"OAUTH_CLIENT_ID",
|
"OAUTH_CLIENT_ID",
|
||||||
"oauth.oidc.client_id",
|
"oauth.oidc.client_id",
|
||||||
@ -468,12 +492,20 @@ OAUTH_ALLOWED_DOMAINS = PersistentConfig(
|
|||||||
def load_oauth_providers():
|
def load_oauth_providers():
|
||||||
OAUTH_PROVIDERS.clear()
|
OAUTH_PROVIDERS.clear()
|
||||||
if GOOGLE_CLIENT_ID.value and GOOGLE_CLIENT_SECRET.value:
|
if GOOGLE_CLIENT_ID.value and GOOGLE_CLIENT_SECRET.value:
|
||||||
|
def google_oauth_register(client):
|
||||||
|
client.register(
|
||||||
|
name="google",
|
||||||
|
client_id=GOOGLE_CLIENT_ID.value,
|
||||||
|
client_secret=GOOGLE_CLIENT_SECRET.value,
|
||||||
|
server_metadata_url="https://accounts.google.com/.well-known/openid-configuration",
|
||||||
|
client_kwargs={
|
||||||
|
"scope": GOOGLE_OAUTH_SCOPE.value
|
||||||
|
},
|
||||||
|
redirect_uri=GOOGLE_REDIRECT_URI.value,
|
||||||
|
)
|
||||||
OAUTH_PROVIDERS["google"] = {
|
OAUTH_PROVIDERS["google"] = {
|
||||||
"client_id": GOOGLE_CLIENT_ID.value,
|
|
||||||
"client_secret": GOOGLE_CLIENT_SECRET.value,
|
|
||||||
"server_metadata_url": "https://accounts.google.com/.well-known/openid-configuration",
|
|
||||||
"scope": GOOGLE_OAUTH_SCOPE.value,
|
|
||||||
"redirect_uri": GOOGLE_REDIRECT_URI.value,
|
"redirect_uri": GOOGLE_REDIRECT_URI.value,
|
||||||
|
"register": google_oauth_register,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -481,13 +513,42 @@ def load_oauth_providers():
|
|||||||
and MICROSOFT_CLIENT_SECRET.value
|
and MICROSOFT_CLIENT_SECRET.value
|
||||||
and MICROSOFT_CLIENT_TENANT_ID.value
|
and MICROSOFT_CLIENT_TENANT_ID.value
|
||||||
):
|
):
|
||||||
|
def microsoft_oauth_register(client):
|
||||||
|
client.register(
|
||||||
|
name="microsoft",
|
||||||
|
client_id=MICROSOFT_CLIENT_ID.value,
|
||||||
|
client_secret=MICROSOFT_CLIENT_SECRET.value,
|
||||||
|
server_metadata_url=f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration",
|
||||||
|
client_kwargs={
|
||||||
|
"scope": MICROSOFT_OAUTH_SCOPE.value,
|
||||||
|
},
|
||||||
|
redirect_uri=MICROSOFT_REDIRECT_URI.value,
|
||||||
|
)
|
||||||
OAUTH_PROVIDERS["microsoft"] = {
|
OAUTH_PROVIDERS["microsoft"] = {
|
||||||
"client_id": MICROSOFT_CLIENT_ID.value,
|
|
||||||
"client_secret": MICROSOFT_CLIENT_SECRET.value,
|
|
||||||
"server_metadata_url": f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration",
|
|
||||||
"scope": MICROSOFT_OAUTH_SCOPE.value,
|
|
||||||
"redirect_uri": MICROSOFT_REDIRECT_URI.value,
|
"redirect_uri": MICROSOFT_REDIRECT_URI.value,
|
||||||
"picture_url": "https://graph.microsoft.com/v1.0/me/photo/$value",
|
"picture_url": "https://graph.microsoft.com/v1.0/me/photo/$value",
|
||||||
|
"register": microsoft_oauth_register,
|
||||||
|
}
|
||||||
|
|
||||||
|
if GITHUB_CLIENT_ID.value and GITHUB_CLIENT_SECRET.value:
|
||||||
|
def github_oauth_register(client):
|
||||||
|
client.register(
|
||||||
|
name="github",
|
||||||
|
client_id=GITHUB_CLIENT_ID.value,
|
||||||
|
client_secret=GITHUB_CLIENT_SECRET.value,
|
||||||
|
access_token_url="https://github.com/login/oauth/access_token",
|
||||||
|
authorize_url="https://github.com/login/oauth/authorize",
|
||||||
|
api_base_url="https://api.github.com",
|
||||||
|
userinfo_endpoint="https://api.github.com/user",
|
||||||
|
client_kwargs={
|
||||||
|
"scope": GITHUB_CLIENT_SCOPE.value
|
||||||
|
},
|
||||||
|
redirect_uri=GITHUB_CLIENT_REDIRECT_URI.value,
|
||||||
|
)
|
||||||
|
OAUTH_PROVIDERS["github"] = {
|
||||||
|
"redirect_uri": GITHUB_CLIENT_REDIRECT_URI.value,
|
||||||
|
"register": github_oauth_register,
|
||||||
|
"sub_claim": "id",
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -495,13 +556,21 @@ def load_oauth_providers():
|
|||||||
and OAUTH_CLIENT_SECRET.value
|
and OAUTH_CLIENT_SECRET.value
|
||||||
and OPENID_PROVIDER_URL.value
|
and OPENID_PROVIDER_URL.value
|
||||||
):
|
):
|
||||||
|
def oidc_oauth_register(client):
|
||||||
|
client.register(
|
||||||
|
name="oidc",
|
||||||
|
client_id=OAUTH_CLIENT_ID.value,
|
||||||
|
client_secret=OAUTH_CLIENT_SECRET.value,
|
||||||
|
server_metadata_url=OPENID_PROVIDER_URL.value,
|
||||||
|
client_kwargs={
|
||||||
|
"scope": OAUTH_SCOPES.value,
|
||||||
|
},
|
||||||
|
redirect_uri=OPENID_REDIRECT_URI.value,
|
||||||
|
)
|
||||||
OAUTH_PROVIDERS["oidc"] = {
|
OAUTH_PROVIDERS["oidc"] = {
|
||||||
"client_id": OAUTH_CLIENT_ID.value,
|
|
||||||
"client_secret": OAUTH_CLIENT_SECRET.value,
|
|
||||||
"server_metadata_url": OPENID_PROVIDER_URL.value,
|
|
||||||
"scope": OAUTH_SCOPES.value,
|
|
||||||
"name": OAUTH_PROVIDER_NAME.value,
|
"name": OAUTH_PROVIDER_NAME.value,
|
||||||
"redirect_uri": OPENID_REDIRECT_URI.value,
|
"redirect_uri": OPENID_REDIRECT_URI.value,
|
||||||
|
"register": oidc_oauth_register,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,17 +63,8 @@ auth_manager_config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
|||||||
class OAuthManager:
|
class OAuthManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.oauth = OAuth()
|
self.oauth = OAuth()
|
||||||
for provider_name, provider_config in OAUTH_PROVIDERS.items():
|
for _, provider_config in OAUTH_PROVIDERS.items():
|
||||||
self.oauth.register(
|
provider_config["register"](self.oauth)
|
||||||
name=provider_name,
|
|
||||||
client_id=provider_config["client_id"],
|
|
||||||
client_secret=provider_config["client_secret"],
|
|
||||||
server_metadata_url=provider_config["server_metadata_url"],
|
|
||||||
client_kwargs={
|
|
||||||
"scope": provider_config["scope"],
|
|
||||||
},
|
|
||||||
redirect_uri=provider_config["redirect_uri"],
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_client(self, provider_name):
|
def get_client(self, provider_name):
|
||||||
return self.oauth.create_client(provider_name)
|
return self.oauth.create_client(provider_name)
|
||||||
@ -207,7 +198,7 @@ class OAuthManager:
|
|||||||
log.warning(f"OAuth callback failed, user data is missing: {token}")
|
log.warning(f"OAuth callback failed, user data is missing: {token}")
|
||||||
raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
|
raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
|
||||||
|
|
||||||
sub = user_data.get("sub")
|
sub = user_data.get(OAUTH_PROVIDERS[provider].get("sub_claim", "sub"))
|
||||||
if not sub:
|
if not sub:
|
||||||
log.warning(f"OAuth callback failed, sub is missing: {user_data}")
|
log.warning(f"OAuth callback failed, sub is missing: {user_data}")
|
||||||
raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
|
raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
|
||||||
|
@ -374,6 +374,22 @@
|
|||||||
<span>{$i18n.t('Continue with {{provider}}', { provider: 'Microsoft' })}</span>
|
<span>{$i18n.t('Continue with {{provider}}', { provider: 'Microsoft' })}</span>
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if $config?.oauth?.providers?.github}
|
||||||
|
<button
|
||||||
|
class="flex justify-center items-center bg-gray-700/5 hover:bg-gray-700/10 dark:bg-gray-100/5 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition w-full rounded-full font-medium text-sm py-2.5"
|
||||||
|
on:click={() => {
|
||||||
|
window.location.href = `${WEBUI_BASE_URL}/oauth/github/login`;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="size-6 mr-3">
|
||||||
|
<path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.92 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57C20.565 21.795 24 17.31 24 12c0-6.63-5.37-12-12-12z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
<span>{$i18n.t('Continue with {{provider}}', { provider: 'GitHub' })}</span>
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
{#if $config?.oauth?.providers?.oidc}
|
{#if $config?.oauth?.providers?.oidc}
|
||||||
<button
|
<button
|
||||||
class="flex justify-center items-center bg-gray-700/5 hover:bg-gray-700/10 dark:bg-gray-100/5 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition w-full rounded-full font-medium text-sm py-2.5"
|
class="flex justify-center items-center bg-gray-700/5 hover:bg-gray-700/10 dark:bg-gray-100/5 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition w-full rounded-full font-medium text-sm py-2.5"
|
||||||
|
Loading…
Reference in New Issue
Block a user