Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

external-member-sso-auth.tsx 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. 'use client'
  2. import { useRouter, useSearchParams } from 'next/navigation'
  3. import React, { useCallback, useEffect } from 'react'
  4. import Toast from '@/app/components/base/toast'
  5. import { fetchWebOAuth2SSOUrl, fetchWebOIDCSSOUrl, fetchWebSAMLSSOUrl } from '@/service/share'
  6. import { useGlobalPublicStore } from '@/context/global-public-context'
  7. import { SSOProtocol } from '@/types/feature'
  8. import Loading from '@/app/components/base/loading'
  9. import AppUnavailable from '@/app/components/base/app-unavailable'
  10. const ExternalMemberSSOAuth = () => {
  11. const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
  12. const searchParams = useSearchParams()
  13. const router = useRouter()
  14. const redirectUrl = searchParams.get('redirect_url')
  15. const showErrorToast = (message: string) => {
  16. Toast.notify({
  17. type: 'error',
  18. message,
  19. })
  20. }
  21. const getAppCodeFromRedirectUrl = useCallback(() => {
  22. if (!redirectUrl)
  23. return null
  24. const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
  25. const appCode = url.pathname.split('/').pop()
  26. if (!appCode)
  27. return null
  28. return appCode
  29. }, [redirectUrl])
  30. const handleSSOLogin = useCallback(async () => {
  31. const appCode = getAppCodeFromRedirectUrl()
  32. if (!appCode || !redirectUrl) {
  33. showErrorToast('redirect url or app code is invalid.')
  34. return
  35. }
  36. switch (systemFeatures.webapp_auth.sso_config.protocol) {
  37. case SSOProtocol.SAML: {
  38. const samlRes = await fetchWebSAMLSSOUrl(appCode, redirectUrl)
  39. router.push(samlRes.url)
  40. break
  41. }
  42. case SSOProtocol.OIDC: {
  43. const oidcRes = await fetchWebOIDCSSOUrl(appCode, redirectUrl)
  44. router.push(oidcRes.url)
  45. break
  46. }
  47. case SSOProtocol.OAuth2: {
  48. const oauth2Res = await fetchWebOAuth2SSOUrl(appCode, redirectUrl)
  49. router.push(oauth2Res.url)
  50. break
  51. }
  52. case '':
  53. break
  54. default:
  55. showErrorToast('SSO protocol is not supported.')
  56. }
  57. }, [getAppCodeFromRedirectUrl, redirectUrl, router, systemFeatures.webapp_auth.sso_config.protocol])
  58. useEffect(() => {
  59. handleSSOLogin()
  60. }, [handleSSOLogin])
  61. if (!systemFeatures.webapp_auth.sso_config.protocol) {
  62. return <div className="flex h-full items-center justify-center">
  63. <AppUnavailable code={403} unknownReason='sso protocol is invalid.' />
  64. </div>
  65. }
  66. return (
  67. <div className="flex h-full items-center justify-center">
  68. <Loading />
  69. </div>
  70. )
  71. }
  72. export default React.memo(ExternalMemberSSOAuth)