[{"data":1,"prerenderedAt":547},["ShallowReactive",2],{"merchant-context":3,"docs-navigation":4,"docs-page-\u002Fdocs\u002Fgetting-started\u002Fquickstart":132,"docs-surround-\u002Fdocs\u002Fgetting-started\u002Fquickstart":544},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":22,"body":134,"description":538,"extension":539,"meta":540,"navigation":541,"path":23,"seo":542,"stem":24,"__hash__":543},"docs\u002Fdocs\u002F1.getting-started\u002F2.quickstart.md",{"type":135,"value":136,"toc":532},"minimark",[137,142,155,170,174,193,203,219,240,254,258,265,372,467,471,508,519,528],[138,139,141],"h2",{"id":140},"_1-註冊-partner-client","1. 註冊 Partner Client",[143,144,145,146,150,151,154],"p",{},"請平台管理員為特定 Merchant 建立一個 Partner Client，選擇 ",[147,148,149],"code",{},"production"," 或 ",[147,152,153],{},"sandbox","，並設定精確的 redirect URI 與 scope allowlist。產生的 client_secret 只會在該次回應中顯示一次，請立即複製到你的後端 secret manager；平台只保存其 hash，之後無法再次顯示。",[143,156,157,158,161,162,165,166,169],{},"本機開發時，可選用的 seeder 會建立 ",[147,159,160],{},"sample-app","，callback 為 ",[147,163,164],{},"sample-app:\u002F\u002Fauth\u002Fekyc\u002Fcallback","。可用 ",[147,167,168],{},"PARTNER_SAMPLE_APP_SECRET"," 覆寫其僅限本機使用的 secret。",[138,171,173],{"id":172},"_2-發起授權","2. 發起授權",[143,175,176,177,180,181,184,185,188,189,192],{},"你的 Application 以包含 ",[147,178,179],{},"client_id","、",[147,182,183],{},"redirect_uri","、以空白分隔的 ",[147,186,187],{},"scope","，以及不可預測的 ",[147,190,191],{},"state"," 的 authorize URI 開啟 eKYC App。",[194,195,201],"pre",{"className":196,"code":198,"language":199,"meta":200},[197],"language-text","ekyc:\u002F\u002Fauthorize?client_id=sample-app&redirect_uri=sample-app%3A%2F%2Fauth%2Fekyc%2Fcallback&scope=profile.basic%20kyc.status&state=RANDOM_STATE\n","text","",[147,202,198],{"__ignoreMap":200},[143,204,205,206,209,210,212,213,215,216,218],{},"使用者裝置必須已安裝 eKYC 行動 App，且該 App 已註冊 ",[147,207,208],{},"ekyc:\u002F\u002Fauthorize"," custom scheme。使用者登入並明確同意後，App 會帶著 ",[147,211,147],{}," 與 ",[147,214,191],{}," 回到 allowlist 中的 callback。若 ",[147,217,191],{}," 不相符，必須拒絕該 callback。目前的協定在使用者取消時不會送出任何 callback。",[143,220,221,222,225,226,212,229,232,233,235,236,239],{},"建議另加入選用的 S256 PKCE：由你的後端產生並保存 ",[147,223,224],{},"code_verifier","，只把對應的 ",[147,227,228],{},"code_challenge",[147,230,231],{},"code_challenge_method=S256"," 加入 authorize URI。App 會保留並轉送 challenge；下方 token 交換 JSON 需再附上同一次請求的 ",[147,234,224],{},"。PKCE 不會取代 ",[147,237,238],{},"client_secret","。",[143,241,242,243,180,245,212,247,249,250,253],{},"在啟用同意動作之前，已登入的 eKYC App 會以相同的 ",[147,244,179],{},[147,246,183],{},[147,248,187],{}," 呼叫 ",[147,251,252],{},"POST \u002Fapi\u002Fpartner-auth\u002Fpreview","。Preview 會顯示可信任的 Application、Merchant、Organization、環境、membership 狀態，以及最新的後端 Eligibility；它不會建立 membership，也不會授予授權。",[138,255,257],{"id":256},"_3-交換-code","3. 交換 code",[143,259,260,261,264],{},"從你的 Application 後端呼叫 ",[147,262,263],{},"POST \u002Fapi\u002Fpartner-auth\u002Ftoken","，送出 JSON：",[194,266,270],{"className":267,"code":268,"language":269,"meta":200,"style":200},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST https:\u002F\u002Fidentity.example.com\u002Fapi\u002Fpartner-auth\u002Ftoken \\\n  -H \"Accept: application\u002Fjson\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"client_id\": \"sample-app\",\n    \"client_secret\": \"YOUR_CLIENT_SECRET\",\n    \"code\": \"AUTHORIZATION_CODE\",\n    \"redirect_uri\": \"sample-app:\u002F\u002Fauth\u002Fekyc\u002Fcallback\"\n  }'\n","bash",[147,271,272,295,313,327,339,345,351,357,363],{"__ignoreMap":200},[273,274,277,281,285,288,291],"span",{"class":275,"line":276},"line",1,[273,278,280],{"class":279},"sBMFI","curl",[273,282,284],{"class":283},"sfazB"," -X",[273,286,287],{"class":283}," POST",[273,289,290],{"class":283}," https:\u002F\u002Fidentity.example.com\u002Fapi\u002Fpartner-auth\u002Ftoken",[273,292,294],{"class":293},"sTEyZ"," \\\n",[273,296,298,301,305,308,311],{"class":275,"line":297},2,[273,299,300],{"class":283},"  -H",[273,302,304],{"class":303},"sMK4o"," \"",[273,306,307],{"class":283},"Accept: application\u002Fjson",[273,309,310],{"class":303},"\"",[273,312,294],{"class":293},[273,314,316,318,320,323,325],{"class":275,"line":315},3,[273,317,300],{"class":283},[273,319,304],{"class":303},[273,321,322],{"class":283},"Content-Type: application\u002Fjson",[273,324,310],{"class":303},[273,326,294],{"class":293},[273,328,330,333,336],{"class":275,"line":329},4,[273,331,332],{"class":283},"  -d",[273,334,335],{"class":303}," '",[273,337,338],{"class":283},"{\n",[273,340,342],{"class":275,"line":341},5,[273,343,344],{"class":283},"    \"client_id\": \"sample-app\",\n",[273,346,348],{"class":275,"line":347},6,[273,349,350],{"class":283},"    \"client_secret\": \"YOUR_CLIENT_SECRET\",\n",[273,352,354],{"class":275,"line":353},7,[273,355,356],{"class":283},"    \"code\": \"AUTHORIZATION_CODE\",\n",[273,358,360],{"class":275,"line":359},8,[273,361,362],{"class":283},"    \"redirect_uri\": \"sample-app:\u002F\u002Fauth\u002Fekyc\u002Fcallback\"\n",[273,364,366,369],{"class":275,"line":365},9,[273,367,368],{"class":283},"  }",[273,370,371],{"class":303},"'\n",[194,373,377],{"className":374,"code":375,"language":376,"meta":200,"style":200},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"access_token\": \"PARTNER_ACCESS_TOKEN\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"profile.basic kyc.status\"\n}\n","json",[147,378,379,383,407,427,444,462],{"__ignoreMap":200},[273,380,381],{"class":275,"line":276},[273,382,338],{"class":303},[273,384,385,388,392,394,397,399,402,404],{"class":275,"line":297},[273,386,387],{"class":303},"  \"",[273,389,391],{"class":390},"spNyl","access_token",[273,393,310],{"class":303},[273,395,396],{"class":303},":",[273,398,304],{"class":303},[273,400,401],{"class":283},"PARTNER_ACCESS_TOKEN",[273,403,310],{"class":303},[273,405,406],{"class":303},",\n",[273,408,409,411,414,416,418,420,423,425],{"class":275,"line":315},[273,410,387],{"class":303},[273,412,413],{"class":390},"token_type",[273,415,310],{"class":303},[273,417,396],{"class":303},[273,419,304],{"class":303},[273,421,422],{"class":283},"Bearer",[273,424,310],{"class":303},[273,426,406],{"class":303},[273,428,429,431,434,436,438,442],{"class":275,"line":329},[273,430,387],{"class":303},[273,432,433],{"class":390},"expires_in",[273,435,310],{"class":303},[273,437,396],{"class":303},[273,439,441],{"class":440},"sbssI"," 3600",[273,443,406],{"class":303},[273,445,446,448,450,452,454,456,459],{"class":275,"line":341},[273,447,387],{"class":303},[273,449,187],{"class":390},[273,451,310],{"class":303},[273,453,396],{"class":303},[273,455,304],{"class":303},[273,457,458],{"class":283},"profile.basic kyc.status",[273,460,461],{"class":303},"\"\n",[273,463,464],{"class":275,"line":347},[273,465,466],{"class":303},"}\n",[138,468,470],{"id":469},"_4-讀取使用者-profile","4. 讀取使用者 profile",[194,472,474],{"className":267,"code":473,"language":269,"meta":200,"style":200},"curl https:\u002F\u002Fidentity.example.com\u002Fapi\u002Fpartner-auth\u002Fme \\\n  -H \"Accept: application\u002Fjson\" \\\n  -H \"Authorization: Bearer PARTNER_ACCESS_TOKEN\"\n",[147,475,476,485,497],{"__ignoreMap":200},[273,477,478,480,483],{"class":275,"line":276},[273,479,280],{"class":279},[273,481,482],{"class":283}," https:\u002F\u002Fidentity.example.com\u002Fapi\u002Fpartner-auth\u002Fme",[273,484,294],{"class":293},[273,486,487,489,491,493,495],{"class":275,"line":297},[273,488,300],{"class":283},[273,490,304],{"class":303},[273,492,307],{"class":283},[273,494,310],{"class":303},[273,496,294],{"class":293},[273,498,499,501,503,506],{"class":275,"line":315},[273,500,300],{"class":283},[273,502,304],{"class":303},[273,504,505],{"class":283},"Authorization: Bearer PARTNER_ACCESS_TOKEN",[273,507,461],{"class":303},[143,509,510,511,514,515,518],{},"請以回傳的 partner-specific ",[147,512,513],{},"sub"," 作為穩定的外部身份 key。不要以 Email 或 ",[147,516,517],{},"identity_profile_id"," 作為你產品帳號的 key。",[520,521,525],"u-alert",{"color":522,"title":523,"variant":524},"info","協定邊界","soft",[143,526,527],{},"eKYC Identity Partner Auth 是平台自有協定，不是 OAuth 2.1 或 OpenID Connect。",[529,530,531],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":200,"searchDepth":297,"depth":297,"links":533},[534,535,536,537],{"id":140,"depth":297,"text":141},{"id":172,"depth":297,"text":173},{"id":256,"depth":297,"text":257},{"id":469,"depth":297,"text":470},"以短效 authorization code 換取授權範圍內的身份資料。","md",{},{"icon":25},{"title":22,"description":538},"2ncow0bT3_H7W2vTiFl7HURMrcFGVAGQRdwDXACBbgo",[545,546],{"title":17,"path":18,"stem":19,"icon":20,"children":-1},{"title":27,"path":28,"stem":29,"icon":30,"children":-1},1793286051039]