Trading Widget 인증

새로운 임베디드 트레이딩 SSO 통합을 위해 partner-token을 사용하세요.

Markdown으로 보기

Partner-Token은 URL 에 짧은 토큰을 넣지 않고 파트너 백엔드에 apiSecret 을 유지합니다.

1const widget = TradingWidget.create('#trading-widget', {
2 baseUrl: 'https://app.6mm.com',
3 auth: {
4 mode: 'partner-token',
5 tokenProvider: async ({ channelId, symbol, reason }) => {
6 const resp = await fetch('/api/trading/embed-token', {
7 method: 'POST',
8 credentials: 'include',
9 headers: { 'Content-Type': 'application/json' },
10 body: JSON.stringify({ channelId, symbol, reason }),
11 })
12
13 if (!resp.ok) {
14 throw new Error('Failed to request embed token')
15 }
16
17 return resp.json()
18 },
19 },
20})

백엔드 플로우

1. Partner frontend receives auth_request from the iframe.
2. SDK calls tokenProvider.
3. Partner frontend calls its own backend.
4. Partner backend validates the partner session.
5. Partner backend calls 6MM Agent API or Java SDK createEmbedToken.
6. SDK sends embedToken to the iframe through postMessage.
7. iframe exchanges embedToken for a 6MM access token.
8. iframe continues initialization and emits ready.

tokenProvider 계약

필드연출설명
channelIdSDK -> 파트너 백엔드고유 위젯 세션 식별자. 백엔드가 createEmbedToken에게 전달해야 합니다.
상징SDK -> 파트너 백엔드현재 요청 거래 심볼입니다. 필요할 때 토큰 범위를 설정하는 데 사용하세요.
이유SDK -> 파트너 백엔드왜 SDK 가 초기 로드나 새로고침 같은 토큰을 요청하는지 궁금합니다.
embedToken파트너 백엔드 -> SDKAgent SDK 또는 에이전트가 생성한 단명한 토큰API.
expireAt파트너 백엔드 -> SDK토큰 만료 타임스탬프가 반환 6MM.

고장 처리

상태권장 취급 방법
파트너 세션 만료파트너 엔드포인트에서 401을 반환하고 사용자에게 다시 로그인을 요청하세요.
토큰 생성이 일시적으로 실패했습니다tokenProvider에 오류를 입력하고 위젯이 인증 오류를 표시하도록 하세요.
channelId 불일치요청을 거부하고 위젯 인스턴스를 다시 생성하세요.
사용자는 거래가 허용되지 않습니다파트너가 제어하는 오류를 반환하고 임베드 토큰을 생성하지 마세요.

호환성 모드: 에이전트-SSO

agent-SSO는 이전의 /agent-entry 티켓 흐름을 유지합니다. 새로운 통합에는 파트너 토큰을 선호하세요.

1const widget = TradingWidget.create('#trading-widget', {
2 baseUrl: 'https://app.6mm.com',
3 auth: {
4 mode: 'agent-sso',
5 entryUrlProvider: async ({ redirectPath }) => {
6 const resp = await fetch('/api/trading-entry', {
7 method: 'POST',
8 credentials: 'include',
9 headers: { 'Content-Type': 'application/json' },
10 body: JSON.stringify({ redirectPath }),
11 })
12 const data = await resp.json()
13 return data.webUrl
14 },
15 },
16})