[{"data":1,"prerenderedAt":245},["ShallowReactive",2],{"merchant-context":3,"docs-navigation":4,"docs-page-\u002Fdocs\u002Fpartner-auth\u002Fauthorization-flow":132,"docs-surround-\u002Fdocs\u002Fpartner-auth\u002Fauthorization-flow":242},null,[5],{"title":6,"path":7,"stem":8,"children":9,"page":36},"Docs","\u002Fdocs","docs",[10,37,58,89,110],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":36},"入門指南","i-lucide-compass","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[16,21,26,31],{"title":17,"path":18,"stem":19,"icon":20},"總覽","\u002Fdocs\u002Fgetting-started\u002Foverview","docs\u002F1.getting-started\u002F1.overview","i-lucide-map",{"title":22,"path":23,"stem":24,"icon":25},"快速開始","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F1.getting-started\u002F2.quickstart","i-lucide-rocket",{"title":27,"path":28,"stem":29,"icon":30},"架構","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002F1.getting-started\u002F3.architecture","i-lucide-network",{"title":32,"path":33,"stem":34,"icon":35},"Early Access Core","\u002Fdocs\u002Fgetting-started\u002Fearly-access-core","docs\u002F1.getting-started\u002F4.early-access-core","i-lucide-box",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Partner Auth","i-lucide-shield","\u002Fdocs\u002Fpartner-auth","docs\u002F2.partner-auth",[43,48,53],{"title":44,"path":45,"stem":46,"icon":47},"授權流程","\u002Fdocs\u002Fpartner-auth\u002Fauthorization-flow","docs\u002F2.partner-auth\u002F1.authorization-flow","i-lucide-route",{"title":49,"path":50,"stem":51,"icon":52},"Scopes","\u002Fdocs\u002Fpartner-auth\u002Fscopes","docs\u002F2.partner-auth\u002F2.scopes","i-lucide-list-checks",{"title":54,"path":55,"stem":56,"icon":57},"Token 交換","\u002Fdocs\u002Fpartner-auth\u002Ftoken-exchange","docs\u002F2.partner-auth\u002F3.token-exchange","i-lucide-repeat-2",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"API 參考","i-lucide-braces","\u002Fdocs\u002Fapi-reference","docs\u002F3.api-reference",[64,69,74,79,84],{"title":65,"path":66,"stem":67,"icon":68},"授權預覽","\u002Fdocs\u002Fapi-reference\u002Fpreview","docs\u002F3.api-reference\u002F0.preview","i-lucide-scan-eye",{"title":70,"path":71,"stem":72,"icon":73},"授權","\u002Fdocs\u002Fapi-reference\u002Fauthorize","docs\u002F3.api-reference\u002F1.authorize","i-lucide-key-square",{"title":75,"path":76,"stem":77,"icon":78},"Token","\u002Fdocs\u002Fapi-reference\u002Ftoken","docs\u002F3.api-reference\u002F2.token","i-lucide-key-round",{"title":80,"path":81,"stem":82,"icon":83},"使用者 profile","\u002Fdocs\u002Fapi-reference\u002Fuser-profile","docs\u002F3.api-reference\u002F3.user-profile","i-lucide-user-round",{"title":85,"path":86,"stem":87,"icon":88},"KYC 申請","\u002Fdocs\u002Fapi-reference\u002Fkyc-application","docs\u002F3.api-reference\u002F4.kyc-application","i-lucide-scan-text",{"title":90,"icon":91,"path":92,"stem":93,"children":94,"page":36},"營運指引","i-lucide-settings","\u002Fdocs\u002Foperations","docs\u002F4.operations",[95,100,105],{"title":96,"path":97,"stem":98,"icon":99},"錯誤處理","\u002Fdocs\u002Foperations\u002Ferrors","docs\u002F4.operations\u002F1.errors","i-lucide-circle-alert",{"title":101,"path":102,"stem":103,"icon":104},"安全","\u002Fdocs\u002Foperations\u002Fsecurity","docs\u002F4.operations\u002F2.security","i-lucide-shield-check",{"title":106,"path":107,"stem":108,"icon":109},"版本管理","\u002Fdocs\u002Foperations\u002Fversioning","docs\u002F4.operations\u002F3.versioning","i-lucide-git-branch",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":36},"網站身分驗證","i-lucide-scan-face","\u002Fdocs\u002Fhosted-web","docs\u002F5.hosted-web",[116,120,124,128],{"title":117,"path":118,"stem":119},"網站快速串接","\u002Fdocs\u002Fhosted-web\u002Fquickstart","docs\u002F5.hosted-web\u002F1.quickstart",{"title":121,"path":122,"stem":123},"狀態、回呼與通知","\u002Fdocs\u002Fhosted-web\u002Fresults-and-webhooks","docs\u002F5.hosted-web\u002F2.results-and-webhooks",{"title":125,"path":126,"stem":127},"登入位置紀錄","\u002Fdocs\u002Fhosted-web\u002Flogin-location","docs\u002F5.hosted-web\u002F3.login-location",{"title":129,"path":130,"stem":131},"沙盒與驗收","\u002Fdocs\u002Fhosted-web\u002Fsandbox-and-errors","docs\u002F5.hosted-web\u002F4.sandbox-and-errors",{"id":133,"title":44,"body":134,"description":236,"extension":237,"meta":238,"navigation":239,"path":45,"seo":240,"stem":46,"__hash__":241},"docs\u002Fdocs\u002F2.partner-auth\u002F1.authorization-flow.md",{"type":135,"value":136,"toc":231},"minimark",[137,158,163,173,186,193,200,215,219,225],[138,139,140,141,145,146,150,151,154,155,157],"p",{},"Partner Auth 是平台自有的 authorization-code-like 協定。它",[142,143,144],"strong",{},"不是 OAuth 2.1 或 OpenID Connect","。token exchange 支援選用的 S256 PKCE：授權時帶 ",[147,148,149],"code",{},"code_challenge","，交換時就必須帶對應的 ",[147,152,153],{},"code_verifier","；沒帶 ",[147,156,149],{}," 的授權流程維持原本的 client secret 驗證。",[159,160,162],"h2",{"id":161},"組成-authorize-uri","組成 authorize URI",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","ekyc:\u002F\u002Fauthorize\n  ?client_id=sample-app\n  &redirect_uri=sample-app%3A%2F%2Fauth%2Fekyc%2Fcallback\n  &scope=profile.basic%20kyc.status\n  &state=RANDOM_STATE\n","text","",[147,172,168],{"__ignoreMap":170},[138,174,175,176,178,179,181,182,185],{},"使用 S256 PKCE 時，Application 後端保存 ",[147,177,153],{},"，並在 URI 加上 ",[147,180,149],{}," 與 ",[147,183,184],{},"code_challenge_method=S256","。App 會在登入後保留這兩個欄位，並傳給 authorize API；不會取得 verifier。Challenge 必須是 43–128 字元的 base64url 字串；省略 method 時使用 S256。重複的 PKCE 參數、格式錯誤的 challenge、其他 method，或只有 method 沒有 challenge 的 deep link 都會被拒絕，不會自動改用未啟用 PKCE 的流程。",[138,187,188,189,192],{},"登入後，eKYC App 會先把請求欄位送到需登入的 ",[147,190,191],{},"POST \u002Fapi\u002Fpartner-auth\u002Fpreview","。在平台確認 Organization、Merchant、Partner Client 皆為 active、環境、allowlist 中的 redirect URI、允許的 scopes、membership 狀態與最新的後端 Eligibility 之前，同意動作會保持鎖定。Preview 不會建立 membership。",[138,194,195,196,199],{},"使用者檢視並核准 scopes 後，eKYC App 才會把同一組 URI 轉換為需登入的 ",[147,197,198],{},"POST \u002Fapi\u002Fpartner-auth\u002Fauthorize"," 請求。",[138,201,202,203,206,207,210,211,214],{},"Android 與 iOS build 都把 ",[147,204,205],{},"ekyc:\u002F\u002Fauthorize"," 註冊為 custom-scheme deep link。eKYC App 會在登入過程中保留待處理的請求，顯示同意畫面，將 API 回應與原始的 ",[147,208,209],{},"state","、",[147,212,213],{},"redirect_uri"," 比對後，再開啟已註冊的 callback。目前使用者取消時只會關閉同意畫面，不會送出錯誤 callback。",[159,216,218],{"id":217},"驗證-callback","驗證 callback",[164,220,223],{"className":221,"code":222,"language":169,"meta":170},[167],"sample-app:\u002F\u002Fauth\u002Fekyc\u002Fcallback?code=SHORT_LIVED_CODE&state=RANDOM_STATE\n",[147,224,222],{"__ignoreMap":170},[138,226,227,228,230],{},"你的 App 必須精確比對 ",[147,229,209],{},"、拒絕缺漏的值，並立即把 code 送到自己的後端。Code 會在 5 分鐘後過期、只能使用一次，且綁定於該 client 與 redirect URI。",{"title":170,"searchDepth":232,"depth":232,"links":233},2,[234,235],{"id":161,"depth":232,"text":162},{"id":217,"depth":232,"text":218},"在 eKYC App 中發起同意，並安全地驗證 callback。","md",{},{"icon":47},{"title":44,"description":236},"_bYYHojhLmKYLl-yA3nkUY-FR1AKTfq1mj3u0sVOd_w",[243,244],{"title":32,"path":33,"stem":34,"icon":35,"children":-1},{"title":49,"path":50,"stem":51,"icon":52,"children":-1},1793286051041]