2025-04-01 10:38:02 +09:00

77 lines
2.4 KiB
TypeScript

import { useState } from 'react';
import { UseFormSetValue } from 'react-hook-form';
import { AppEvents } from '@grafana/data';
import { getAppEvents, getBackendSrv } from '@grafana/runtime';
import { Button } from '@grafana/ui';
import { Trans } from '../../../core/internationalization';
import { ServerDiscoveryFormData, SSOProviderDTO } from '../types';
import { ServerDiscoveryModal } from './ServerDiscoveryModal';
interface Props {
setValue: UseFormSetValue<SSOProviderDTO>;
}
export const ServerDiscoveryField = ({ setValue }: Props) => {
const appEvents = getAppEvents();
const [isModalOpen, setModalVisibility] = useState(false);
const [isLoading, setLoading] = useState(false);
const onClose = () => setModalVisibility(false);
const onSuccess = async (data: ServerDiscoveryFormData) => {
setLoading(true);
try {
const wellKnownSuffix = '/.well-known/openid-configuration';
const url = new URL(data.url);
if (!url.pathname.includes(wellKnownSuffix)) {
data.url = url.origin + wellKnownSuffix;
}
const res = await getBackendSrv().get(data.url);
if (!res['token_endpoint'] || !res['authorization_endpoint']) {
appEvents.publish({
type: AppEvents.alertWarning.name,
payload: ['The URL provided is not a valid .well-known/openid-configuration endpoint'],
});
return;
}
setValue('tokenUrl', res['token_endpoint']);
setValue('authUrl', res['authorization_endpoint']);
if (res['userinfo_endpoint']) {
setValue('apiUrl', res['userinfo_endpoint']);
}
appEvents.publish({
type: AppEvents.alertSuccess.name,
payload: ['OpenID Connect Discovery URL has been successfully fetched.'],
});
} catch (error) {
appEvents.publish({
type: AppEvents.alertWarning.name,
payload: ['Failed to fetch URL or invalid content'],
});
} finally {
onClose();
setLoading(false);
}
};
return (
<>
<Button
type="button"
variant="secondary"
onClick={() => {
setModalVisibility(true);
}}
>
<Trans i18nKey={'oauth.form.server-discovery-action-button'}>Enter OpenID Connect Discovery URL</Trans>
</Button>
<ServerDiscoveryModal isOpen={isModalOpen} onClose={onClose} onSuccess={onSuccess} isLoading={isLoading} />
</>
);
};