'use client'; import { Copy, ExternalLink, KeyRound, RefreshCw, Trash2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { OAuthClient } from '@/lib/api'; import { OAuthEndpoints, buildAuthorizeUrl } from '@/lib/oauth-url'; function CopyRow({ label, value, onCopy }: { label: string; value: string; onCopy: (value: string, label: string) => void }) { return (
{label}
{value}
); } export function OAuthClientDetailDialog({ client, endpoints, open, onOpenChange, onCopy, onRotateSecret, onToggleActive, onDelete }: { client: OAuthClient | null; endpoints: OAuthEndpoints; open: boolean; onOpenChange: (open: boolean) => void; onCopy: (value: string, label: string) => void; onRotateSecret: (clientId: string) => void; onToggleActive: (client: OAuthClient) => void; onDelete: (client: OAuthClient) => void; }) { if (!client) return null; const primaryRedirect = client.redirectUris[0] ?? 'https://app.example.com/oauth/callback'; const scope = client.scopes.join(' '); const sampleAuthorizeUrl = buildAuthorizeUrl(endpoints.issuer, { clientId: client.clientId, redirectUri: primaryRedirect, scope }); return ( {client.name}
{client.type === 'PUBLIC' ? 'Public' : 'Confidential'} {client.isActive ? 'Активно' : 'Отключено'} {client.createdByDisplayName ? ( Создал: {client.createdByDisplayName} ) : null}

Данные клиента

{client.type !== 'PUBLIC' ? (

Client Secret выдаётся один раз при создании или после «Новый secret». Храните только на backend.

) : null}

Подключение OAuth 2.0 / OpenID Connect

Issuer и endpoints берутся из настройки PUBLIC_API_URL в админке. В стороннем сервисе укажите issuer = базовый URL API, не authorization endpoint.

Быстрый старт
  1. Авторизуйте пользователя в IdP и получите userId.
  2. Перенаправьте на authorization endpoint с clientId, redirectUri, scope, userId.
  3. На backend обменяйте code через POST /oauth/token с client_secret.
  4. Запросите профиль через GET /oauth/userinfo с access token.
Открыть OpenID Configuration
{client.canManage ? (
{client.type !== 'PUBLIC' ? ( ) : null}
) : null}
); }