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})