@blod-nm/user-kit 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-key.js +1 -0
- package/dist/auth.js +1 -0
- package/dist/index.js +1 -0
- package/dist/login-ticket.js +1 -0
- package/dist/schemas.js +1 -0
- package/dist/token-broker.js +1 -0
- package/dist/user.js +1 -0
- package/dist/wechat.js +1 -0
- package/package.json +15 -6
- package/src/auth.js +0 -210
- package/src/index.js +0 -37
- package/src/schemas.js +0 -291
- package/src/user.js +0 -221
- package/src/wechat.js +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x1d46(){const _0x28b7ae=['A2v5swq','DNnPwvO','teriD2e','Dxfyvvu','A2v5x2HHC2G','z2v0','A2v5x2LK','yxbPA2v5ioETVUwpKEwKSEI0Pq','5P+L6k+IigTLEsdLPlhOTku','vKXJyM8','ndq3odaZnevxserpEq','5zck6zsaigTLEsdLPlhOTku','vKLZrLK','sLfTBfm','mJu5mZqZnu9vC2jSyW','mtmWreP3Egzd','DeD5A0G','zxHWAxjLC0f0','mtm4neP3t3zhCa','q1jfqvrfifrbqKXfieLgie5pvcbfweLtvfmGx191C2vYx3rVA2vUx2nHy2HLicGkicb1AwqGDgv4DcbquKLnqvjzieTfwsWGywnJzxnZx3rVA2vUihrLEhqGtK9uie5vteWSihjLzNjLC2HFDg9Rzw4GDgv4Dcbot1qGtLvmtcWkicbLEhbPCMvZx2f0igjPz2LUDcbot1qGtLvmtcWGDxbKyxrLzf9HDcb0Aw1LC3rHBxb0EIberuzbvuXuig5VDYGPie5pvcbovuXmkq','DwLK','C2HHmJu2','zgvSzxrL','zgLNzxn0','yxv0Ac5RzxKUy3jLyxrL','CMvZDwX0','vvbeqvrfif9FDxnLCL9Hy2nLC3nFA2v5ifnfvcbYzxzVA2vKx2f0pw5VDYGPlcb1CgrHDgvKx2f0pw5VDYGPifDirvjfigTLEv9Pzd0KmsbbtKqGDwLKpsqYieforcbYzxzVA2vKx2f0ieLtie5vteWGuKvuvvjosu5higTLEv9OyxnO','C2v0','nta4mdu5uw5TD3PP','yxv0Ac5RzxKUCMv2B2TL','AvLLEM8','EKnXtfK','nda0swnUDMjH','Afzdzvu','otaWmZa5Dg1pELjm','DMvYAwz5','C2L6zq','zxHWAxjLC19HDa','C3rYAw5N','CMv2B2TLzf9HDa','yxbPA2v5ioAxOoAvIa','q1jfqvrfieLorevyieLgie5pvcbfweLtvfmGAwr4x3vZzxjFywnJzxnZx2TLEv91AwqGt04Gx191C2vYx2fJy2vZC19RzxKODwLKkq','y2fJAgu','AuTwu08','mJGXnZvjBLbSDMS','A2v5x3bYzwzPEa','zKHXwgm','otKYndmYBg1lrwXA','CMvHC29U','Agv4','DwLKuMvM','DgHLBG','DxnLCG','rw9rtMq','ndeXwvLhyMz5','t0PpEeW','C2nLBMu','yxbPA2v5','Dw50AwW','zKX2CxC'];_0x1d46=function(){return _0x28b7ae;};return _0x1d46();}const _0x21c5b0=_0x18ce;(function(_0x1d7fab,_0x1946d7){const _0x5c2d93=_0x18ce,_0x3c76ca=_0x1d7fab();while(!![]){try{const _0x307f6e=-parseInt(_0x5c2d93(0xf6))/0x1+-parseInt(_0x5c2d93(0xf4))/0x2*(parseInt(_0x5c2d93(0x10a))/0x3)+parseInt(_0x5c2d93(0x103))/0x4+parseInt(_0x5c2d93(0x11e))/0x5+-parseInt(_0x5c2d93(0x11a))/0x6+-parseInt(_0x5c2d93(0x100))/0x7*(-parseInt(_0x5c2d93(0x122))/0x8)+parseInt(_0x5c2d93(0xf0))/0x9*(parseInt(_0x5c2d93(0x11f))/0xa);if(_0x307f6e===_0x1946d7)break;else _0x3c76ca['push'](_0x3c76ca['shift']());}catch(_0x3c6bc0){_0x3c76ca['push'](_0x3c76ca['shift']());}}}(_0x1d46,0x7f9a5));import{createHash}from'node:crypto';import{createIssuer,createVerifier}from'@blod-nm/ak';function _0x18ce(_0x43f6c5,_0x20ef71){_0x43f6c5=_0x43f6c5-0xe8;const _0x1d464c=_0x1d46();let _0x18cec9=_0x1d464c[_0x43f6c5];if(_0x18ce['lEUoAE']===undefined){var _0x3e5ed2=function(_0x18ce92){const _0x590ca0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3e3030='',_0x306c8e='';for(let _0x23bec4=0x0,_0x398ddb,_0x5e208f,_0x2f5dbd=0x0;_0x5e208f=_0x18ce92['charAt'](_0x2f5dbd++);~_0x5e208f&&(_0x398ddb=_0x23bec4%0x4?_0x398ddb*0x40+_0x5e208f:_0x5e208f,_0x23bec4++%0x4)?_0x3e3030+=String['fromCharCode'](0xff&_0x398ddb>>(-0x2*_0x23bec4&0x6)):0x0){_0x5e208f=_0x590ca0['indexOf'](_0x5e208f);}for(let _0x2f44d1=0x0,_0x3184b0=_0x3e3030['length'];_0x2f44d1<_0x3184b0;_0x2f44d1++){_0x306c8e+='%'+('00'+_0x3e3030['charCodeAt'](_0x2f44d1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x306c8e);};_0x18ce['iToXao']=_0x3e5ed2,_0x18ce['LVwQub']={},_0x18ce['lEUoAE']=!![];}const _0x188f21=_0x1d464c[0x0],_0xfc3ec1=_0x43f6c5+_0x188f21,_0x370c53=_0x18ce['LVwQub'][_0xfc3ec1];return!_0x370c53?(_0x18cec9=_0x18ce['iToXao'](_0x18cec9),_0x18ce['LVwQub'][_0xfc3ec1]=_0x18cec9):_0x18cec9=_0x370c53,_0x18cec9;}const CACHE_TTL_MS=0x7530,DEFAULT_TTL_SEC=0x278d00;export const DDL_USER_TOKEN_CACHE=_0x21c5b0(0x123);export const DDL_USER_ACCESS_KEY='CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20__user_access_key\x20(\x0a\x20\x20key_hash\x20text\x20PRIMARY\x20KEY,\x20key_id\x20text\x20NOT\x20NULL\x20UNIQUE,\x20uid\x20text\x20NOT\x20NULL,\x0a\x20\x20scene\x20text\x20NOT\x20NULL\x20DEFAULT\x20\x27\x27,\x20key_prefix\x20text\x20NOT\x20NULL,\x0a\x20\x20created_at\x20timestamptz\x20DEFAULT\x20now()\x20NOT\x20NULL,\x20expires_at\x20bigint\x20NOT\x20NULL,\x0a\x20\x20revoked_at\x20timestamptz,\x20updated_at\x20timestamptz\x20DEFAULT\x20now()\x20NOT\x20NULL)';export const DDL_USER_ACCESS_KEY_INDEX=_0x21c5b0(0xfd);const SQL_SELECT_KEY='SELECT\x20key_id,\x20uid,\x20scene,\x20key_prefix,\x20revoked_at,\x20expires_at\x20FROM\x20__user_access_key\x20WHERE\x20key_hash=$1',SQL_INSERT_KEY='INSERT\x20INTO\x20__user_access_key\x20(key_hash,\x20key_id,\x20uid,\x20scene,\x20key_prefix,\x20expires_at)\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6)',SQL_LIST_KEYS='SELECT\x20key_id,\x20key_prefix,\x20scene,\x20created_at,\x20expires_at,\x20revoked_at\x20FROM\x20__user_access_key\x20WHERE\x20uid=$1\x20ORDER\x20BY\x20created_at\x20DESC',SQL_REVOKE_KEY=_0x21c5b0(0xee),err=(_0x1bd34b,_0x45ae82)=>Object['assign'](new Error(_0x45ae82),{'code':_0x1bd34b});export const sha256hex=_0x274b77=>createHash(_0x21c5b0(0xe9))['update'](String(_0x274b77))[_0x21c5b0(0xeb)](_0x21c5b0(0x105));export const createVerifyCache=(_0x14c99d=CACHE_TTL_MS)=>{const _0x540278=_0x21c5b0,_0x45b020={};_0x45b020['EoQNd']=function(_0xaa4a79,_0x1b19c6){return _0xaa4a79<=_0x1b19c6;},_0x45b020[_0x540278(0xf5)]=function(_0x31efbc,_0x47cfac){return _0x31efbc+_0x47cfac;};const _0x50466b=_0x45b020,_0x56ce59=new Map();return{'get'(_0x512d5c){const _0xa5bccc=_0x540278,_0xe6ccfb=_0x56ce59[_0xa5bccc(0x115)](_0x512d5c);if(!_0xe6ccfb)return null;if(_0x50466b[_0xa5bccc(0x109)](_0xe6ccfb[_0xa5bccc(0x10e)],Date['now']()))return _0x56ce59[_0xa5bccc(0xea)](_0x512d5c),null;return _0xe6ccfb[_0xa5bccc(0xed)];},'set'(_0x5c7fa5,_0x297259){const _0x2447de=_0x540278;_0x56ce59[_0x2447de(0xef)](_0x5c7fa5,{'result':_0x297259,'until':_0x50466b[_0x2447de(0xf5)](Date['now'](),_0x14c99d)});},'clear'(_0x3d6e34){const _0x188158=_0x540278;_0x56ce59[_0x188158(0xea)](_0x3d6e34);},'size':()=>_0x56ce59[_0x540278(0xf8)]};};export function createKeyAbilities({cfg:_0x85fa6,runSql:_0x172b51}){const _0x27c160=_0x21c5b0,_0x17d107={'LDHwa':function(_0x104e1c){return _0x104e1c();},'JQmlS':function(_0x534d6b,_0x7ce8ed){return _0x534d6b(_0x7ce8ed);},'VLcbo':function(_0x54246d,_0x2c7326,_0x5126fb){return _0x54246d(_0x2c7326,_0x5126fb);},'VIsFY':function(_0x226382,_0x491771){return _0x226382??_0x491771;},'fLvqw':function(_0x92367d,_0x5d658a){return _0x92367d??_0x5d658a;},'fHqXc':function(_0x4c80bc,_0x4184cd,_0xd2c13d){return _0x4c80bc(_0x4184cd,_0xd2c13d);},'irUha':function(_0x1324df,_0x78cb2c){return _0x1324df(_0x78cb2c);},'OJOxL':function(_0x262380,_0x58f367){return _0x262380(_0x58f367);},'QbfBS':function(_0x13f0a4,_0x2191da,_0xcd2329){return _0x13f0a4(_0x2191da,_0xcd2329);},'iYezo':function(_0x1a77cb,_0x574159){return _0x1a77cb(_0x574159);},'iKVSO':function(_0x14b4e2,_0x48faf0,_0xa7c1c8){return _0x14b4e2(_0x48faf0,_0xa7c1c8);},'kkITX':'key_id\x20必填','zCqLY':_0x27c160(0x11b),'PngAl':_0x27c160(0xec),'vsiYZ':_0x27c160(0x108),'uqXUU':'签发新\x20apikey(当前\x20key\x20换\x20uid;scene\x20只存不用)','tGykH':'吊销\x20key(key_id\x20必须属于当前用户;0\x20行\x20→\x20404)','jkhHE':'auth.key.verify'},_0xaa7dea=createVerifyCache(),_0x20ebaf=()=>Number(_0x85fa6?.['akDefaultKeyTtlSec']??DEFAULT_TTL_SEC);let _0xceed71=null,_0x7dba27=null;const _0x4086de={};_0x4086de['masterSecret']=_0x85fa6['akMasterSecret'];const _0x38f3a7=()=>_0xceed71??=createIssuer(_0x4086de),_0x539d4f={};_0x539d4f['masterSecret']=_0x85fa6['akMasterSecret'];const _0x5b9d7d=()=>_0x7dba27??=createVerifier(_0x539d4f);async function _0x484db8(_0x454773,{scene:scene='',ttl:_0x4ff06a}={}){const _0x45ad5a=_0x27c160,_0x322166=await _0x38f3a7(),_0x134827=await _0x322166['issue']({'uid':_0x454773,'scene':scene,'ttl':Number(_0x4ff06a??_0x17d107[_0x45ad5a(0x112)](_0x20ebaf))}),_0x29d14e=_0x17d107[_0x45ad5a(0x11d)](sha256hex,_0x134827['key']);await _0x17d107[_0x45ad5a(0x119)](_0x172b51,SQL_INSERT_KEY,[_0x29d14e,_0x134827[_0x45ad5a(0x110)],_0x454773,_0x17d107[_0x45ad5a(0x11c)](scene,''),_0x134827['keyPrefix'],_0x134827['expiresAt']]);const _0x2d7f44={};return _0x2d7f44['apikey']=_0x134827['key'],_0x2d7f44[_0x45ad5a(0x114)]=_0x29d14e,_0x2d7f44[_0x45ad5a(0x116)]=_0x134827[_0x45ad5a(0x110)],_0x2d7f44[_0x45ad5a(0x101)]=_0x134827['keyPrefix'],_0x2d7f44[_0x45ad5a(0xf9)]=_0x134827[_0x45ad5a(0x121)],_0x2d7f44;}async function _0xdaddd0(_0x4debc1,{useCache:useCache=!![]}={}){const _0x5cb1be=_0x27c160,_0x567a9c=sha256hex(_0x17d107[_0x5cb1be(0x10f)](_0x4debc1,''));if(useCache){const _0x5822e7=_0xaa7dea[_0x5cb1be(0x115)](_0x567a9c);if(_0x5822e7)return _0x5822e7;}const _0x166bae=await _0x5b9d7d()[_0x5cb1be(0x107)](_0x517978=>_0x517978['verify'](_0x4debc1??''));if(!_0x166bae['ok'])return{'ok':![],'reason':_0x166bae['reason']};let _0x1d2aa8;try{_0x1d2aa8=await _0x172b51(SQL_SELECT_KEY,[_0x567a9c]);}catch{throw _0x17d107[_0x5cb1be(0x102)](err,0x1f7,'apikey\x20校验失败');}const _0xb187a3=_0x1d2aa8?.[0x0],_0x55d25c={};_0x55d25c['ok']=![],_0x55d25c[_0x5cb1be(0x104)]='malformed';const _0x26cc36={};_0x26cc36['ok']=![],_0x26cc36[_0x5cb1be(0x104)]='revoked';const _0xe277b7=!_0xb187a3?_0x55d25c:_0xb187a3[_0x5cb1be(0xfb)]!=null?_0x26cc36:{'ok':!![],'auth':{'uidRef':_0xb187a3[_0x5cb1be(0xe8)],'scene':_0xb187a3[_0x5cb1be(0x10c)]??'','keyId':_0xb187a3[_0x5cb1be(0x116)],'keyPrefix':_0xb187a3['key_prefix'],'expiresAt':_0x17d107['irUha'](Number,_0xb187a3['expires_at'])}};if(_0xe277b7['ok'])_0xaa7dea[_0x5cb1be(0xef)](_0x567a9c,_0xe277b7);return _0xe277b7;}async function _0x50a44f(_0x3a58a1){const _0x3c89f7=_0x27c160,_0x28c324={};_0x28c324['useCache']=![];const _0x25dc97=await _0xdaddd0(_0x3a58a1,_0x28c324);if(!_0x25dc97['ok'])throw err(0x191,_0x3c89f7(0xfc));return _0x25dc97['auth'][_0x3c89f7(0x106)];}const _0x555a54=[[_0x17d107['PngAl'],{'auth':_0x17d107[_0x27c160(0x111)],'describe':_0x17d107[_0x27c160(0x113)],'run':async(_0x5cf948={})=>{const _0x5e14ef=_0x27c160,_0x5c1a8c=await _0x50a44f(_0x5cf948[_0x5e14ef(0x10d)]??_0x5cf948['access_token']),_0xf1ebc6=typeof _0x5cf948['scene']===_0x5e14ef(0xfa)?_0x5cf948['scene']:'';let _0x12bed8;try{const _0x4b0912={};_0x4b0912['scene']=_0xf1ebc6,_0x12bed8=await _0x484db8(_0x5c1a8c,_0x4b0912);}catch{throw err(0x1f4,_0x5e14ef(0x117));}const _0x16022a={};return _0x16022a['apikey']=_0x12bed8[_0x5e14ef(0x10d)],_0x16022a['key_id']=_0x12bed8[_0x5e14ef(0x116)],_0x16022a[_0x5e14ef(0x101)]=_0x12bed8[_0x5e14ef(0x101)],_0x16022a['expires_at']=_0x12bed8['expires_at'],_0x16022a;}}],['auth.key.list',{'auth':_0x17d107['vsiYZ'],'describe':'当前用户的\x20key\x20档案列表(不含明文/key_hash)','run':async(_0x4ac178={})=>{const _0x4ddb51=_0x27c160,_0x49da14=await _0x17d107[_0x4ddb51(0x10b)](_0x50a44f,_0x4ac178[_0x4ddb51(0x10d)]??_0x4ac178['access_token']);let _0x2171e3;try{_0x2171e3=await _0x17d107['QbfBS'](_0x172b51,SQL_LIST_KEYS,[_0x49da14]);}catch{throw err(0x1f7,_0x4ddb51(0x118));}return(_0x2171e3??[])['map'](_0x49033b=>({..._0x49033b,'expires_at':Number(_0x49033b['expires_at'])}));}}],[_0x27c160(0xf1),{'auth':'user','describe':_0x17d107[_0x27c160(0x120)],'run':async(_0x251eed={})=>{const _0x339699=_0x27c160,_0xc688f2=await _0x17d107[_0x339699(0xf2)](_0x50a44f,_0x251eed[_0x339699(0x10d)]??_0x251eed['access_token']);if(!_0x251eed[_0x339699(0x116)])throw _0x17d107[_0x339699(0xff)](err,0x190,_0x17d107['kkITX']);let _0x5d4de5;try{_0x5d4de5=await _0x172b51(SQL_REVOKE_KEY,[_0x251eed['key_id'],_0xc688f2]);}catch{throw err(0x1f7,_0x17d107[_0x339699(0xf3)]);}const _0x181d7e=_0x5d4de5?.[0x0]?.[_0x339699(0x114)];if(!_0x181d7e)throw _0x17d107[_0x339699(0x102)](err,0x194,'key\x20不存在或不属于当前用户');_0xaa7dea['clear'](_0x181d7e);const _0x123077={};return _0x123077['revoked']=!![],_0x123077[_0x339699(0x116)]=_0x251eed['key_id'],_0x123077;}}],[_0x17d107['jkhHE'],{'auth':_0x17d107[_0x27c160(0x111)],'describe':'校验\x20apikey(唯一裁决路径,返回\x20verify\x20结果对象)','run':async(_0x3be2ac={})=>_0xdaddd0(_0x3be2ac[_0x27c160(0x10d)]??_0x3be2ac['access_token'])}]],_0xd69579={};return _0xd69579[_0x27c160(0xf7)]=_0xdaddd0,_0xd69579['issue']=_0x484db8,_0xd69579['uidOf']=_0x50a44f,_0xd69579['abilities']=_0x555a54,_0xd69579[_0x27c160(0xfe)]=_0xaa7dea,_0xd69579;}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x2fd5af=_0x5f41;(function(_0x3cfb44,_0x3f6712){const _0xdf9fe1=_0x5f41,_0x7f27cf=_0x3cfb44();while(!![]){try{const _0x5d7a21=-parseInt(_0xdf9fe1(0x1d9))/0x1*(-parseInt(_0xdf9fe1(0x1e4))/0x2)+-parseInt(_0xdf9fe1(0x214))/0x3+-parseInt(_0xdf9fe1(0x21e))/0x4*(parseInt(_0xdf9fe1(0x1c7))/0x5)+parseInt(_0xdf9fe1(0x213))/0x6*(-parseInt(_0xdf9fe1(0x1e5))/0x7)+-parseInt(_0xdf9fe1(0x1cd))/0x8+-parseInt(_0xdf9fe1(0x233))/0x9*(-parseInt(_0xdf9fe1(0x1e6))/0xa)+parseInt(_0xdf9fe1(0x231))/0xb;if(_0x5d7a21===_0x3f6712)break;else _0x7f27cf['push'](_0x7f27cf['shift']());}catch(_0x4e3994){_0x7f27cf['push'](_0x7f27cf['shift']());}}}(_0x23a8,0x6be5b));import _0x3174ef from'@cloudbase/node-sdk';import{code2Session as _0xc1febb}from'./wechat.js';function _0x23a8(){const _0x5dd165=['y29KztjtzxnZAw9UioIVT+AXGUwKSEI0Pq','A01pzey','ywnJzxnZx3rVA2vU','CgHVBMvFBNvTyMvY','zMXVB3i','BM9KztPMCY9WCM9TAxnLCW','Aw5JBhvKzxm','zMv0y2HqCMvMAxHdB25MAwC','DxnLCG','6lsM5y+35A+g56cb55M75B2v77Yi6ycp5lYGk+w7UUAHO++8IE+8MLbpu1qGl2f1DgGVDJeVC2LNBMLUihSGDxnLCM5HBwuSihbHC3n3B3jKih3VViZLK43LUPtLJP/MOlFOOAuGDwLK','y3jLzgvUDgLHBhmGBxvZDcbPBMnSDwrLigTLEv9PzcbHBMqGChjPDMf0zv9RzxK','yxbPA2v5ioAxOoAvIa','yxv0Ac5Zzw5Ku21Zq29Kzq','yxv0Ac5ZAwDUt3v0','yNjVA2vY','DMvYAwzPy2f0Aw9Ux2nVzguG5B+f5AgR','CgfZC3DVCMq','CMvX','B3bLBMLK','AgvHzgvYCW','55+T5l+H6AQm6k+b56cb55M75B2v77Yi6ycp5lYGk+w7UUAHO++8IE+8MLbpu1qGl2f1DgGVDJeVC2LNBMLUihSGDMvYAwzPy2f0Aw9Ux3rVA2vUih0','ndHRq25Sruy','mJu0mtiYmKnuEwPVuG','Ahr0Chm6lY8','ChjVDMLKzxjFDg9Rzw4','tvrZwNu','r0vu','C2T2yvq','Aw5PDa','qw9dEu4','DMvYAwzPy2f0Aw9Ux2nVzgu','5y+r6ykU566X6AQm6k+b56cb77YAC2vUzfzLCMLMAwnHDgLVBIdOLOtLIkVLKi3VViHLBwfPBcdLV4xLOAVVViK','mtu2s3j5zKPc','C2vUzfzLCMLMAwnHDgLVBG','y3jLyxrLvgLJA2v0','D3HszxnVBhzLvwLK','yxv0Ac5SB2DPBKj5vw5PB25Pza','zxjYBxnN','BM93','DNDKzhe','y29KztjtzxnZAw9UiowKSEI0Pq','55sO5OI35RoO5yAm5AsX6lsL','DMvYAwz5x29WDa','DxnLCI1RAxq6iowpGUAvScbJB2rLiow/HEwHQW','yxbPA2v5','6iEQ5A6A5lMj55M75B2v6k+35Rgc5AsX6lsL','5y+r55+T5l+H6AQm6k+b56cb77YAC2vUzfzLCMLMAwnHDgLVBIdOLOtLIkVLKi3VViHWAg9UzsdLV4xLOAVVViK','zw52swq','A3rOzwi','DwLKuMvM','yxv0Ac5Zzw5Krw1HAwXdB2rL','mJa3nduYnJnyyM96y00','CgHVBMuG5B+f5AgR','mti4mteXne9RqvfvEG','Dg9Rzw4G5QcH6AQm77YAr0vuic9HDxrOl3yXl3rVA2vUl2LUDhjVC3bLy3tVViHczwfYzxlVViNVViZNVzhLHBpLJP/MOlFVViJLKkSGC3vI77Yj','yxv0Ac5SB2DPBKj5rw1HAwW','DwLK','Cwz0sLm','DMvYAwzPy2f0Aw9Ux3rVA2vUiow/HEwHQW','thDQC0S','55M75yE677YAue9tvcaVyxv0Ac92ms91C2vYl3nPz25VDxtVViHczwfYzxlVViNVViZKUi3LHPNMOAm','CgHVBMvFBNvTyMvYl2vTywLSl3bYB3zPzgvYx3rVA2vUiow/HEwHQ+wfTUs4Ga','qxHYD24','l2f1DgGVDJeVC2LNBMLU','l2f1DgGVDJeVDMvYAwzPy2f0Aw9U','C1HSuwG','qu1oqwO','EM95A3e','AMD1EuW','y3jLzgvUDgLHBhm','CgHVBMu','A2v5x2LK','mteXnte1y2r3Bgj3','EgnpzLO','AxnZDwu','DKPguxO','C2LNBMLUuMvXDwvZDa','DMvYAwz5','nJGYodK2mefgtKHyBG','ue9tva','yxv0Ac5ZAwDUDxa','y0rRque','Dg9Rzw4','CgHVBMuG5OIwigvTywLSios6JoMaIEs4Gow/HEwHQW','CMvMCMvZAfrVA2vUuMvXDwvZDa','v1zhCuK','l3yXl3n0B3jHz2vZl29IAMvJDc9ZDg9Yzs9WDwjSAwmVD3HFBxbFy29UzI9WCMvMAxHFy29UzMLNlMPZB24','yxv0Aa','yxv0Ac52zxjPzNLdB2rL','BfnJt3a','mte5CKTtCLHV','5RoO5yAm77Yi5OMl5PY6l+McRUEUSs9WCM92AwrLCL90B2TLBIdKUiNLVAlMGihVViNVVjPqt1nuic9HDxrOl3yXl3nPz251Co+8JowtJEw6LowoN+AGTYVOOAuGDwLKk+w7UUAHOW','DxrMltG','5BYa5Ps+55M75B2v77YA5zsV5lIaigLKioAZQowgJoEzU+w9LE+8Iow7UUAHO+kgKNrPy2TLDokgKNnPz25PBI9JDxn0B23IHPlMIzJNRQeR562+5y+rigTLEE+8Iq','yM9KEq','uMnoEhi','zuDpuNK','DMvYAwzPy2f0Aw9Ux3rVA2vU','DxnLCM5HBwu','zw1HAwXFy29Kzq','DMvYAwz5x29WDcdLV4xLOAVVViHWAg9Uzv9JB2rLFgvTywLSx2nVzgxVViK','nZCWnKfbwKfTEG','mZGYndHkCunqAxm','ntb2CLvOvgW','q2jHBK4','yxbPlNrJBg91zgjHC2vNyxrLD2f5lMnVBq','zw52x2LK','zg9TywLU','DhjPBq','qwLODfi','we5PuNO','zw1HAwW','y3vZDg9T','Dw5PB25Pza','5B6U5l+HignVzguG55M75B2v5ywO6zo+77YA5BU65QgJk+IhQUwUMUs5IEs7PoEjJcTWCMvMAxHFy29UzMLN77YinYdLRzFMRRxOO7JLR7NOSAhVViK','iow/HEwHQW','wM1gzNi','C3rHCNrZv2L0Aa','ChjVzMLSzq','zxHWAxjLC19PBG','CNvU','CMvMCMvZAa','A3P5yu0','Aw5Qzwn0','yxv0Ac5Zzw5KvMvYAwzPy2f0Aw9U','zw52','ChjPDMf0zv9RzxLFAwq'];_0x23a8=function(){return _0x5dd165;};return _0x23a8();}import{decodeJWT,throwGatewayError,makeGateway}from'./user.js';import{withSchemas}from'./schemas.js';export{decodeJWT};function _0x5f41(_0x45f7f2,_0x4f703c){_0x45f7f2=_0x45f7f2-0x1c0;const _0x23a8e6=_0x23a8();let _0x5f4124=_0x23a8e6[_0x45f7f2];if(_0x5f41['sDwTly']===undefined){var _0x427fa4=function(_0x1dd2d9){const _0x79ebc7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3bd2f9='',_0x23426f='';for(let _0x54884b=0x0,_0x1e8b67,_0x21df82,_0x29313a=0x0;_0x21df82=_0x1dd2d9['charAt'](_0x29313a++);~_0x21df82&&(_0x1e8b67=_0x54884b%0x4?_0x1e8b67*0x40+_0x21df82:_0x21df82,_0x54884b++%0x4)?_0x3bd2f9+=String['fromCharCode'](0xff&_0x1e8b67>>(-0x2*_0x54884b&0x6)):0x0){_0x21df82=_0x79ebc7['indexOf'](_0x21df82);}for(let _0xbc317c=0x0,_0x58d858=_0x3bd2f9['length'];_0xbc317c<_0x58d858;_0xbc317c++){_0x23426f+='%'+('00'+_0x3bd2f9['charCodeAt'](_0xbc317c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x23426f);};_0x5f41['JwvyKz']=_0x427fa4,_0x5f41['fiUpwZ']={},_0x5f41['sDwTly']=!![];}const _0x29907f=_0x23a8e6[0x0],_0x13d33b=_0x45f7f2+_0x29907f,_0x100775=_0x5f41['fiUpwZ'][_0x13d33b];return!_0x100775?(_0x5f4124=_0x5f41['JwvyKz'](_0x5f4124),_0x5f41['fiUpwZ'][_0x13d33b]=_0x5f4124):_0x5f4124=_0x100775,_0x5f4124;}const DEFAULT_DOMAIN=_0x2fd5af(0x1e8),_0x32c422={};_0x32c422[_0x2fd5af(0x1f8)]=0x7*0x18*0xe10*0x3e8,_0x32c422['expire']=0x1e*0x18*0xe10*0x3e8;const TICKET_TTL=_0x32c422,err=(_0x1b4838,_0x181763,_0x46159={})=>Object['assign'](new Error(_0x181763),{'code':_0x1b4838,..._0x46159});export async function loadCredentials(_0x192f84,_0x4747fe){const _0x1c6709=_0x2fd5af,_0x24c44b={};_0x24c44b['XNiRz']='缺少自定义登录私钥:tcbAuthCredentials(JSON\x20文案或文件路径,按\x20{\x20开头自动识别)',_0x24c44b[_0x1c6709(0x1f9)]=function(_0x3719e9,_0x3b585b){return _0x3719e9 in _0x3b585b;},_0x24c44b['Axrwn']=_0x1c6709(0x208);const _0x475dc8=_0x24c44b,_0x304fea=String(_0x192f84||'')[_0x1c6709(0x1eb)]();if(!_0x304fea)throw new Error(_0x475dc8[_0x1c6709(0x1ed)]);const _0x2c2d79=_0x304fea[_0x1c6709(0x1f4)]('{')?_0x304fea:await(await import(_0x1c6709(0x203)))['readFile'](_0x304fea,_0x1c6709(0x1db)),_0x9080c6=JSON['parse'](_0x2c2d79);if(_0x475dc8['kzyaM'](_0x1c6709(0x1fd),_0x9080c6)&&!(_0x1c6709(0x1c6)in _0x9080c6))_0x9080c6[_0x1c6709(0x1c6)]=_0x9080c6[_0x1c6709(0x1fd)];if(!_0x9080c6[_0x1c6709(0x1c6)]||!_0x9080c6['private_key'])throw new Error(_0x475dc8[_0x1c6709(0x23c)]);if(!_0x9080c6[_0x1c6709(0x1e9)])_0x9080c6[_0x1c6709(0x1e9)]=_0x4747fe;return _0x9080c6;}let tcbAppCache=null;async function tcbCreateTicket(_0x31db6e,_0x28de86){const _0x1f7594=_0x2fd5af;if(!tcbAppCache){const _0x328d43=await loadCredentials(_0x31db6e['tcbAuthCredentials'],_0x31db6e['envId']),_0x570877={};_0x570877[_0x1f7594(0x1fc)]=_0x328d43[_0x1f7594(0x1e9)],_0x570877[_0x1f7594(0x1c4)]=_0x328d43,tcbAppCache=_0x3174ef[_0x1f7594(0x21a)](_0x570877);}return tcbAppCache[_0x1f7594(0x1d6)]()[_0x1f7594(0x220)](_0x28de86,TICKET_TTL);}export const makeRefreshTokenRequest=(_0x210aee,_0x315ee7)=>(_0x210aee[_0x2fd5af(0x1fa)]||{})[_0x2fd5af(0x1d3)]||(_0x2e7eae=>_0x315ee7['req'](_0x2fd5af(0x215)+_0x210aee[_0x2fd5af(0x22d)]+'.'+(_0x210aee[_0x2fd5af(0x1ea)]||DEFAULT_DOMAIN)+'/auth/v1/token',{'method':'POST','body':_0x2e7eae}));export function createAuthAbilities(_0x2a371,_0x511a08,_0x470ec4={}){const _0x1e1406=_0x2fd5af,_0x2a3cb5={'kMOdF':function(_0xfc67af,_0x5126a5){return _0xfc67af(_0x5126a5);},'jguyL':_0x1e1406(0x22b),'VNliz':function(_0x235de0,_0x108849,_0x4e607f){return _0x235de0(_0x108849,_0x4e607f);},'CbanN':_0x1e1406(0x227),'INWFv':function(_0x174979,_0x1b8319){return _0x174979/_0x1b8319;},'cDkAA':function(_0x996690,_0x2855f4,_0x5ba68f){return _0x996690(_0x2855f4,_0x5ba68f);},'MTsZu':'apikey\x20签发失败','ZmFfr':function(_0x55b8ea,_0x4d87f1){return _0x55b8ea(_0x4d87f1);},'AihtR':function(_0x26a80e,_0x4709a4,_0x4deda0){return _0x26a80e(_0x4709a4,_0x4deda0);},'CTMog':'phone','AMNAj':function(_0x1ca0ac,_0x145050,_0x5bd10f){return _0x1ca0ac(_0x145050,_0x5bd10f);},'awwsg':function(_0x3d01ea,_0x4610c4,_0x321be2){return _0x3d01ea(_0x4610c4,_0x321be2);},'WVGqI':'email\x20必填','lScOp':function(_0x26adfe,_0x4e8967,_0x18ac22){return _0x26adfe(_0x4e8967,_0x18ac22);},'qdSYr':_0x1e1406(0x20d),'vJFQz':_0x1e1406(0x1ce),'skvaT':function(_0x5890af,_0x25da8a){return _0x5890af(_0x25da8a);},'spMfj':'/auth/v1/user/reauthenticate','RhnbR':function(_0x42daa3,_0x51361c){return _0x42daa3(_0x51361c);},'RcNxr':function(_0x251b85,_0x12da61,_0xa3189c,_0x14efdb){return _0x251b85(_0x12da61,_0xa3189c,_0x14efdb);},'OHyKP':'/auth/v1/token/introspect','GaNTX':function(_0x4f0e44,_0x284070){return _0x4f0e44(_0x284070);},'qftJS':_0x1e1406(0x23b),'tvYnR':'/auth/v1/signup','LwjsK':function(_0x5bb762,_0x43fd94){return _0x5bb762!==_0x43fd94;},'LDglb':function(_0x499fd8,_0x564100,_0x28c503){return _0x499fd8(_0x564100,_0x28c503);},'zoykq':'/auth/v1/user/signout','ktheb':_0x1e1406(0x22c),'xcOfZ':'验证码校验:POST\x20/auth/v1/verification/verify,网关原样(含\x20verification_token)','owQDR':'重认证发码:POST\x20/auth/v1/user/reauthenticate(Bearer;verify_opt\x20∈\x20phone_code|email_code)','AoCyN':'auth.loginByPassword','CMjjN':_0x1e1406(0x212),'sMRiq':_0x1e1406(0x235),'eGORy':'auth.loginByWxcode','sXlQh':_0x1e1406(0x222),'GmCwj':_0x1e1406(0x1dc),'vwddq':_0x1e1406(0x20b),'bPcYp':_0x1e1406(0x23a)},_0x10fdb1=_0x2a371[_0x1e1406(0x1fa)]||{},_0x494823=_0x1e1406(0x215)+_0x2a371['envId']+'.'+(_0x2a371['domain']||DEFAULT_DOMAIN),_0x41ade6=_0x10fdb1[_0x1e1406(0x21f)]||(_0x47f616=>_0x511a08['req'](_0x494823+_0x1e1406(0x23e),{'method':_0x1e1406(0x1ce),'body':_0x47f616})),_0x2bef94=_0x10fdb1[_0x1e1406(0x1cb)]||(_0x206713=>_0x511a08['req'](_0x494823+_0x1e1406(0x23d),{'method':_0x1e1406(0x1ce),'body':_0x206713})),_0x554ac5=_0x10fdb1['customSignin']||(_0x4bb2b6=>_0x511a08['req'](_0x494823+'/auth/v1/signin/custom',{'method':_0x1e1406(0x1ce),'body':{'provider_id':_0x1e1406(0x1ef),'ticket':_0x4bb2b6}})),_0x53ca41=_0x10fdb1['code2Session']||(_0x1c8de4=>_0xc1febb(_0x2a371,_0x1c8de4)),_0x3601ec=_0x10fdb1[_0x1e1406(0x221)]||(_0x71a154=>_0x71a154[_0x1e1406(0x210)]),_0x5f4db7=_0x10fdb1[_0x1e1406(0x220)]||(_0x184ec3=>tcbCreateTicket(_0x2a371,_0x184ec3)),_0x403972={};_0x403972['Cache-Control']='no-cache';const _0x30b4bb={};_0x30b4bb[_0x1e1406(0x211)]=_0x403972;const _0x3243bb=_0x10fdb1[_0x1e1406(0x205)]||(()=>_0x511a08[_0x1e1406(0x20f)](_0x494823+_0x1e1406(0x1d5),_0x30b4bb)),_0x3b7a0c=makeGateway(_0x2a371,_0x511a08),_0x28a042=async(_0x1bf05e,_0x464a71,_0xb25120)=>{try{return await _0x3b7a0c(_0x1bf05e,_0x464a71,_0xb25120);}catch(_0x5874c4){throwGatewayError(_0x5874c4);}},_0x1ff5b3=_0x31f0b8=>_0x10fdb1['sendVerification']?_0x10fdb1[_0x1e1406(0x21f)](_0x31f0b8):_0x28a042(_0x1e1406(0x1ce),_0x1e1406(0x23e),{'body':_0x31f0b8});async function _0x13fbe3(_0x2ecc0e){const _0x550b84=_0x1e1406,_0x3e3954=await _0x2a3cb5[_0x550b84(0x1ff)](_0x5f4db7,_0x2ecc0e);let _0x4ed5ed;try{_0x4ed5ed=await _0x2a3cb5['kMOdF'](_0x554ac5,_0x3e3954);}catch{throw err(0x1f6,_0x2a3cb5[_0x550b84(0x1c3)]);}const {access_token:_0x55e581,refresh_token:_0x2a8543,expires_in:_0x3254c2}=_0x4ed5ed,_0x10dc51={};return _0x10dc51['at']=_0x55e581,_0x10dc51['rt']=_0x2a8543,_0x10dc51['expires_in']=_0x3254c2,_0x10dc51;}async function _0x8849b7(_0x14a2a5){const _0x297ad8=_0x1e1406;try{await _0x511a08['ctx'][_0x297ad8(0x1f7)]('user.upsert',_0x14a2a5);}catch{throw _0x2a3cb5['VNliz'](err,0x1f4,_0x2a3cb5[_0x297ad8(0x1e7)]);}}const _0x294ee5=_0x34d43a=>_0x34d43a?.['sub']||_0x34d43a?.[_0x1e1406(0x206)]?.['id']||decodeJWT(_0x34d43a?.[_0x1e1406(0x200)])['sub']||null;async function _0x12d264(_0x51128e,_0x5ef467){const _0x22370f=_0x1e1406,_0x1d125a=Math[_0x22370f(0x202)](_0x2a3cb5['INWFv'](Date[_0x22370f(0x224)](),0x3e8))+(_0x2a3cb5[_0x22370f(0x1ff)](Number,_0x5ef467?.[_0x22370f(0x1f6)])||0x0),_0x1a8beb=_0x5ef467?.['at']??_0x5ef467?.[_0x22370f(0x200)],_0x10578e=_0x5ef467?.['rt']??_0x5ef467?.['refresh_token'];try{await _0x470ec4['broker']['upsert'](_0x51128e,_0x1a8beb,_0x10578e,_0x1d125a);}catch{throw _0x2a3cb5[_0x22370f(0x1d0)](err,0x1f4,'官方凭证托管失败');}let _0x3b9f38;try{_0x3b9f38=await _0x470ec4[_0x22370f(0x1c9)](_0x51128e);}catch{throw err(0x1f4,_0x2a3cb5[_0x22370f(0x217)]);}const _0x54e69a={};return _0x54e69a[_0x22370f(0x22a)]=_0x3b9f38[_0x22370f(0x22a)],_0x54e69a['expires_at']=_0x3b9f38['expires_at'],_0x54e69a;}async function _0x5775a2(_0x53fe11){const _0x2b4806=_0x1e1406,_0x5bacb3=await _0x470ec4[_0x2b4806(0x1cc)](_0x53fe11);if(!_0x5bacb3['ok'])throw _0x2a3cb5[_0x2b4806(0x1d0)](err,0x191,_0x2b4806(0x209));const {access_token:_0x2bac7c}=await _0x470ec4[_0x2b4806(0x20c)]['get'](_0x5bacb3[_0x2b4806(0x1d6)]['uidRef']),_0x9071b1={};return _0x9071b1[_0x2b4806(0x236)]=_0x5bacb3['auth'][_0x2b4806(0x22f)],_0x9071b1[_0x2b4806(0x1d1)]=_0x2bac7c,_0x9071b1;}async function _0x54685c(_0x443fe9,_0x5351ae){const _0x255231=_0x1e1406;for(const _0x16d266 of _0x5351ae){if(!_0x443fe9?.[_0x16d266])throw err(0x190,_0x16d266+_0x255231(0x1f2));}let _0x411427;try{_0x411427=await _0x2bef94(_0x443fe9);}catch(_0x4ffc56){_0x2a3cb5[_0x255231(0x1f3)](throwGatewayError,_0x4ffc56);}const _0x48c503=_0x294ee5(_0x411427);if(!_0x48c503)throw err(0x1f4,_0x255231(0x227));const _0x5b8a1f={};return _0x5b8a1f['uid']=_0x48c503,_0x5b8a1f['profile']={},await _0x8849b7(_0x5b8a1f),_0x2a3cb5[_0x255231(0x1ec)](_0x12d264,_0x48c503,_0x411427);}return withSchemas([[_0x1e1406(0x1fb),{'describe':'发验证码(phone/email\x20二选一):POST\x20/auth/v1/verification,网关原样(含\x20verification_token)','run':async(_0x2e96a4={})=>{const _0x4f909f=_0x1e1406,_0x5625a4={};for(const _0xe0a77b of[_0x2a3cb5['CTMog'],'email','email_redirect_to'])if(_0x2e96a4[_0xe0a77b]!==undefined)_0x5625a4[_0xe0a77b]=_0x2e96a4[_0xe0a77b];if(!_0x5625a4[_0x4f909f(0x1c5)]&&!_0x5625a4[_0x4f909f(0x1ee)])throw err(0x190,_0x4f909f(0x1d2));return _0x1ff5b3(_0x5625a4);}}],[_0x1e1406(0x20a),{'describe':_0x2a3cb5[_0x1e1406(0x22e)],'run':async({phone:_0x22e114}={})=>{const _0x3dbde2=_0x1e1406;if(!_0x22e114)throw _0x2a3cb5[_0x3dbde2(0x1c1)](err,0x190,_0x3dbde2(0x232));const _0x109f0d={};return _0x109f0d['phone']=_0x22e114,_0x1ff5b3(_0x109f0d);}}],[_0x1e1406(0x230),{'describe':_0x1e1406(0x21d),'run':async({email:_0x3f3b77}={})=>{const _0x674690=_0x1e1406;if(!_0x3f3b77)throw _0x2a3cb5['awwsg'](err,0x190,_0x2a3cb5[_0x674690(0x1d4)]);const _0x10f2ab={};return _0x10f2ab['email']=_0x3f3b77,_0x2a3cb5[_0x674690(0x1f3)](_0x1ff5b3,_0x10f2ab);}}],[_0x1e1406(0x1d7),{'describe':_0x2a3cb5[_0x1e1406(0x1c8)],'run':async({verification_id:_0x39be93,verification_code:_0x45d3c2}={})=>{const _0x114868=_0x1e1406;if(!_0x39be93)throw err(0x190,'verification_id\x20必填');if(!_0x45d3c2)throw _0x2a3cb5[_0x114868(0x1d8)](err,0x190,_0x2a3cb5['qdSYr']);const _0x384075={};_0x384075['verification_id']=_0x39be93,_0x384075[_0x114868(0x21c)]=_0x45d3c2;const _0x26c122={};return _0x26c122['body']=_0x384075,_0x28a042(_0x2a3cb5[_0x114868(0x1ca)],'/auth/v1/verification/verify',_0x26c122);}}],['auth.reauthenticate',{'describe':_0x2a3cb5['owQDR'],'run':async(_0x212481={})=>{const _0x1b7e09=_0x1e1406,{apikey:_0x223bfe,verify_opt:_0x3cc53c}=_0x212481;if(!['phone_code',_0x1b7e09(0x1e2)][_0x1b7e09(0x204)](_0x3cc53c))throw err(0x190,_0x1b7e09(0x1e3));const {token:_0x4d2e62}=await _0x2a3cb5[_0x1b7e09(0x219)](_0x5775a2,_0x223bfe),_0x1c4508={};_0x1c4508[_0x1b7e09(0x228)]=_0x3cc53c;const _0x1ad275={};return _0x1ad275[_0x1b7e09(0x1dd)]=_0x1c4508,_0x1ad275[_0x1b7e09(0x1d1)]=_0x4d2e62,_0x28a042('POST',_0x2a3cb5['spMfj'],_0x1ad275);}}],['auth.introspect',{'describe':_0x1e1406(0x234),'run':async({apikey:_0x43cfed}={})=>{const _0x2b8b02=_0x1e1406,{token:_0x3b2e41}=await _0x2a3cb5['RhnbR'](_0x5775a2,_0x43cfed),_0x419086={};return _0x419086[_0x2b8b02(0x1d1)]=_0x3b2e41,_0x2a3cb5['RcNxr'](_0x28a042,_0x2b8b02(0x218),_0x2a3cb5['OHyKP'],_0x419086);}}],[_0x2a3cb5[_0x1e1406(0x21b)],{'describe':_0x1e1406(0x207),'run':async(_0x3fc7bb={})=>_0x54685c({'username':_0x3fc7bb['username'],'password':_0x3fc7bb[_0x1e1406(0x20e)]},[_0x1e1406(0x1e1),_0x1e1406(0x20e)])}],['auth.loginBySms',{'describe':_0x2a3cb5['CMjjN'],'run':async(_0x3b3787={})=>_0x54685c({'verification_token':_0x3b3787['verification_token']},[_0x1e1406(0x1e0)])}],[_0x2a3cb5['sMRiq'],{'describe':'邮箱验证码登录(与\x20SMS\x20同端点同实现,命名只表达调用意图)','run':async(_0x81313f={})=>_0x54685c({'verification_token':_0x81313f['verification_token']},['verification_token'])}],[_0x2a3cb5[_0x1e1406(0x1df)],{'describe':_0x1e1406(0x1f1),'run':async(_0x658b61={})=>{const _0x56fa88=_0x1e1406,{code:_0x7c2e82}=_0x658b61;if(!_0x7c2e82||typeof _0x7c2e82!=='string')throw err(0x190,_0x56fa88(0x229));let _0x1123e3;try{_0x1123e3=await _0x53ca41(_0x7c2e82);}catch{throw err(0x1f6,_0x56fa88(0x1fe));}if(_0x1123e3['errcode'])throw err(0x190,_0x1123e3['errmsg']||_0x56fa88(0x226),{'errcode':_0x1123e3['errcode'],'errmsg':_0x1123e3[_0x56fa88(0x223)]||'code2Session\x20失败'});const _0x50a3e0=await _0x3601ec(_0x1123e3),_0x57577d={};_0x57577d['openid']=_0x1123e3[_0x56fa88(0x210)],_0x57577d[_0x56fa88(0x1f0)]=_0x1123e3['unionid']||null;const _0xf63c96={};_0xf63c96['uid']=_0x50a3e0,_0xf63c96['profile']=_0x57577d,await _0x8849b7(_0xf63c96);const _0x57b181=await _0x12d264(_0x50a3e0,await _0x2a3cb5['skvaT'](_0x13fbe3,_0x50a3e0));return{..._0x57b181,'config':await _0x3243bb()};}}],[_0x2a3cb5[_0x1e1406(0x1c0)],{'describe':_0x2a3cb5['GmCwj'],'run':async(_0x15b787={})=>{const _0x1a98ce=_0x1e1406,{unionid:_0x4056c2}=_0x15b787;if(!_0x4056c2)throw err(0x190,'缺少\x20unionid');const _0xa73161={};return _0xa73161[_0x1a98ce(0x236)]=_0x4056c2,_0xa73161[_0x1a98ce(0x1f5)]={},await _0x2a3cb5['GaNTX'](_0x8849b7,_0xa73161),_0x2a3cb5[_0x1a98ce(0x1c1)](_0x12d264,_0x4056c2,await _0x13fbe3(_0x4056c2));}}],[_0x1e1406(0x1cf),{'describe':_0x1e1406(0x1da),'run':async(_0x11d2ed={})=>{const _0x4e6cd8=_0x1e1406,_0x39d5a5=!!(_0x11d2ed?.['phone_number']||_0x11d2ed?.['email']);if(_0x39d5a5&&!_0x11d2ed?.['verification_token'])throw err(0x190,_0x4e6cd8(0x238));if(!_0x39d5a5&&!_0x11d2ed?.[_0x4e6cd8(0x216)])throw _0x2a3cb5['lScOp'](err,0x190,_0x2a3cb5[_0x4e6cd8(0x237)]);const _0x2ee333={};_0x2ee333['body']=_0x11d2ed;const _0x525852=await _0x28a042(_0x4e6cd8(0x1ce),_0x2a3cb5['tvYnR'],_0x2ee333),_0x32fe4f=_0x294ee5(_0x525852);if(!_0x32fe4f)throw err(0x1f4,_0x4e6cd8(0x227));const _0x5bfb4a={};if(_0x2a3cb5[_0x4e6cd8(0x239)](_0x11d2ed['username'],undefined))_0x5bfb4a['username']=_0x11d2ed[_0x4e6cd8(0x1e1)];if(_0x11d2ed[_0x4e6cd8(0x1ee)]!==undefined)_0x5bfb4a[_0x4e6cd8(0x1ee)]=_0x11d2ed[_0x4e6cd8(0x1ee)];if(_0x11d2ed[_0x4e6cd8(0x201)]!==undefined)_0x5bfb4a['phone']=_0x11d2ed[_0x4e6cd8(0x201)];const _0x2034f2={};return _0x2034f2['uid']=_0x32fe4f,_0x2034f2[_0x4e6cd8(0x1f5)]=_0x5bfb4a,await _0x2a3cb5[_0x4e6cd8(0x219)](_0x8849b7,_0x2034f2),_0x2a3cb5['LDglb'](_0x12d264,_0x32fe4f,_0x525852);}}],[_0x2a3cb5[_0x1e1406(0x225)],{'describe':_0x2a3cb5['bPcYp'],'run':async(_0x18691d={})=>{const _0x16b1c7=_0x1e1406,{apikey:_0x5c61d6,..._0xa914db}=_0x18691d??{},{token:_0x5d4369}=await _0x5775a2(_0x5c61d6),_0x41df1f={};return _0x41df1f['body']=_0xa914db,_0x41df1f['token']=_0x5d4369,_0x2a3cb5[_0x16b1c7(0x1de)](_0x28a042,_0x16b1c7(0x1ce),_0x2a3cb5[_0x16b1c7(0x1c2)],_0x41df1f);}}]]);}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x325c8b=_0x5b2e;(function(_0x416654,_0x1312c3){const _0x1697a7=_0x5b2e,_0x50225d=_0x416654();while(!![]){try{const _0x116ee5=-parseInt(_0x1697a7(0xa9))/0x1*(parseInt(_0x1697a7(0xc4))/0x2)+parseInt(_0x1697a7(0xa1))/0x3+-parseInt(_0x1697a7(0xc1))/0x4*(parseInt(_0x1697a7(0xbb))/0x5)+-parseInt(_0x1697a7(0xc0))/0x6+parseInt(_0x1697a7(0xca))/0x7*(parseInt(_0x1697a7(0xc7))/0x8)+-parseInt(_0x1697a7(0xc8))/0x9*(-parseInt(_0x1697a7(0xac))/0xa)+parseInt(_0x1697a7(0xc9))/0xb*(-parseInt(_0x1697a7(0xb3))/0xc);if(_0x116ee5===_0x1312c3)break;else _0x50225d['push'](_0x50225d['shift']());}catch(_0x40c37a){_0x50225d['push'](_0x50225d['shift']());}}}(_0x4fd7,0xa35a8));import{createKit as _0x245693}from'@blod-nm/base-cb';import{createAuthAbilities,makeRefreshTokenRequest}from'./auth.js';import{createUserAbilities}from'./user.js';import{createKeyAbilities}from'./access-key.js';import{createCbTokenBroker,makeRunSql}from'./token-broker.js';function _0x5b2e(_0x427f6d,_0x492134){_0x427f6d=_0x427f6d-0x9f;const _0x4fd7aa=_0x4fd7();let _0x5b2ee4=_0x4fd7aa[_0x427f6d];if(_0x5b2e['dwvtHz']===undefined){var _0x28aae9=function(_0x21b14b){const _0x14821a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a99d3='',_0xfb8700='';for(let _0x3db305=0x0,_0x734b6f,_0x17a11e,_0x519b23=0x0;_0x17a11e=_0x21b14b['charAt'](_0x519b23++);~_0x17a11e&&(_0x734b6f=_0x3db305%0x4?_0x734b6f*0x40+_0x17a11e:_0x17a11e,_0x3db305++%0x4)?_0x1a99d3+=String['fromCharCode'](0xff&_0x734b6f>>(-0x2*_0x3db305&0x6)):0x0){_0x17a11e=_0x14821a['indexOf'](_0x17a11e);}for(let _0x39ff1d=0x0,_0x1c27b8=_0x1a99d3['length'];_0x39ff1d<_0x1c27b8;_0x39ff1d++){_0xfb8700+='%'+('00'+_0x1a99d3['charCodeAt'](_0x39ff1d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xfb8700);};_0x5b2e['KwkUIz']=_0x28aae9,_0x5b2e['eKjwWM']={},_0x5b2e['dwvtHz']=!![];}const _0x20996b=_0x4fd7aa[0x0],_0x3659ad=_0x427f6d+_0x20996b,_0x3c0c8c=_0x5b2e['eKjwWM'][_0x3659ad];return!_0x3c0c8c?(_0x5b2ee4=_0x5b2e['KwkUIz'](_0x5b2ee4),_0x5b2e['eKjwWM'][_0x3659ad]=_0x5b2ee4):_0x5b2ee4=_0x3c0c8c,_0x5b2ee4;}function _0x4fd7(){const _0x45d970=['AxnZDwu','ndC5mLLyrM1bra','mJqZntq5uuPevvb2','otiYodaXC2LPvvDi','nZyYm2DMyvf2Aa','yxnZAwDU','yxv0Ac5RzxKUDMvYAwz5','mZC5nZy0nNLfEvrdra','zw52swq','CwjSDhG','ywjPBgL0AwvZ','57Y65BcrihvPza','CMvX','y2rhzLe','CNvUu3fS','mJq4nJm1u0HTvuDA','ChjVza','wgLbyLm','mZGWuLzVsMTU','yxv0Ac5RzxKUBgLZDa','u3vpEue','DwLK','y3r4','D3HbChbPza','DgnIqxv0AenYzwrLBNrPywXZ','mtjMsfD3yxq','DMvYAwz5','shr1tgy','CNvU','CMvNAxn0zxi','D3HtzwnYzxq','z2v0','ywTnyxn0zxjtzwnYzxq','mtqWntqWAffbEvL0','y29Kzq','yNL0zuXLBMD0Aa','ywTezwzHDwX0s2v5vhrSu2vJ','y2zN','ndm1mJKXmfbeCMLnEa','mZjZu0nvzeK','zgvZy3jPyMu','C3rYAw5N','mtbABLHHz1O','yxv0Ac5JyLrVA2vUlMDLDa'];_0x4fd7=function(){return _0x45d970;};return _0x4fd7();}import{createLoginTicketAbilities}from'./login-ticket.js';import{withSchemas}from'./schemas.js';const REQUIRED=[_0x325c8b(0xa2),'apiKey',_0x325c8b(0xb1),_0x325c8b(0xb8),_0x325c8b(0xb2),_0x325c8b(0xba)],DEFAULT_KEY_TTL_SEC=0x278d00;export function createKit(_0x3fe1e7={}){const _0x4f44b7=_0x325c8b,_0x8d9ac3={'zPznx':_0x4f44b7(0xa5),'qbltx':function(_0x162b3b,_0x304d28){return _0x162b3b(_0x304d28);},'SuOyA':'utf8','cdGfQ':'user-kit:\x20cfg.akMasterSecret\x20需\x20≥32\x20字节','XiAbS':function(_0x34e982,_0x4c614b){return _0x34e982(_0x4c614b);},'NnIie':function(_0x344ce6,_0x30326e,_0x3ecfa4,_0x96392b){return _0x344ce6(_0x30326e,_0x3ecfa4,_0x96392b);},'MWEsh':function(_0x238424,_0x4969bc){return _0x238424(_0x4969bc);},'HtuLf':_0x4f44b7(0xc5)};for(const _0x8a92e6 of REQUIRED){if(!_0x3fe1e7?.[_0x8a92e6])throw new Error('user-kit:\x20cfg\x20缺\x20'+_0x8a92e6);}if(Buffer[_0x4f44b7(0xbd)](_0x8d9ac3['qbltx'](String,_0x3fe1e7['akMasterSecret']),_0x8d9ac3[_0x4f44b7(0xae)])<0x20)throw new Error(_0x8d9ac3[_0x4f44b7(0xa7)]);const _0x3c34d6={..._0x3fe1e7};_0x3c34d6['env']=_0x3fe1e7['env']||_0x4f44b7(0xaa),_0x3c34d6['akDefaultKeyTtlSec']=_0x3fe1e7[_0x4f44b7(0xbe)]??DEFAULT_KEY_TTL_SEC;const _0x1467b3=_0x3c34d6,_0x3ab439=_0x245693(_0x1467b3),_0x4b6957=_0x8d9ac3[_0x4f44b7(0xa3)](makeRunSql,_0x3ab439),_0x1f4154=makeRefreshTokenRequest(_0x1467b3,_0x3ab439),_0x1e065f={};_0x1e065f['cfg']=_0x1467b3,_0x1e065f['refreshTokenRequest']=_0x1f4154,_0x1e065f[_0x4f44b7(0xa8)]=_0x4b6957;const _0x2ec0f3=_0x8d9ac3[_0x4f44b7(0xab)](createCbTokenBroker,_0x1e065f),_0x23e399={};_0x23e399[_0x4f44b7(0xbf)]=_0x1467b3,_0x23e399[_0x4f44b7(0xa8)]=_0x4b6957;const _0x120e5c=createKeyAbilities(_0x23e399),_0x357111={};_0x357111['broker']=_0x2ec0f3,_0x357111[_0x4f44b7(0xa8)]=_0x4b6957,_0x357111[_0x4f44b7(0xb4)]=_0x120e5c[_0x4f44b7(0xb4)],_0x357111['issue']=_0x120e5c[_0x4f44b7(0xc6)],_0x357111['refreshTokenRequest']=_0x1f4154;const _0x2c5d96=_0x357111,_0x23ee98={'describe':'托管官方\x20token\x20兑换:uid\x20→\x20{\x20access_token,\x20expires_at,\x20from_cache\x20}(宿主透传前取\x20Bearer)','run':async(_0x36f2aa={})=>{const _0x47052e=_0x4f44b7,_0x3b37af={};_0x3b37af[_0x47052e(0xbc)]=0x190;if(!_0x36f2aa?.['uid'])throw Object[_0x47052e(0x9f)](new Error(_0x8d9ac3['zPznx']),_0x3b37af);return _0x2ec0f3[_0x47052e(0xb9)](_0x36f2aa[_0x47052e(0xaf)]);}};for(const [_0x35e6a2,_0x34f8a7]of[..._0x8d9ac3['NnIie'](createAuthAbilities,_0x1467b3,_0x3ab439,_0x2c5d96),...createUserAbilities(_0x1467b3,_0x3ab439,_0x2c5d96),...createLoginTicketAbilities(_0x1467b3,_0x3ab439),..._0x120e5c[_0x4f44b7(0xa4)],..._0x8d9ac3['MWEsh'](withSchemas,[[_0x8d9ac3[_0x4f44b7(0xb5)],_0x23ee98]])]){_0x3ab439[_0x4f44b7(0xb0)][_0x4f44b7(0xb7)](_0x35e6a2,_0x34f8a7);}const _0x320f6d={'create':_0x459c7d=>_0x3ab439[_0x4f44b7(0xb0)][_0x4f44b7(0xb6)]('auth.key.create',_0x459c7d),'list':_0x423f67=>_0x3ab439[_0x4f44b7(0xb0)]['run'](_0x4f44b7(0xad),_0x423f67),'revoke':_0x13b428=>_0x3ab439['ctx']['run']('auth.key.revoke',_0x13b428),'verify':_0x470d85=>_0x3ab439[_0x4f44b7(0xb0)][_0x4f44b7(0xb6)](_0x4f44b7(0xa0),typeof _0x470d85===_0x4f44b7(0xc3)?{'apikey':_0x470d85}:_0x470d85)};return{'ctx':_0x3ab439['ctx'],'req':_0x3ab439[_0x4f44b7(0xa6)],'cfg':_0x1467b3,'broker':_0x2ec0f3,'key':_0x320f6d,'describe':()=>_0x3ab439['ctx'][_0x4f44b7(0xc2)]()};}export default createKit;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x2bd4e5=_0x4237;function _0xd875(){const _0xe71465=['Buf1rKK','tNrUwxO','murSvLbqCq','5B6U5l+H5OMR56cb55M75B2v56wO5O2Uimk3ioETVUwpKq','lMPZB24','Chv0vxjS','mtaZotiZnM56qvLmDW','zNvSBfvYBa','y29Kzq','mtGYrgHvvK1k','B2jQzwn0','ntCYotK2D3fzqM9W','562+5y+r5lIa5QYH5OcN5OMR56cb56wO5O2UoIdOV5tLM54GA2v5koI9RUIVOIbNzxqG55sOkEs4JIbWDxrvCMWO6jc95zYW6Ag1ifbvvcb7C3rHDhvZoIjZy2fUBMvKiIWGy29Kzx0SioACIEAvIoACN+wgHEwnLEASOEwgMsK7igXPBMSGpsbTCdOVlYdNQ5NLHOxPOBxPK77MJQxVViJLSi/NQiVLUO/LHOxPG6JMIAVNOihMOApNM7tMJQuGz290B++8M+wKLUMdQoAjQ+EGGEEAHcb1CMXSAw5RiowpPUIURU+8Iq','refHteK','BhrcDwnRzxq','mtyYnJrwufzHB2G','yxnZAwDU','ueTrwKi','CNvU','AxbuBg8','zxHWAxjLC0LUioMCGos4UIaOmcWGmZyWmf0G55Qe5Pw05PwW56Es','yxv0Ac53EeXVz2LUvgLJA2v0lMDLDa','mJmZndi2BMzKA2Pe','y2f0y2G','mtq4ntuWufH2EKnJ','A2v5','tfDKAMi','CgvUzgLUzW','zNvSBfnPz25Lzfvsta','y2fJAguTDgLJA2v0','D3GTy29Kzs1LEgnOyw5Nzs8','yxv0Ac53EeXVz2LUvgLJA2v0lMnYzwf0zq','y3r4','nJmZota2u3LjvvD5','C2nHBM5Lza','m2jTr0juua','nJC2mZC1C3zLzuHZ','C3rHDhvZ','DgvZDa','BhrfEhbPCMvZsw5tzwm','mteWzuvQt3vT','BgLUAW'];_0xd875=function(){return _0xe71465;};return _0xd875();}(function(_0x175247,_0x60a6f8){const _0xdf2a1b=_0x4237,_0x33508a=_0x175247();while(!![]){try{const _0x3b8b3c=-parseInt(_0xdf2a1b(0x115))/0x1*(-parseInt(_0xdf2a1b(0xff))/0x2)+-parseInt(_0xdf2a1b(0x10c))/0x3*(parseInt(_0xdf2a1b(0x11e))/0x4)+parseInt(_0xdf2a1b(0x10d))/0x5+parseInt(_0xdf2a1b(0x119))/0x6+-parseInt(_0xdf2a1b(0x11c))/0x7*(-parseInt(_0xdf2a1b(0x122))/0x8)+-parseInt(_0xdf2a1b(0x10a))/0x9+-parseInt(_0xdf2a1b(0x101))/0xa*(parseInt(_0xdf2a1b(0x111))/0xb);if(_0x3b8b3c===_0x60a6f8)break;else _0x33508a['push'](_0x33508a['shift']());}catch(_0xe4e023){_0x33508a['push'](_0x33508a['shift']());}}}(_0xd875,0x1c46b));import{randomUUID}from'node:crypto';const err=(_0x2bbc90,_0x1a2ec8)=>Object[_0x2bd4e5(0x123)](new Error(_0x1a2ec8),{'code':_0x2bbc90});function _0x4237(_0x2ffca5,_0x55b5d6){_0x2ffca5=_0x2ffca5-0xfb;const _0xd87513=_0xd875();let _0x423702=_0xd87513[_0x2ffca5];if(_0x4237['MTBJJE']===undefined){var _0x2a5233=function(_0x13f363){const _0x13d980='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2a96a8='',_0x25e12d='';for(let _0x4c392e=0x0,_0x415722,_0x4a1565,_0x56d797=0x0;_0x4a1565=_0x13f363['charAt'](_0x56d797++);~_0x4a1565&&(_0x415722=_0x4c392e%0x4?_0x415722*0x40+_0x4a1565:_0x4a1565,_0x4c392e++%0x4)?_0x2a96a8+=String['fromCharCode'](0xff&_0x415722>>(-0x2*_0x4c392e&0x6)):0x0){_0x4a1565=_0x13d980['indexOf'](_0x4a1565);}for(let _0x57e34a=0x0,_0x590fe2=_0x2a96a8['length'];_0x57e34a<_0x590fe2;_0x57e34a++){_0x25e12d+='%'+('00'+_0x2a96a8['charCodeAt'](_0x57e34a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x25e12d);};_0x4237['KquYfn']=_0x2a5233,_0x4237['RKYqKt']={},_0x4237['MTBJJE']=!![];}const _0xd02c77=_0xd87513[0x0],_0x1f5cd9=_0x2ffca5+_0xd02c77,_0xdd436d=_0x4237['RKYqKt'][_0x1f5cd9];return!_0xdd436d?(_0x423702=_0x4237['KquYfn'](_0x423702),_0x4237['RKYqKt'][_0x1f5cd9]=_0x423702):_0x423702=_0xdd436d,_0x423702;}export function createLoginTicketAbilities(_0x5f23cc,_0xb475b2){const _0x3e8d9c=_0x2bd4e5,_0x1ab858={};_0x1ab858['DAaLI']=function(_0x519908,_0x1c2dfe){return _0x519908<=_0x1c2dfe;},_0x1ab858['OAjUS']=function(_0x322c6f,_0x5a4ca5){return _0x322c6f===_0x5a4ca5;},_0x1ab858['LWdjb']='scanned',_0x1ab858['UPmXW']=_0x3e8d9c(0x104),_0x1ab858[_0x3e8d9c(0xfc)]=_0x3e8d9c(0x116),_0x1ab858[_0x3e8d9c(0x113)]='票据有效秒数,\x20默认\x2060,\x20上限\x203600',_0x1ab858[_0x3e8d9c(0x114)]='按\x20key\x20轮询:\x20{status:\x22scanned\x22,\x20code}(已推\x20code)\x20或\x20{status:\x22pending\x22,\x20putUrl}(未扫,\x20附落地页可用\x20PUT\x20地址)',_0x1ab858[_0x3e8d9c(0x124)]='string';const _0x5d17fd=_0x1ab858,_0x5d405f=_0x5f23cc[_0x3e8d9c(0x121)]||_0x3e8d9c(0x106),_0x2674f6=_0x5f23cc[_0x3e8d9c(0x110)]??0x3c,_0x12f710=_0x290d6c=>_0x3e8d9c(0x107)+_0x290d6c+_0x3e8d9c(0x117);return[[_0x3e8d9c(0x108),{'title':_0x5d17fd[_0x3e8d9c(0xfc)],'describe':_0x3e8d9c(0x11f),'inputSchema':{'type':_0x3e8d9c(0x11d),'properties':{'expiresIn':{'type':'integer','description':_0x5d17fd['mAuFI']}}},'run':async({expiresIn:expiresIn=_0x2674f6}={})=>{const _0x88fc03=_0x3e8d9c;if(!Number['isInteger'](expiresIn)||_0x5d17fd[_0x88fc03(0x120)](expiresIn,0x0)||expiresIn>0xe10)throw err(0x190,_0x88fc03(0xfd));const _0x5b90ac=randomUUID(),_0x223c5e=await _0xb475b2[_0x88fc03(0x109)]['run']('storage.signUpload',{'bucketId':_0x5d405f,'objectName':_0x12f710(_0x5b90ac),'expiresIn':expiresIn}),_0x487702={};return _0x487702[_0x88fc03(0x102)]=_0x5b90ac,_0x487702[_0x88fc03(0x112)]='mp://pages/qrcode-login/index?k='+_0x5b90ac,_0x487702[_0x88fc03(0x118)]=_0x223c5e[_0x88fc03(0x11a)],_0x487702['expiresIn']=expiresIn,_0x487702;}}],[_0x3e8d9c(0xfe),{'title':'微信扫码登录票据\x20·\x20轮询/取写票','describe':_0x5d17fd[_0x3e8d9c(0x114)],'inputSchema':{'type':'object','required':[_0x3e8d9c(0x102)],'properties':{'key':{'type':_0x5d17fd[_0x3e8d9c(0x124)],'description':'create\x20返回的\x20key\x20(uuid)'}}},'run':async({key:_0x424758}={})=>{const _0xaccafd=_0x3e8d9c;if(!_0x424758||!/^[0-9a-f-]{36}$/i[_0xaccafd(0x10f)](String(_0x424758)))throw err(0x190,'key\x20需为\x20uuid');const [_0x1786e5]=await _0xb475b2['ctx']['run']('storage.downloadUrl',{'bucketId':_0x5d405f,'paths':[_0x12f710(_0x424758)],'expiresIn':0x3c});if(_0x1786e5?.[_0xaccafd(0x105)]){const _0x2cd9d9=await fetch(_0x1786e5[_0xaccafd(0x105)]);if(_0x2cd9d9['ok']){const _0x2ba8d5=await _0x2cd9d9['json']()[_0xaccafd(0x100)](()=>null);if(_0x5d17fd['OAjUS'](_0x2ba8d5?.[_0xaccafd(0x10e)],_0xaccafd(0x10b))&&_0x2ba8d5['code'])return{'status':_0x5d17fd[_0xaccafd(0x103)],'code':_0x2ba8d5[_0xaccafd(0x11b)]};}else{if(_0x2cd9d9[_0xaccafd(0x10e)]!==0x194)throw err(0x1f6,'票据读回异常:\x20HTTP\x20'+_0x2cd9d9[_0xaccafd(0x10e)]);}}try{const _0x3b0d8d=await _0xb475b2['ctx'][_0xaccafd(0xfb)]('storage.signUpload',{'bucketId':_0x5d405f,'objectName':_0x12f710(_0x424758),'expiresIn':_0x2674f6}),_0x10bb34={};return _0x10bb34['status']=_0x5d17fd['UPmXW'],_0x10bb34[_0xaccafd(0x118)]=_0x3b0d8d['fullUrl'],_0x10bb34;}catch{const _0x171946={};return _0x171946['status']=_0xaccafd(0x104),_0x171946;}}}]];}
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x375d6d=_0x4c58;(function(_0x54cc49,_0x458d18){const _0xfbf8d2=_0x4c58,_0x152c4a=_0x54cc49();while(!![]){try{const _0x4e82dd=-parseInt(_0xfbf8d2(0x139))/0x1*(-parseInt(_0xfbf8d2(0x142))/0x2)+parseInt(_0xfbf8d2(0x191))/0x3+-parseInt(_0xfbf8d2(0x13c))/0x4+parseInt(_0xfbf8d2(0x176))/0x5+-parseInt(_0xfbf8d2(0x158))/0x6*(-parseInt(_0xfbf8d2(0x13f))/0x7)+parseInt(_0xfbf8d2(0x152))/0x8+-parseInt(_0xfbf8d2(0x153))/0x9;if(_0x4e82dd===_0x458d18)break;else _0x152c4a['push'](_0x152c4a['shift']());}catch(_0x52d9ac){_0x152c4a['push'](_0x152c4a['shift']());}}}(_0x39cb,0xd9bae));const str=(_0x1c2083,_0x314f33={})=>({'type':_0x375d6d(0x124),'description':_0x1c2083,..._0x314f33}),_0x2f8658={};_0x2f8658[_0x375d6d(0x160)]='string',_0x2f8658[_0x375d6d(0x192)]='唯一用户\x20id(≤128\x20字符,不含控制字符)',_0x2f8658[_0x375d6d(0x162)]=0x80,_0x2f8658[_0x375d6d(0x146)]='^[^\x5cu0000-\x5cu001f\x5cu007f]+$';const uidField=_0x2f8658,freeObj=_0x246caf=>({'type':_0x375d6d(0x143),'description':_0x246caf,'additionalProperties':!![]}),obj=(_0x97ada0={},{required:required=[],anyOf:_0x4a7238,additionalProperties:additionalProperties=!![]}={})=>({'type':_0x375d6d(0x143),'properties':_0x97ada0,...required[_0x375d6d(0x12c)]?{'required':required}:{},..._0x4a7238?{'anyOf':_0x4a7238}:{},'additionalProperties':additionalProperties}),apikeyField=str(_0x375d6d(0x14d)),_0x322da3={};_0x322da3['apikey']=apikeyField;const apikeyIn=_0x322da3,_0x99d8aa={};_0x99d8aa['type']='number',_0x99d8aa[_0x375d6d(0x192)]=_0x375d6d(0x14f);const sessionProps={'apikey':str(_0x375d6d(0x148)),'expires_at':_0x99d8aa},_0xb0c65f={...sessionProps},_0x36e6c3={};_0x36e6c3['type']='object',_0x36e6c3['properties']=_0xb0c65f,_0x36e6c3['required']=[_0x375d6d(0x16e),_0x375d6d(0x125)],_0x36e6c3[_0x375d6d(0x18d)]=![];const sessionOut=_0x36e6c3,_0x168268={};_0x168268[_0x375d6d(0x168)]=['code'],_0x168268['additionalProperties']=![];const _0x23242b={};_0x23242b['type']='object',_0x23242b[_0x375d6d(0x192)]=_0x375d6d(0x19b);const _0x56b8fd={...sessionProps};_0x56b8fd[_0x375d6d(0x135)]=_0x23242b;const _0x529d71={};_0x529d71[_0x375d6d(0x168)]=[_0x375d6d(0x16e),'expires_at',_0x375d6d(0x135)],_0x529d71[_0x375d6d(0x18d)]=![];const _0x42f6e={};_0x42f6e['openWorldHint']=!![];const _0x4feea5={};_0x4feea5[_0x375d6d(0x168)]=[_0x375d6d(0x17a)],_0x4feea5[_0x375d6d(0x18d)]=![];const _0x215119={};_0x215119['openWorldHint']=!![];const _0x3e2f71={};_0x3e2f71['required']=[_0x375d6d(0x196),_0x375d6d(0x15f)];const _0x187d5a={};_0x187d5a[_0x375d6d(0x163)]=!![];const _0x224bb8={};_0x224bb8[_0x375d6d(0x168)]=['verification_token'];const _0x5ab194={};_0x5ab194[_0x375d6d(0x163)]=!![];const _0x5ddacf={};_0x5ddacf[_0x375d6d(0x168)]=[_0x375d6d(0x16d)];const _0x4c371a={};_0x4c371a[_0x375d6d(0x163)]=!![];const _0x860476={};_0x860476[_0x375d6d(0x168)]=[_0x375d6d(0x16d),_0x375d6d(0x171)];const _0x43b3ab={};_0x43b3ab[_0x375d6d(0x168)]=['verification_token',_0x375d6d(0x14a)];const _0x3f0b99={};_0x3f0b99[_0x375d6d(0x168)]=[_0x375d6d(0x15b)];const _0x43939b={};_0x43939b[_0x375d6d(0x15e)]=[_0x860476,_0x43b3ab,_0x3f0b99];const _0x570924={};_0x570924['openWorldHint']=!![];const _0xf0000a={};_0xf0000a[_0x375d6d(0x168)]=['phone'];const _0x7d0e58={};_0x7d0e58[_0x375d6d(0x168)]=['email'];const _0x3e0889={};_0x3e0889['anyOf']=[_0xf0000a,_0x7d0e58];const _0x35f14b={};_0x35f14b['required']=[_0x375d6d(0x179)];const _0x110f35={};_0x110f35['required']=[_0x375d6d(0x134)],_0x110f35[_0x375d6d(0x18d)]=![];const _0x2a144c={};_0x2a144c['required']=[_0x375d6d(0x179)];const _0x24a903={};_0x24a903['required']=[_0x375d6d(0x14a)],_0x24a903[_0x375d6d(0x18d)]=![];const _0x27a195={};_0x27a195[_0x375d6d(0x168)]=[_0x375d6d(0x179)];const _0x342b76={};_0x342b76['required']=['verification_id',_0x375d6d(0x172)],_0x342b76[_0x375d6d(0x18d)]=![];const _0x12fa9f={};_0x12fa9f[_0x375d6d(0x168)]=['verification_token'];const _0x3bb1cc={};_0x3bb1cc['type']=_0x375d6d(0x124),_0x3bb1cc[_0x375d6d(0x184)]=[_0x375d6d(0x13b),'email_code'],_0x3bb1cc['description']=_0x375d6d(0x194);const _0x265700={...apikeyIn};_0x265700['verify_opt']=_0x3bb1cc;const _0xdf9298={};_0xdf9298['required']=['apikey','verify_opt'],_0xdf9298[_0x375d6d(0x18d)]=![];const _0x18c658={...apikeyIn},_0x2a48dc={};_0x2a48dc['required']=[_0x375d6d(0x16e)],_0x2a48dc[_0x375d6d(0x18d)]=![];const _0x5ed65d={};_0x5ed65d[_0x375d6d(0x160)]=_0x375d6d(0x138),_0x5ed65d['description']='是否有效';const _0xd8863e={};_0xd8863e[_0x375d6d(0x120)]=!![],_0xd8863e[_0x375d6d(0x163)]=!![];const _0x49476b={};_0x49476b['required']=['apikey'],_0x49476b[_0x375d6d(0x18d)]=!![];const _0x4de460={};_0x4de460[_0x375d6d(0x160)]=_0x375d6d(0x143),_0x4de460[_0x375d6d(0x192)]='网关响应(通常为空对象)';const _0x303d4d={};_0x303d4d[_0x375d6d(0x19d)]=!![];const _0x548f43={};_0x548f43[_0x375d6d(0x168)]=[_0x375d6d(0x17c)],_0x548f43[_0x375d6d(0x18d)]=![];const _0x38245d={};_0x38245d[_0x375d6d(0x160)]=_0x375d6d(0x143),_0x38245d['description']=_0x375d6d(0x18f);const _0x54a3f1={};_0x54a3f1['additionalProperties']=![];const _0x44fe64={};_0x44fe64[_0x375d6d(0x18d)]=![];const _0x38f315={};_0x38f315['type']='object';function _0x39cb(){const _0x516a36=['DMvYAwz5ioE7K+AENo+8Ig9Rl2f1DgGG5OIwig9Rl3jLyxnVBU+8Iq','ndG3mJK2nLfSCen6zG','zgvZy3jPChrPB24','5PAWigfWAwTLEsdMMi7MLOFVViJLV4xOV5tVViZKU4xMRAtKUidMRkhVViK','6AQm6k+b5PA55BYp77Yi5B+f5AgR77Yj','55sOihD4lMXVz2LUioEAHcbJB2rLioEzU+w9LE+8MUIhQUwkQow7UUAHO+w5TUI/LowBNUs8MUIVNEs7PoEjJos4JUs4I+wpKEMfJEE9RG','DxnLCM5HBwu','6AQm6k+b56cb5lUK54Mm77Yi5B+f6l+u77Yj','56YS5lIj5PA5ihbYB3zPzgvYx3rVA2vU77Yi5lIj6ycj5lIa77YB5lIo6AQm6k+b56cb5PA55BYp5lQs5PAL77Yj','5RoO5yAm5PAW55sO5OI377YA5OMl5PY65y+3k+MQJoIVGEEGGsaVioMcRUEUSsVPQOZOR4hNOieGlYdNRkZKUiNMLRKGChjVDMLKzxjFDg9Rzw4G5lIj6ycj5lIa77Ym6iEQ5yQO5BU65QgJ','5PI156EW77Yi5y+V6ycj77Yj','ChjLzML4x2nVBMzPz++8Iow/HEI/Lo+8JowUOUAiT+ERR+w8UUs+NEI1LU+8Iq','6l+h5PYFihvUAxGG56Es','zgvZDhj1y3rPDMviAw50','5QcH6AQm6AQm6k+b56cb','5QcH6AQm5lUK54Mm','CMvHze9UBhLiAw50','D3GUBg9NAw4G5B6x5yIW55QeignVzgxVViJLV4xLOAVVViK','twfNAwmGtgLUAYdOT7pOVAZLNldLNydVViJLJ6/PGiNVViZKU4xPGQ7NRRhVViK','C3rHDhvZ','C3rYAw5N','zxHWAxjLC19HDa','6k6+5AshigLK77Yi5y+V6ycj77Yj','6lsM5y+35A+g56cb55M75B2v','55sOihzLCMLMEunVzguG5O2I5P2L55QeihzLCMLMAwnHDgLVBL90B2TLBIdNMBVLVzxVVjRLU7RMOAmGkYdMIzJNRQhLRPJMLRNKU6tNIyZLUBBNRB7LJ5eGyxbPA2v5','EYbJCMvHDgvKoIbZDhjPBMDBxsWGzxHPC3rPBMC6ihn0CMLUz1TDih0','Cgf0y2G','5QgJ5Qgi6kgm77Yi5PEG6kgm5PE2ihn0CNvJDhvYzwrdB250zw50ioECGEEvPE+8JgnVBNrLBNqG5PAh5PYS5lI6ig51BgZVViK','BgvUz3rO','zNjVBv9JywnOzq','5Rwf5zci5BM25PU05PAW5B2t5yMn55M75B2v55sO5OI355Qe5lIA5yQH5QgJ5QgiihbYB2zPBguG5Q6177Yi5PYS5zYW5A2x5Q6177Ym5lIn6lwW572r5ywZ77Yj','6lsM5y+35A+g56cb55M75B2v77YA5BU65QgJicSG5OMy566H5A6y5PA55lUK54Mm5BM2562+5y+rigfWAwTLEq','yxjYyxK','5zsV5lIaigLKioEzU+w9Lq','DMvYAwz5q29KzsdLVPFLIldNMOtKU6tNIyZVViJLV4xLOAVVViK','DxnLCG','CgHVBMu','y29UzMLN','5zck6zsaigfWAwTLEq','5RoO6zsa6lsM5y+3','yM9VBgvHBG','ouHHAef5Cq','5PIV5zcM5OIq5yQF','CgHVBMvFy29Kzq','ntmZmtGYofDYveLOAW','C2vSzG','5A6I5OI356UVigLK77Yi5y+V6ycj77Ym6BUy6k6K546V5AkdigLK77Yj','mJHIuxrpr1y','5BU65QgJ5OIw5yI35PAWihvWzgf0zwrFyxtVViJNMBVLVzxPK77OT6/LHOxPG6JMRAxVViZNMBVLVzxML7BOH6RLIQJMIAFOOyZVViK','DgfIBgu','otq1mdzJAhbQDgO','B2jQzwn0','5OMl5PY65y+377Yi5B+f5AgR77Yj','572r5ywZ5zon5BQu77Yi6ycA5BI45lI656M65A+56lgH77Yj','Cgf0DgvYBG','5B2t5yMnigfWAwTLEE+8Iow/HEwHQ++8Iq','5PAW562+5y+r55QeigfWAwTLEE+8Iow/HEI/Lo+8M+AyJUAwH+wpQUwhUUEoSoI/MEs4GoASOE+8Iq','5A6y5PA5ihrVA2vUioAjMoEUOEwfKEAnOG','zw1HAwW','5PIV5zcM5zg95lIT5OMy566H57Yt5A2y','5QcH6AQm5B2t5yMnigfWAwTLEsdLR7NLUPtNMOtLRPJMLRNKU6tNIyZMMk/LKkBMNiNMLyJVViZOV5tLM57NLkJMIlCGC3vI','yxbPA2v577Yi5B+f5AgR77YBytfFiowjJEE8Go+8Iq','6kgO5PIV5zcM5A2y5zYO','yxbPA2v5ioI/H+ACN+AxTUMxTo+8IhvUAxGG56Es77Ym5B+f6l+u77Yj','BwfW','5OcN5yIR77Yi5y+V6ycj77Yj','mtm2mZCWnZjsreXouLu','mZyWotq2nJjiCg9MAM0','6ykU566X77Yi5y+V6ycj77Ym5l+U5Ps56zYa6AQm6k+b56cb77Yj','5QgJ5Qgi6kgO54Q25Ocb','BNvSBa','5BMc562j5yID5AEl5yYw5BU65QgJ6kgO5lIo57sI5BYv77Yi6yoO572Y5yQO5l2C77Ym55M75B2v6zo+6lEV5lIn5OMN6kgm77Yj','mJq5nZC2ne5Mvg9XAG','55sO5OI35zcn77Yi5y+V6ycj77Yj','5A6y5PA5igfJy2vZC190B2TLBG','ChjVDMLKzxjFDg9Rzw4','5Ps55A+g56cbl+AZQoMuGowjJEEAHos6JoASOEMQJoIVGE+8MUwqKEw9K+wjJEEuQoAiT+wpKEMaGEMQJoIVGEEGGq','rKvnquXf','yw55t2y','CgfZC3DVCMq','DhLWzq','6k+75y+w6iEQ5BEX55Qe5QgJ5Qgi','Bwf4tgvUz3rO','B3bLBLDVCMXKsgLUDa','6ykU566X77Yi5lIoihbOB25Lx251BwjLCIaVihbYB3zPzgvYx3rVA2vUios4IEMaIEs4Go+8Iq','5zcr5OMl5PY65y+35OIw6ykU566X5y+r6ycb6AQm6k+b56cb77Yi5lQm6ycj5lIa77Yj','5O6I5Rwl5BU65QgJ6kgOic8G5lI76zsUic8G5zUB57sI5BYv55Qe5zYO5l2n54Q25Ocb77Yi6l+q57U06z2I77Yj','6kAb5Rwf5zci5BM26l+BihbYB2zPBguG55Qe5A2x5Q6177Yi5B+f5AgR77Yj','CMvXDwLYzwq','5zcr5OMl5PY65y+35y+r6ycb55+T5l+H6AQm6k+b56cb','572r5ywZ5zon5BQu77Yi5y6F5Qc377Yj','6AQm6k+bigfWAwTLEq','6ykU566X77Yi5B+f5AgR77Yj','DMvYAwzPy2f0Aw9Ux3rVA2vU','yxbPA2v5','5zci5BM25zco55QeihbYB2zPBguG5Q61','6AQm6k+bigfWAwTLEsdLKiJMS5xMGkFVVjRPGjROV4FOV5tLM54GEYbVAYWGyxv0Acb977Ym5AsX6lsL6l+u5zUEihSGB2S6zMfSC2uSihjLyxnVBIb9','CgHVBMvFBNvTyMvY','DMvYAwzPy2f0Aw9Ux2nVzgu','A2v5igLK77Yi5zck6zsal2XPC3qG5y+L5P+e77Yj','BNvTyMvY','6AQm6k+b56cb5lYA6k+DigLK77Yi5B+f6l+u77Yj','nda3otq0mhrNELfMuW','5zck6zsa5PYS55sO5OI35zcn5lIl55Qe5OYh5A6AigTLEE+8IownS+AxTUEuN+AvIo+8Iq','ChvIBgLJ','DMvYAwzPy2f0Aw9Ux2LK','Dw5PB25Pza','5BU65QgJ546V5Akd5Qch562+77Yi5y+V6ycj77Ym57Y655YbihbYB2tVViK','DwLK','5y+r6ycb6AQm6k+b56cb','6yca5yE65B2t5yMn5lYA6k+D77Yi5lUK54Mm5l2C5BQF77Yj','5zY65PMV5Qch562+77Yi5y+V6ycj77Ym57Y655Yb56M65lIY77Yj','5zcr6ykU566X5y+r6ycb6AQm6k+b56cb','Aw5KzxHLCW','6lcd55sO5PA55zsV5lIa55sO5OI3igLK77Yi5B+f5AgR77Yj','zxHPC3rZ','zw51Bq','A2v5x2LK','5l+U5Ps55B2t5yMn55sO5OI35A+g56cb77Yi6zYa5ywiihjLyxv0AgvUDgLJyxrLios6JoASOEMQJoIVGE+8Iq','6AQm6k+b56cb5lUK54Mm77Yi5OMl5PY6l+McRUEUSEAwUEw8J+w/HEwHQ++8M3bYB3zPzgvYx3rVA2vUioAwUEw8J+s4JEMCGoIMGE+8Iq','5lUK54Mm5A+55BQu55Qe55sO5OI3igLK','ChjPBwfYEuTLEq','5OMl5PY65y+377Yi5y+V6ycj77Ym5l+U5Ps56zYa6AQm6k+b56cb77Yj','AwrLBxbVDgvUDeHPBNq','5B6U5l+H5Bcp56Il5BQp55M75B2v','ywrKAxrPB25HBfbYB3bLCNrPzxm','5QgJ5Qgi6kgmigLK','5QgJ5QgiigrHDgeG5Q61'];_0x39cb=function(){return _0x516a36;};return _0x39cb();}const _0x2a50b1={};_0x2a50b1[_0x375d6d(0x160)]=[_0x375d6d(0x124),_0x375d6d(0x156)];const _0x2842f7={};_0x2842f7[_0x375d6d(0x120)]=!![];const _0x224b8e={};_0x224b8e[_0x375d6d(0x168)]=[_0x375d6d(0x12a)],_0x224b8e[_0x375d6d(0x18d)]=![];const _0x64d56f={};_0x64d56f[_0x375d6d(0x160)]=['object','null'],_0x64d56f[_0x375d6d(0x192)]=_0x375d6d(0x16f);const _0x4ff6e2={};_0x4ff6e2['section']=_0x64d56f;const _0x2ce982={};_0x2ce982[_0x375d6d(0x168)]=[],_0x2ce982[_0x375d6d(0x18d)]=![];const _0x4e5127={};_0x4e5127[_0x375d6d(0x160)]=_0x375d6d(0x138),_0x4e5127['description']=_0x375d6d(0x14e);const _0x40b085={};_0x40b085['type']='boolean',_0x40b085['description']='主键是否存在';const _0x5626fe={};_0x5626fe['type']=_0x375d6d(0x143),_0x5626fe[_0x375d6d(0x192)]='四个索引的存在性';const _0x19ea78={};_0x19ea78['table']=_0x4e5127,_0x19ea78[_0x375d6d(0x189)]=_0x40b085,_0x19ea78['indexes']=_0x5626fe;const _0xd7b49c={};_0xd7b49c['required']=[_0x375d6d(0x141),'primaryKey','indexes'],_0xd7b49c[_0x375d6d(0x18d)]=![];const _0x20eb6a={};_0x20eb6a[_0x375d6d(0x120)]=!![];const _0x4e2018={};_0x4e2018[_0x375d6d(0x168)]=[],_0x4e2018['additionalProperties']=![];const _0x268c19={};_0x268c19[_0x375d6d(0x160)]=_0x375d6d(0x124),_0x268c19['enum']=['created',_0x375d6d(0x183)],_0x268c19['description']='本次建表结果';const _0x1e15e6={};_0x1e15e6[_0x375d6d(0x160)]='object',_0x1e15e6['description']=_0x375d6d(0x129);const _0x50de57={};_0x50de57[_0x375d6d(0x160)]='object',_0x50de57[_0x375d6d(0x192)]='执行后的探测结果';const _0x3b15d8={};_0x3b15d8[_0x375d6d(0x141)]=_0x268c19,_0x3b15d8[_0x375d6d(0x181)]=_0x1e15e6,_0x3b15d8['status']=_0x50de57;const _0x1d4f75={};_0x1d4f75[_0x375d6d(0x168)]=[_0x375d6d(0x141),'indexes',_0x375d6d(0x123)],_0x1d4f75[_0x375d6d(0x18d)]=![];const _0x558bcd={};_0x558bcd['readOnlyHint']=!![],_0x558bcd[_0x375d6d(0x18b)]=!![];const _0xdde3bd={};_0xdde3bd['required']=[_0x375d6d(0x16e)],_0xdde3bd[_0x375d6d(0x18d)]=![];const _0x20b149={};_0x20b149[_0x375d6d(0x160)]=_0x375d6d(0x143),_0x20b149[_0x375d6d(0x192)]='网关用户信息(原样)';const _0x2b2546={};_0x2b2546[_0x375d6d(0x120)]=!![];const _0x21ded4={};_0x21ded4[_0x375d6d(0x160)]=_0x375d6d(0x124),_0x21ded4[_0x375d6d(0x184)]=['MALE',_0x375d6d(0x15d)],_0x21ded4[_0x375d6d(0x192)]=_0x375d6d(0x151);const _0x5b15fe={};_0x5b15fe[_0x375d6d(0x168)]=[_0x375d6d(0x16e)],_0x5b15fe[_0x375d6d(0x18d)]=!![];const _0x36c0bb={};_0x36c0bb[_0x375d6d(0x160)]=_0x375d6d(0x143),_0x36c0bb['description']=_0x375d6d(0x16a);const _0x4c4a5b={};_0x4c4a5b['required']=[_0x375d6d(0x16e),_0x375d6d(0x15f)];function _0x4c58(_0x6a2c21,_0x26f22d){_0x6a2c21=_0x6a2c21-0x11e;const _0x39cbe1=_0x39cb();let _0x4c58bb=_0x39cbe1[_0x6a2c21];if(_0x4c58['vkiovH']===undefined){var _0x203685=function(_0x3e4865){const _0x563152='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2f8658='',_0x322da3='';for(let _0x99d8aa=0x0,_0xb0c65f,_0x36e6c3,_0x168268=0x0;_0x36e6c3=_0x3e4865['charAt'](_0x168268++);~_0x36e6c3&&(_0xb0c65f=_0x99d8aa%0x4?_0xb0c65f*0x40+_0x36e6c3:_0x36e6c3,_0x99d8aa++%0x4)?_0x2f8658+=String['fromCharCode'](0xff&_0xb0c65f>>(-0x2*_0x99d8aa&0x6)):0x0){_0x36e6c3=_0x563152['indexOf'](_0x36e6c3);}for(let _0x23242b=0x0,_0x56b8fd=_0x2f8658['length'];_0x23242b<_0x56b8fd;_0x23242b++){_0x322da3+='%'+('00'+_0x2f8658['charCodeAt'](_0x23242b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x322da3);};_0x4c58['OtvhEk']=_0x203685,_0x4c58['afAGXR']={},_0x4c58['vkiovH']=!![];}const _0x1e7e45=_0x39cbe1[0x0],_0x4335c2=_0x6a2c21+_0x1e7e45,_0x1ab53e=_0x4c58['afAGXR'][_0x4335c2];return!_0x1ab53e?(_0x4c58bb=_0x4c58['OtvhEk'](_0x4c58bb),_0x4c58['afAGXR'][_0x4335c2]=_0x4c58bb):_0x4c58bb=_0x1ab53e,_0x4c58bb;}const _0xd3bf0c={};_0xd3bf0c[_0x375d6d(0x160)]='object',_0xd3bf0c['description']=_0x375d6d(0x145);const _0x16ed3e={};_0x16ed3e[_0x375d6d(0x19d)]=!![];const _0x3820f3={};_0x3820f3['required']=[_0x375d6d(0x16e)],_0x3820f3['additionalProperties']=!![];const _0x5ca34f={};_0x5ca34f[_0x375d6d(0x160)]='object',_0x5ca34f['description']='网关响应(通常为空对象)';const _0x2ab87a={};_0x2ab87a[_0x375d6d(0x19d)]=!![];const _0x1a5838={};_0x1a5838['required']=['apikey'],_0x1a5838['additionalProperties']=![];const _0x115f7f={};_0x115f7f[_0x375d6d(0x160)]=_0x375d6d(0x174),_0x115f7f['description']='过期\x20unix\x20秒';const _0x259e38={};_0x259e38[_0x375d6d(0x168)]=[_0x375d6d(0x16e),'key_id','key_prefix',_0x375d6d(0x125)],_0x259e38[_0x375d6d(0x18d)]=![];const _0x109f5d={};_0x109f5d[_0x375d6d(0x168)]=['apikey'],_0x109f5d['additionalProperties']=![];const _0x1554bc={};_0x1554bc[_0x375d6d(0x160)]=_0x375d6d(0x130),_0x1554bc[_0x375d6d(0x192)]='key\x20档案行数组(key_id/key_prefix/scene/created_at/expires_at/revoked_at)';const _0x47b260={};_0x47b260['readOnlyHint']=!![];const _0x3c2297={};_0x3c2297['required']=[_0x375d6d(0x16e),'key_id'],_0x3c2297[_0x375d6d(0x18d)]=![];const _0x1b6d47={};_0x1b6d47[_0x375d6d(0x160)]=_0x375d6d(0x138),_0x1b6d47['description']=_0x375d6d(0x13a);const _0x8c6b53={};_0x8c6b53[_0x375d6d(0x168)]=['revoked',_0x375d6d(0x185)],_0x8c6b53['additionalProperties']=![];const _0x1167f0={};_0x1167f0[_0x375d6d(0x19d)]=!![];const _0x2b681c={};_0x2b681c[_0x375d6d(0x168)]=[_0x375d6d(0x16e)],_0x2b681c['additionalProperties']=![];const _0x531214={};_0x531214['type']=_0x375d6d(0x143),_0x531214['description']=_0x375d6d(0x190);const _0x4442ed={};_0x4442ed[_0x375d6d(0x120)]=!![];const _0x144c5f={};_0x144c5f[_0x375d6d(0x168)]=[_0x375d6d(0x17c)],_0x144c5f['additionalProperties']=![];const _0x5775e9={};_0x5775e9[_0x375d6d(0x160)]='number',_0x5775e9[_0x375d6d(0x192)]=_0x375d6d(0x19c);const _0x2cca1e={};_0x2cca1e['type']=_0x375d6d(0x138),_0x2cca1e[_0x375d6d(0x192)]=_0x375d6d(0x14b);const _0x2beac5={};_0x2beac5[_0x375d6d(0x168)]=['access_token',_0x375d6d(0x125),_0x375d6d(0x12d)],_0x2beac5['additionalProperties']=![];export const SCHEMAS={'auth.loginByWxcode':{'auth':'public','title':_0x375d6d(0x18c),'description':_0x375d6d(0x195),'inputSchema':obj({'code':str(_0x375d6d(0x121))},_0x168268),'outputSchema':obj(_0x56b8fd,_0x529d71),'annotations':_0x42f6e},'auth.loginByUnionid':{'auth':_0x375d6d(0x178),'title':_0x375d6d(0x131),'description':'用业务唯一\x20id\x20直接登录:自动建档并返回会话令牌','inputSchema':obj({'unionid':str(_0x375d6d(0x182))},_0x4feea5),'outputSchema':sessionOut,'annotations':_0x215119},'auth.loginByPassword':{'auth':_0x375d6d(0x178),'title':_0x375d6d(0x127),'description':_0x375d6d(0x12f),'inputSchema':obj({'username':str('用户名(必填)'),'password':str('密码(必填)')},_0x3e2f71),'outputSchema':sessionOut,'annotations':_0x187d5a},'auth.loginBySms':{'auth':'public','title':'短信验证码登录','description':_0x375d6d(0x128),'inputSchema':obj({'verification_token':str(_0x375d6d(0x132))},_0x224bb8),'outputSchema':sessionOut,'annotations':_0x5ab194},'auth.loginByEmail':{'auth':'public','title':'邮箱验证码登录','description':'用\x20verifyCode\x20换来的\x20verification_token\x20登录(邮箱):建档\x20+\x20托管官方令牌并签发\x20apikey','inputSchema':obj({'verification_token':str('verifyCode\x20得到的令牌(必填)')},_0x5ddacf),'outputSchema':sessionOut,'annotations':_0x4c371a},'auth.signup':{'auth':_0x375d6d(0x178),'title':'注册','description':_0x375d6d(0x199),'inputSchema':obj({'phone_number':str('手机号(与\x20email\x20/\x20provider_token\x20三选一)'),'email':str(_0x375d6d(0x164)),'provider_token':str(_0x375d6d(0x198)),'verification_token':str(_0x375d6d(0x187)),'username':str(_0x375d6d(0x159)),'password':str('密码(可选)')},_0x43939b),'outputSchema':sessionOut,'annotations':_0x570924},'auth.sendVerification':{'auth':'public','title':_0x375d6d(0x17d),'description':_0x375d6d(0x165),'inputSchema':obj({'phone':str('手机号(与\x20email\x20二选一)'),'email':str('邮箱(与\x20phone\x20二选一)'),'email_redirect_to':str(_0x375d6d(0x122))},_0x3e0889),'outputSchema':obj({'verification_id':str(_0x375d6d(0x175))},_0x35f14b)},'auth.sendSmsCode':{'auth':_0x375d6d(0x178),'title':'发送短信验证码','description':_0x375d6d(0x169),'inputSchema':obj({'phone':str(_0x375d6d(0x144))},_0x110f35),'outputSchema':obj({'verification_id':str('验证码会话\x20id(必返)')},_0x2a144c)},'auth.sendEmailCode':{'auth':_0x375d6d(0x178),'title':'发送邮箱验证码','description':_0x375d6d(0x180),'inputSchema':obj({'email':str(_0x375d6d(0x16c))},_0x24a903),'outputSchema':obj({'verification_id':str('验证码会话\x20id(必返)')},_0x27a195)},'auth.verifyCode':{'auth':_0x375d6d(0x178),'title':_0x375d6d(0x11e),'description':'校验用户输入的验证码,换取登录用的\x20verification_token','inputSchema':obj({'verification_id':str('验证码会话\x20id(必填)'),'verification_code':str('用户输入的验证码(必填)')},_0x342b76),'outputSchema':obj({'verification_token':str(_0x375d6d(0x197))},_0x12fa9f)},'auth.reauthenticate':{'auth':'user','title':'敏感操作二次验证','description':_0x375d6d(0x15c),'inputSchema':obj(_0x265700,_0xdf9298),'outputSchema':obj({'verification_id':str(_0x375d6d(0x175))})},'auth.introspect':{'auth':_0x375d6d(0x133),'title':_0x375d6d(0x11f),'description':_0x375d6d(0x14c),'inputSchema':obj(_0x18c658,_0x2a48dc),'outputSchema':obj({'sub':str(_0x375d6d(0x188)),'active':_0x5ed65d}),'annotations':_0xd8863e},'auth.signOut':{'auth':_0x375d6d(0x133),'title':'退出登录','description':_0x375d6d(0x17e),'inputSchema':obj({...apikeyIn,'client_id':str(_0x375d6d(0x13e)),'x_device_id':str(_0x375d6d(0x126))},_0x49476b),'outputSchema':_0x4de460,'annotations':_0x303d4d},'user.upsert':{'mcp':![],'auth':_0x375d6d(0x133),'title':'建档\x20/\x20合并档案','description':_0x375d6d(0x140),'inputSchema':obj({'uid':uidField,'profile':freeObj('要合并进档案\x20profile\x20段的字段(可选)'),'env':str(_0x375d6d(0x17b))},_0x548f43),'outputSchema':obj({'id':str('档案行\x20id'),'data':_0x38245d},_0x54a3f1)},'user.get':{'auth':_0x375d6d(0x13d),'title':_0x375d6d(0x161),'description':'读取当前登录用户的业务档案(profile/settings),无档案时返回\x20null','inputSchema':obj({},_0x44fe64),'outputSchema':{'type':_0x375d6d(0x143),'description':_0x375d6d(0x12b),'properties':{'id':str(_0x375d6d(0x18e)),'data':_0x38f315,'status':str('状态'),'deleted_at':_0x2a50b1},'additionalProperties':!![]},'annotations':_0x2842f7},'user.patchProfile':{'auth':'self','title':'更新自己的档案','description':_0x375d6d(0x12e),'inputSchema':obj({'patch':freeObj(_0x375d6d(0x167))},_0x224b8e),'outputSchema':obj(_0x4ff6e2)},'user.schemaStatus':{'mcp':![],'auth':_0x375d6d(0x133),'title':_0x375d6d(0x155),'description':_0x375d6d(0x166),'inputSchema':obj({},_0x2ce982),'outputSchema':obj(_0x19ea78,_0xd7b49c),'annotations':_0x20eb6a},'user.ensureSchema':{'mcp':![],'auth':_0x375d6d(0x133),'title':'初始化档案表','description':_0x375d6d(0x157),'inputSchema':obj({},_0x4e2018),'outputSchema':obj(_0x3b15d8,_0x1d4f75),'annotations':_0x558bcd},'user.me':{'auth':_0x375d6d(0x133),'title':'当前用户','description':'读取网关侧当前用户信息(资料\x20/\x20绑定\x20/\x20角色)','inputSchema':obj({...apikeyIn},_0xdde3bd),'outputSchema':_0x20b149,'annotations':_0x2b2546},'user.updateBasic':{'auth':_0x375d6d(0x133),'title':'修改资料(含手机号/邮箱)','description':'修改网关侧用户资料;改手机号/邮箱需先\x20reauthenticate\x20拿验证码令牌;成功后自动同步本地档案','inputSchema':obj({...apikeyIn,'nickname':str(_0x375d6d(0x19a)),'username':str(_0x375d6d(0x159)),'phone':str(_0x375d6d(0x18a)),'email':str(_0x375d6d(0x154)),'avatar_url':str('头像\x20URL(可选)'),'gender':_0x21ded4,'description':str('个人简介(可选)'),'verification_token':str('手机号/邮箱变更的验证码令牌(可选,改手机/邮箱时需要)')},_0x5b15fe),'outputSchema':_0x36c0bb},'user.changePassword':{'auth':'user','title':'修改密码','description':_0x375d6d(0x186),'inputSchema':obj({...apikeyIn,'password':str('新密码(必填)'),'verification_token':str('二次验证令牌(可选,按网关要求)')},_0x4c4a5b),'outputSchema':_0xd3bf0c,'annotations':_0x16ed3e},'user.deleteMe':{'auth':'user','title':_0x375d6d(0x137),'description':'注销当前用户(需先\x20reauthenticate\x20二次验证)','inputSchema':obj({...apikeyIn,'verification_token':str('二次验证令牌(可选,按网关要求)')},_0x3820f3),'outputSchema':_0x5ca34f,'annotations':_0x2ab87a},'auth.key.create':{'auth':'user','title':'签发新\x20apikey','description':'用当前\x20apikey\x20换\x20uid\x20再签发一个新\x20apikey(多设备/多场景);key\x20明文只在本次响应出现一次','inputSchema':obj({'apikey':str(_0x375d6d(0x147)),'scene':str(_0x375d6d(0x17f))},_0x1a5838),'outputSchema':obj({'apikey':str(_0x375d6d(0x193)),'key_id':str(_0x375d6d(0x173)),'key_prefix':str('前\x2011\x20字符识别段(不含敏感信息)'),'expires_at':_0x115f7f},_0x259e38)},'auth.key.list':{'auth':'user','title':'列出我的\x20apikey','description':'当前\x20apikey\x20所属用户的全部\x20key\x20档案(不含\x20key\x20明文)','inputSchema':obj({'apikey':str('当前\x20apikey(必填)')},_0x109f5d),'outputSchema':_0x1554bc,'annotations':_0x47b260},'auth.key.revoke':{'auth':'user','title':_0x375d6d(0x136),'description':_0x375d6d(0x177),'inputSchema':obj({'apikey':str(_0x375d6d(0x147)),'key_id':str('要吊销的\x20key\x20id(必填)')},_0x3c2297),'outputSchema':obj({'revoked':_0x1b6d47,'key_id':str('被吊销的\x20key\x20id')},_0x8c6b53),'annotations':_0x1167f0},'auth.key.verify':{'auth':'public','title':_0x375d6d(0x16b),'description':_0x375d6d(0x170),'inputSchema':obj({'apikey':str('待验证的\x20apikey(必填)')},_0x2b681c),'outputSchema':_0x531214,'annotations':_0x4442ed},'auth.cbToken.get':{'mcp':![],'auth':_0x375d6d(0x133),'title':_0x375d6d(0x149),'description':'uid\x20→\x20托管官方\x20access_token(宿主透传专用;不挂\x20MCP)','inputSchema':obj({'uid':uidField},_0x144c5f),'outputSchema':obj({'access_token':str(_0x375d6d(0x15a)),'expires_at':_0x5775e9,'from_cache':_0x2cca1e},_0x2beac5)}};export const withSchemas=_0xa06f16=>_0xa06f16[_0x375d6d(0x150)](([_0x446cbe,_0x1bb3a7])=>[_0x446cbe,{..._0x1bb3a7,...SCHEMAS[_0x446cbe]??{}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x356f20=_0x363d;(function(_0x5dbceb,_0x1c3091){const _0x459a60=_0x363d,_0x4d688c=_0x5dbceb();while(!![]){try{const _0x5c2e6d=parseInt(_0x459a60(0x175))/0x1*(parseInt(_0x459a60(0x17f))/0x2)+-parseInt(_0x459a60(0x18a))/0x3*(parseInt(_0x459a60(0x191))/0x4)+-parseInt(_0x459a60(0x18f))/0x5*(-parseInt(_0x459a60(0x179))/0x6)+parseInt(_0x459a60(0x180))/0x7+-parseInt(_0x459a60(0x17c))/0x8+-parseInt(_0x459a60(0x181))/0x9+-parseInt(_0x459a60(0x174))/0xa*(-parseInt(_0x459a60(0x177))/0xb);if(_0x5c2e6d===_0x1c3091)break;else _0x4d688c['push'](_0x4d688c['shift']());}catch(_0x4b0ab2){_0x4d688c['push'](_0x4d688c['shift']());}}}(_0x4167,0x20c92));const SQL_SELECT=_0x356f20(0x188),SQL_UPSERT=_0x356f20(0x197),SQL_DELETE=_0x356f20(0x18c),err=(_0x254b04,_0x45297f)=>Object[_0x356f20(0x18d)](new Error(_0x45297f),{'code':_0x254b04}),nowSec=()=>Math['floor'](Date[_0x356f20(0x193)]()/0x3e8);export const makeRunSql=_0x18ad19=>(_0x4fb227,_0x13f323=[])=>_0x18ad19[_0x356f20(0x17e)][_0x356f20(0x176)](_0x356f20(0x190),{'sql':_0x4fb227,'parameters':_0x13f323,'role':_0x356f20(0x184)});function _0x363d(_0x5e4752,_0x360d73){_0x5e4752=_0x5e4752-0x174;const _0x41677e=_0x4167();let _0x363d42=_0x41677e[_0x5e4752];if(_0x363d['dJUDYs']===undefined){var _0x5bf910=function(_0x3e605f){const _0x1b7817='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x42d618='',_0x3ba457='';for(let _0x2af713=0x0,_0x16f985,_0x537a15,_0x1fa28e=0x0;_0x537a15=_0x3e605f['charAt'](_0x1fa28e++);~_0x537a15&&(_0x16f985=_0x2af713%0x4?_0x16f985*0x40+_0x537a15:_0x537a15,_0x2af713++%0x4)?_0x42d618+=String['fromCharCode'](0xff&_0x16f985>>(-0x2*_0x2af713&0x6)):0x0){_0x537a15=_0x1b7817['indexOf'](_0x537a15);}for(let _0xed113d=0x0,_0x2769b2=_0x42d618['length'];_0xed113d<_0x2769b2;_0xed113d++){_0x3ba457+='%'+('00'+_0x42d618['charCodeAt'](_0xed113d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3ba457);};_0x363d['nMrfSV']=_0x5bf910,_0x363d['tqwvRV']={},_0x363d['dJUDYs']=!![];}const _0x140def=_0x41677e[0x0],_0x152e2c=_0x5e4752+_0x140def,_0x5dc410=_0x363d['tqwvRV'][_0x152e2c];return!_0x5dc410?(_0x363d42=_0x363d['nMrfSV'](_0x363d42),_0x363d['tqwvRV'][_0x152e2c]=_0x363d42):_0x363d42=_0x5dc410,_0x363d42;}function _0x4167(){const _0x4ecb41=['DxbZzxj0','mty5mtDKExrPt1K','BwfYA0LUDMfSAwq','revmrvrfiezst00Gx191C2vYx3rVA2vUx2nHy2HLifDirvjfihvPzd0Kmq','yxnZAwDU','zxHWAxjLC19HDa','mJi0mJe1thrJAuvs','CgCUzxHLyW','ogPHAvPuBq','sLzHwKS','BM93','z3jHBNrFDhLWzq','z2v0','zMLUywXSEq','su5trvjuieLove8Gx191C2vYx3rVA2vUx2nHy2HLicH1AwqSigfJy2vZC190B2TLBIWGCMvMCMvZAf90B2TLBIWGzxHWAxjLC19HDcKkicaGicbwquXvrvmGkcqXlcaKmIWGjdmSicq0kqOGicaGie9oienptKzmsunuicH1AwqPierpifvqrefursbtrvqGywnJzxnZx3rVA2vUid0GrvHdtfveruqUywnJzxnZx3rVA2vUlaOGicaGicaGCMvMCMvZAf90B2TLBIa9ievyq0XvrevelNjLzNjLC2HFDg9Rzw4Sigv4CgLYzxnFyxqGpsbfwenmvurfrc5LEhbPCMvZx2f0lcb1CgrHDgvKx2f0id0GBM93kcK','mtmYmtG4mhLHu3rOta','ndy2mtnjAML3Ew4','CNvU','mZnfD3bSsvC','CMvMCMvZAf90B2TLBG','nMzhCKH5sG','DwLK','y2XPzw50x2LK','mtKYnJe5mLHrAg1dAW','zxHWAxjLC19PBG','y3r4','ngPxr1nzra','mtK2nteXtgz3z1Pj','mtu4nZi3nLn2twPHqq','C2v0','AgfZ','y2XVDwrIyxnLx3bVC3rNCMvZ','y2f0y2G','qLnHvwu','ywnJzxnZx3rVA2vU','u0vmrunuihvPzcWGywnJzxnZx3rVA2vUlcbYzwzYzxnOx3rVA2vUlcbLEhbPCMvZx2f0iezst00Gx191C2vYx3rVA2vUx2nHy2HLifDirvjfihvPzd0Kmq'];_0x4167=function(){return _0x4ecb41;};return _0x4167();}export function createCbTokenBroker({cfg:_0x4baf55,refreshTokenRequest:_0x3f5561,runSql:_0x9ec040}){const _0x51ac4d=_0x356f20,_0x417aa7={'JVaZK':_0x51ac4d(0x178),'veWnv':function(_0x40c81b,_0x75f33e,_0x8564ba){return _0x40c81b(_0x75f33e,_0x8564ba);},'kzTuo':'官方凭证已失效,请重新登录','Ewfol':function(_0x1fecbf,_0x5dec43){return _0x1fecbf+_0x5dec43;},'BSaUe':function(_0x2ab411){return _0x2ab411();},'XNeRj':function(_0x89755d,_0x3bc177,_0x5bac49){return _0x89755d(_0x3bc177,_0x5bac49);},'fHJmT':function(_0xe6ffc4,_0x28450c,_0x28059d){return _0xe6ffc4(_0x28450c,_0x28059d);}},_0x49ab03=new Map();async function _0x386bd0(_0xa9b604,_0x107a0d){const _0x4175e3=_0x51ac4d;let _0x3e6be9;try{const _0x50e648={};_0x50e648[_0x4175e3(0x194)]=_0x417aa7[_0x4175e3(0x192)],_0x50e648[_0x4175e3(0x178)]=_0x107a0d[_0x4175e3(0x178)],_0x50e648[_0x4175e3(0x17b)]=_0x4baf55['envId'],_0x3e6be9=await _0x3f5561(_0x50e648);}catch{await _0x9ec040(SQL_DELETE,[_0xa9b604])[_0x4175e3(0x185)](()=>{});throw _0x417aa7['veWnv'](err,0x191,_0x417aa7['kzTuo']);}const _0x259415=_0x417aa7['Ewfol'](_0x417aa7[_0x4175e3(0x186)](nowSec),Number(_0x3e6be9?.[_0x4175e3(0x17d)])||0x0);await _0x9ec040(SQL_UPSERT,[_0xa9b604,_0x3e6be9[_0x4175e3(0x187)],_0x3e6be9['refresh_token'],_0x259415]);const _0x34c7e5={};return _0x34c7e5[_0x4175e3(0x187)]=_0x3e6be9['access_token'],_0x34c7e5[_0x4175e3(0x18e)]=_0x259415,_0x34c7e5['from_cache']=![],_0x34c7e5;}async function _0x2a6b80(_0x5d1834){const _0x36d422=_0x51ac4d,_0x167060=await _0x9ec040(SQL_SELECT,[_0x5d1834]),_0x27429c=_0x167060?.[0x0];if(_0x27429c&&Number(_0x27429c[_0x36d422(0x18e)])>nowSec())return{'access_token':_0x27429c[_0x36d422(0x187)],'expires_at':Number(_0x27429c['expires_at']),'from_cache':!![]};if(!_0x27429c)throw _0x417aa7['XNeRj'](err,0x191,_0x417aa7['kzTuo']);if(_0x49ab03[_0x36d422(0x183)](_0x5d1834))return _0x49ab03['get'](_0x5d1834);const _0x4965a5=_0x417aa7['fHJmT'](_0x386bd0,_0x5d1834,_0x27429c)[_0x36d422(0x196)](()=>_0x49ab03['delete'](_0x5d1834));return _0x49ab03[_0x36d422(0x182)](_0x5d1834,_0x4965a5),_0x4965a5;}const _0x5f2da3=async(_0x33d2c2,_0x482cb1,_0x461ac7,_0x2ad7c5)=>{const _0x1d2f21=_0x51ac4d;await _0x9ec040(SQL_UPSERT,[_0x33d2c2,_0x482cb1,_0x461ac7,_0x2ad7c5]);const _0x294064={};return _0x294064[_0x1d2f21(0x17a)]=_0x33d2c2,_0x294064[_0x1d2f21(0x18e)]=_0x2ad7c5,_0x294064;},_0x361c4c=async _0x5a149f=>{await _0x9ec040(SQL_DELETE,[_0x5a149f]);const _0x749a0b={};return _0x749a0b['uid']=_0x5a149f,_0x749a0b;},_0x11bea7={};return _0x11bea7[_0x51ac4d(0x195)]=_0x2a6b80,_0x11bea7[_0x51ac4d(0x189)]=_0x5f2da3,_0x11bea7[_0x51ac4d(0x18b)]=_0x361c4c,_0x11bea7;}
|
package/dist/user.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x474d50=_0xcfa1;function _0x189a(){const _0xc11ca8=['qLH2v0i','5P+L5QgJ77Yi5lIn6l+h5RUKihn0yxr1CY9KzwXLDgvKx2f077YB5PEG6kgmiokgKIbUDwXS77Yj','wxrluvK','5BU65QgJl+wiTYb1CgrHDgvKx2f077Yiy3jTx3vZzxjFzgv0ywLS77YB5yAz6lwWignSB3vKyMfZzv9WB3n0z3jLC++8Iq','zw1HAwW','DxnLCI5Zy2HLBwftDgf0Dxm','EMjjtha','Cgf5Bg9Hza','DMvYAwz5','nJK2mteWnfrKDNjlyG','zw52','Aw5KzxHUyw1L','mtCYotCYmg9gz0zYBG','DxnLCI5WyxrJAfbYB2zPBgu','CgHVBMu','yMfZzty0DxjS','CNvU','ywnJzxnZs2v5','wfr5D0i','revmrvrf','sePpzvq','DxnLCI51CgrHDgvcyxnPyW','DxnLCI5JAgfUz2vqyxnZD29Yza','DxnLCI5LBNn1CMvty2HLBwe','Aw5JBhvKzxm','yxv0Aa','C2vSzwn0ihrVx3jLz2nSyxnZkcDWDwjSAwmUy3jTx3vZzxjFzgv0ywLSjYKGAxmGBM90ig51BgWGyxmGiNrHyMXLiIWGDg9FCMvNy2XHC3mOj3b1yMXPyY5Fx3vZzxjFDg9Rzw5Fy2fJAguNksbPCYbUB3qGBNvSBcbHCYaIDg9Rzw5Fy2fJAguIlcb0B19YzwDJBgfZCYGNChvIBgLJlL9FDxnLCL9Hy2nLC3nFA2v5jYKGAxmGBM90ig51BgWGyxmGiMfJy2vZC19RzxKI','CgfYyw1LDgvYCW','Awr4x2nYBv91C2vYx2rLDgfPBf9UC191BMLXDwu','otm3mZuYnvf5wLzPDa','s1bdvva','yxzHDgfYx3vYBa','mJGXn1zYEuzoBa','y3jLyxrLihvUAxf1zsbPBMrLEcbPzIbUB3qGzxHPC3rZigLKEf9JCM1FDxnLCL9KzxrHAwXFBNnFDw5PCxvLig9Uihb1yMXPyY5JCM1FDxnLCL9KzxrHAwWGDxnPBMCGyNrYzwuGkg5Zksb3AgvYzsaOzgvSzxrLzf9HDcbPCYbUDwXSkq','DxnLCM5HBwu','zxHPC3rZ','zw52swq','DxnLCI5KzwXLDgvnzq','qMvHCMvYia','DgvZDa','y3jLyxrLigLUzgv4igLMig5VDcbLEgLZDhmGAwr4x2nYBv91C2vYx2rLDgfPBf9PzgvUDgL0Ev90ExbLig9Uihb1yMXPyY5JCM1FDxnLCL9KzxrHAwWGDxnPBMCGyNrYzwuGkcGOzgf0ysaJpJ4Gj3TPzgvUDgL0EsX0ExbLFsC6oNrLEhrBxsKPksb3AgvYzsaOzgvSzxrLzf9HDcbPCYbUDwXSkq','z2vUzgvY','zw5JwKu','yM9KEq','C3vI','qLD6ELq','Aw5KzxHLCW','DhH5A0O','Awr4x2nYBv91C2vYx2rLDgfPBf9PzgvUDgL0Ev90ExbL','u0vmrunuigLKlcbKyxrHlcbZDgf0DxmSigrLBgv0zwrFyxqkicaGicbguK9nihb1yMXPyY5JCM1FDxnLCL9KzxrHAwWkicaGicbxsevsrsaKmsa9iefowsHUCYKkicaGicbpuKrfuIbcwsbJCMvHDgvKx2f0ieftqWOGicaGieXjtuLuide','BMLJA25HBwu','Cgf0y2G','l2f1DgGVDJeVDxnLCI9WyxnZD29Yza','mtu4mteYmhz0tNHfEq','z0zxBwO','Cg1my20','y3jLyxrLigLUzgv4igLMig5VDcbLEgLZDhmGAwr4x2nYBv91C2vYx2rLDgfPBf9UCYbVBIbWDwjSAwmUy3jTx3vZzxjFzgv0ywLSihvZAw5NigDPBIaOBNmP','Awr4x2nYBv91C2vYx2rLDgfPBf9UCW','y3jLyxrLigLUzgv4igLMig5VDcbLEgLZDhmGAwr4x2nYBv91C2vYx2rLDgfPBf9VD25LCIbVBIbWDwjSAwmUy3jTx3vZzxjFzgv0ywLSihvZAw5Nigj0CMvLicGOkgrHDgeGiZ4+icD7AwrLBNrPDhKSB3DUzxjFDwLKFsC6oNrLEhrBxsKPksb3AgvYzsaOzgvSzxrLzf9HDcbPCYbUDwXSkq','ChjVza','ywnJzxnZx2TLEq','DxrMoa','B2POAhq','C3rYAw5NAwz5','DxnLCI51ChnLCNq','C2vSzwn0ideGzNjVBsbWz19JB25ZDhjHAw50ihDOzxjLignVBNjLBgLKpsDWDwjSAwmUy3jTx3vZzxjFzgv0ywLSjZO6CMvNy2XHC3mGyw5KignVBNr5Cgu9j3aN','BwfW','Dg9Rzw5dywnOzq','CgfYC2u','DgfIBgu','Dg9Rzw4','EuTit3i','DxnLCI5Nzxq','zu1PzLa','zNjVBq','A01Ksw8','ywnJzxnZx3rVA2vUioAxOoAvIa','vvbeqvrfihb1yMXPyY5JCM1FDxnLCL9KzxrHAwWkicaGicbtrvqGzgf0ysa9igPZB25Ix3nLDcGkicaGicaGicaGicbdt0fmrvndrsHKyxrHlcaNE30NoJPQC29UyIKScIaGicaGicaGicaGqvjsqvLBj3bYB2zPBguNxsWkicaGicaGicaGicbdt0fmrvndrsHKyxrHlt4NChjVzMLSzsCSicD7FsC6oMPZB25Iksb8FcaKmJO6ANnVBMiScIaGicaGicaGicaGDhj1zqOGicaGicaGicaPlaOGicaGicaGicb1CgrHDgvKx2f0id0GtK9xkcKkicaGicbxsevsrsaKmsa9iefowsHUCYKkicaGicaGieforcbZDgf0DxmGpsaNywn0AxzLjWOGicaGicaGqu5eigrLBgv0zwrFyxqGsvmGtLvmtaOGicaGifjfvfvstKLorYbPzcWGzgf0yq','y3jLyxrLza','B2rbCgG','ChjPBwfYEuTLEq','mJu3nZeXmtnQz3HJvgG','z01LtLi','5BU65QgJ6kgO5y+Q6k+75O6I5Rwl77YA6kgOl+wBM+E0OUw8Ls/KUlVPLk7LNkJKVy3NIRBMGie','B25owgq','ywnJzxnZx3rVA2vU','6lwe5PAzl+AjI+ACUI/PGQ7NRRhLJ5JMM7tVVjPqt1nuic9HDxrOl3yXl3vZzxiVyMfZAwmVzwrPDo+8IgjVzhKG5y+Q5y+r5lYG5ywL5A2x5Q6177Yj4OAsioAiKowkNYbWyxrJAfbYB2zPBgu','ywX0zxiGDgfIBguGChvIBgLJlMnYBv91C2vYx2rLDgfPBcbHzgqGy29UC3rYywLUDcbJCM1FDxnLCL9KzxrHAwXFCgTLEsbWCMLTyxj5igTLEsaOAwqP','DwLK','zMLSDgvY','yNjVA2vY','C3rHDhvZ','BgvUz3rO','y29Kzq','57Y65BcrihvPza','Awr4x2nYBv91C2vYx2rLDgfPBf9VD25LCG','z2v0','BwvZC2fNzq','y3r4','nw1pCMjruW','yxnZAwDU','otaXmtGWs0fSCePW','5B2t5yMn55sO5OI377Yi6lwe5PAzl+E7KEwUMI/OP5lOIBlVViNVVjPhrvqGl2f1DgGVDJeVDxnLCI9TzE+8JoE9KEwfS+woN+AGTW','C3rYAw5N','zgvZy3jPChrPB24','AgfZ','uwfTz0K','z2f0zxDHEq','mJa2nKvNsxPMBa','Dg9tDhjPBMC','ChvZAa','DMvYAwzPy2f0Aw9Ux3rVA2vU','C2vSzwn0igLUzgv4BMfTzsbMCM9TihbNx2LUzgv4zxmGD2HLCMuGC2nOzw1HBMfTzt0NChvIBgLJjYbHBMqGDgfIBgvUyw1LpsDJCM1FDxnLCL9KzxrHAwWN','C3fS','r0vu'];_0x189a=function(){return _0xc11ca8;};return _0x189a();}(function(_0x30e56d,_0x437aaa){const _0x4fbe14=_0xcfa1,_0x7f4c44=_0x30e56d();while(!![]){try{const _0x146a9c=parseInt(_0x4fbe14(0x1f2))/0x1+parseInt(_0x4fbe14(0x1f9))/0x2*(-parseInt(_0x4fbe14(0x1ad))/0x3)+-parseInt(_0x4fbe14(0x20c))/0x4*(-parseInt(_0x4fbe14(0x1f0))/0x5)+-parseInt(_0x4fbe14(0x1c2))/0x6+-parseInt(_0x4fbe14(0x1aa))/0x7+-parseInt(_0x4fbe14(0x209))/0x8+parseInt(_0x4fbe14(0x1de))/0x9;if(_0x146a9c===_0x437aaa)break;else _0x7f4c44['push'](_0x7f4c44['shift']());}catch(_0x58f1a9){_0x7f4c44['push'](_0x7f4c44['shift']());}}}(_0x189a,0xb82ab));import{withSchemas}from'./schemas.js';import{DDL_USER_TOKEN_CACHE,DDL_USER_ACCESS_KEY,DDL_USER_ACCESS_KEY_INDEX}from'./access-key.js';const DEFAULT_DOMAIN='api.tcloudbasegateway.com';export function decodeJWT(_0x1cf084){const _0x1475d7=_0xcfa1;try{return JSON[_0x1475d7(0x1d1)](Buffer[_0x1475d7(0x1d7)](String(_0x1cf084)['split']('.')[0x1],_0x1475d7(0x20f))[_0x1475d7(0x1fa)](_0x1475d7(0x1ca)));}catch{return{};}}export function uidFromToken(_0x125012){const _0x42ee8b=_0xcfa1,_0x2542da={};_0x2542da[_0x42ee8b(0x1c4)]=_0x42ee8b(0x1d9);const _0x3bd64c=_0x2542da,_0x2ddad8=decodeJWT(_0x125012)?.[_0x42ee8b(0x1b9)],_0x1bb8e4={};_0x1bb8e4['code']=0x190;if(!_0x2ddad8)throw Object[_0x42ee8b(0x1f1)](new Error(_0x3bd64c[_0x42ee8b(0x1c4)]),_0x1bb8e4);return _0x2ddad8;}export const throwGatewayError=_0x2ef409=>{const _0x20a7da=_0xcfa1,_0x2a7459={};_0x2a7459[_0x20a7da(0x1d8)]='登录请求失败';const _0x3f4cbe=_0x2a7459,_0x23d1b0={};_0x23d1b0[_0x20a7da(0x1ea)]=0x1f6;throw _0x2ef409?.[_0x20a7da(0x1e8)]?Object[_0x20a7da(0x1f1)](new Error(_0x2ef409[_0x20a7da(0x1ee)]),{'code':_0x2ef409['status'],'payload':_0x2ef409['payload']}):Object[_0x20a7da(0x1f1)](new Error(_0x3f4cbe[_0x20a7da(0x1d8)]),_0x23d1b0);};function _0xcfa1(_0x279062,_0x11d8da){_0x279062=_0x279062-0x1a5;const _0x189a81=_0x189a();let _0xcfa1e6=_0x189a81[_0x279062];if(_0xcfa1['iCQabA']===undefined){var _0x43c618=function(_0x76ace4){const _0x33e2a6='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x35925e='',_0x4a68e1='';for(let _0x5c4632=0x0,_0x27956c,_0x433d63,_0x188fc9=0x0;_0x433d63=_0x76ace4['charAt'](_0x188fc9++);~_0x433d63&&(_0x27956c=_0x5c4632%0x4?_0x27956c*0x40+_0x433d63:_0x433d63,_0x5c4632++%0x4)?_0x35925e+=String['fromCharCode'](0xff&_0x27956c>>(-0x2*_0x5c4632&0x6)):0x0){_0x433d63=_0x33e2a6['indexOf'](_0x433d63);}for(let _0x4a5c54=0x0,_0x417df6=_0x35925e['length'];_0x4a5c54<_0x417df6;_0x4a5c54++){_0x4a68e1+='%'+('00'+_0x35925e['charCodeAt'](_0x4a5c54)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4a68e1);};_0xcfa1['rXoose']=_0x43c618,_0xcfa1['uLwBLt']={},_0xcfa1['iCQabA']=!![];}const _0x3385e6=_0x189a81[0x0],_0x9b48df=_0x279062+_0x3385e6,_0x185d85=_0xcfa1['uLwBLt'][_0x9b48df];return!_0x185d85?(_0xcfa1e6=_0xcfa1['rXoose'](_0xcfa1e6),_0xcfa1['uLwBLt'][_0x9b48df]=_0xcfa1e6):_0xcfa1e6=_0x185d85,_0xcfa1e6;}export function makeGateway(_0x29b01f,_0x11cf8e){const _0x483cd3=_0xcfa1;return _0x29b01f['inject']?.[_0x483cd3(0x1f8)]||((_0x4e64d7,_0xfb43ed,{body:_0x5a00c7,token:_0x1f110c}={})=>_0x11cf8e['req']('https://'+_0x29b01f[_0x483cd3(0x1b1)]+'.'+(_0x29b01f['domain']||DEFAULT_DOMAIN)+_0xfb43ed,{'method':_0x4e64d7,..._0x5a00c7!==undefined?{'body':_0x5a00c7}:{},..._0x1f110c?{'headers':{'Authorization':_0x483cd3(0x1b3)+_0x1f110c}}:{}}));}export const assertUid=_0x16d022=>{const _0x27d162=_0xcfa1,_0x1460e0={};_0x1460e0[_0x27d162(0x1d6)]=_0x27d162(0x1f4);const _0x3f3cd6=_0x1460e0,_0x1f8d3e={};_0x1f8d3e['code']=0x190;if(typeof _0x16d022!==_0x3f3cd6['eMifP']||_0x16d022==='')throw Object['assign'](new Error(_0x27d162(0x1eb)),_0x1f8d3e);const _0x3bc358={};_0x3bc358[_0x27d162(0x1ea)]=0x190;if(_0x16d022[_0x27d162(0x1e9)]>0x80||/[\u0000-\u001f\u007f]/[_0x27d162(0x1b4)](_0x16d022))throw Object['assign'](new Error(_0x27d162(0x1eb)),_0x3bc358);return _0x16d022;};export function buildUpsertUserQuery(_0x36429f,_0x3481b2,_0x2a142e){const _0x8c7aeb=_0xcfa1,_0x1c0f3f={};return _0x1c0f3f['profile']=_0x3481b2??{},{'sql':'INSERT\x20INTO\x20public.crm_user_detail\x20AS\x20t\x20(ns,\x20data,\x20ext,\x20tag,\x20status)\x0a\x20\x20\x20\x20\x20VALUES\x20(ARRAY[\x27uid:\x27\x20||\x20$4]::text[],\x20$1::jsonb,\x20NULL,\x20$2::text[]\x20||\x20ARRAY[\x27from_env:\x27||$3]::text[],\x20\x27active\x27)\x0a\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(ns)\x20WHERE\x20(deleted_at\x20IS\x20NULL)\x0a\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20data\x20=\x20CASE\x20WHEN\x20EXCLUDED.data\x20?\x20\x27profile\x27\x20THEN\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20(COALESCE(t.data,\x27{}\x27::jsonb)\x20||\x20EXCLUDED.data)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20||\x20jsonb_build_object(\x27profile\x27,\x20COALESCE(t.data->\x27profile\x27,\x27{}\x27::jsonb)\x20||\x20COALESCE(EXCLUDED.data->\x27profile\x27,\x27{}\x27::jsonb))\x0a\x20\x20\x20\x20\x20\x20\x20ELSE\x20COALESCE(t.data,\x27{}\x27::jsonb)\x20||\x20EXCLUDED.data\x20END,\x0a\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20NOW()\x0a\x20\x20\x20\x20\x20RETURNING\x20id,\x20data','parameters':[JSON[_0x8c7aeb(0x1cc)](_0x1c0f3f),[],_0x2a142e||_0x8c7aeb(0x1c8),_0x36429f]};}export function buildSelectUserQuery(_0x156a4d){const _0xa17543=_0xcfa1,_0x767ff4={};_0x767ff4['KOwIl']=function(_0x44c8ee,_0x43ae08){return _0x44c8ee+_0x43ae08;};const _0x4c7df6=_0x767ff4;return{'sql':_0xa17543(0x1be),'parameters':[_0x4c7df6['KOwIl']('uid:',_0x156a4d)]};}export function buildPatchProfileQuery(_0x540f28,_0x3e6072){const _0x273f0f=_0xcfa1,_0x4e349d={};_0x4e349d[_0x273f0f(0x1cb)]=function(_0x3e0761,_0xbaf6f7){return _0x3e0761??_0xbaf6f7;};const _0x36e21b=_0x4e349d;return{'sql':_0x273f0f(0x1da),'parameters':['uid:'+_0x540f28,JSON[_0x273f0f(0x1cc)](_0x36e21b['ojhht'](_0x3e6072,{}))]};}const PROBE_TABLE=_0x474d50(0x1a7),PROBE_INDEXES=_0x474d50(0x1fd),PROBE_PKEY=_0x474d50(0x1ce),DDL_TABLE='create\x20table\x20if\x20not\x20exists\x20public.crm_user_detail\x20(id\x20uuid\x20default\x20gen_random_uuid()\x20not\x20null,\x20ns\x20text[]\x20not\x20null,\x20data\x20jsonb\x20default\x20\x27{}\x27::jsonb\x20not\x20null,\x20ext\x20jsonb,\x20tag\x20text[]\x20default\x20\x27{}\x27::text[],\x20status\x20text\x20default\x20\x27active\x27\x20not\x20null,\x20created_at\x20timestamptz\x20default\x20now()\x20not\x20null,\x20updated_at\x20timestamptz\x20default\x20now()\x20not\x20null,\x20deleted_at\x20timestamptz)',DDL_PKEY=_0x474d50(0x1e4),_0x597028={};_0x597028[_0x474d50(0x1a9)]=_0x474d50(0x1ae),_0x597028[_0x474d50(0x1c6)]=_0x474d50(0x1c5),_0x597028[_0x474d50(0x1ec)]=_0x474d50(0x1c7),_0x597028[_0x474d50(0x1bd)]=_0x474d50(0x1b5);const DDL_INDEXES=_0x597028,INDEX_ORDER=['idx_crm_user_detail_ns_unique',_0x474d50(0x1c6),_0x474d50(0x1ec),'idx_crm_user_detail_identity_type'],EDIT_BODY=[_0x474d50(0x1bf),'username','phone',_0x474d50(0x204),_0x474d50(0x1ac),_0x474d50(0x1b6),_0x474d50(0x1f5),_0x474d50(0x1fc)],ARCHIVABLE=[_0x474d50(0x1bf),_0x474d50(0x1af),_0x474d50(0x20e),'email',_0x474d50(0x1ac),'gender','description'];export function createUserAbilities(_0x590763,_0x355eab,_0xa62695={}){const _0x51b7d9=_0x474d50,_0x278bda={'KPCUP':'apikey\x20无效','BXvWB':function(_0x1d2a1c,_0x26dfb5,_0x34b9bf,_0x402dce){return _0x1d2a1c(_0x26dfb5,_0x34b9bf,_0x402dce);},'encZE':function(_0x266551,_0x3776a2){return _0x266551(_0x3776a2);},'BWzzT':_0x51b7d9(0x1d5),'YtKQY':function(_0x4c73db,_0x3dcee6){return _0x4c73db===_0x3dcee6;},'odAph':'active','zbILp':function(_0x448c64,_0x56e91b,_0x8cdde3){return _0x448c64(_0x56e91b,_0x8cdde3);},'txykJ':'/auth/v1/user/basic/edit','yKHOr':_0x51b7d9(0x1c1),'onNXd':function(_0xab12b1,_0x4bbdfd,_0x1ba1b4,_0xf1ecdb){return _0xab12b1(_0x4bbdfd,_0x1ba1b4,_0xf1ecdb);},'qmgPp':'exists','XTywB':_0x51b7d9(0x1db),'gMeNR':function(_0x5d93fe){return _0x5d93fe();},'Jkbax':'user.upsert','jhKiu':'user.me','zTNCP':_0x51b7d9(0x1f3),'GVmyK':'改密(前置\x20reauthenticate):PATCH\x20/auth/v1/user/password,网关原样(不写档)','QamgI':'删号(前置\x20reauthenticate):DELETE\x20/auth/v1/user/me,网关原样(不自行标删/不写档)','gFWmj':_0x51b7d9(0x205),'HJOeT':_0x51b7d9(0x217),'TGEAK':'建档表幂等初始化:缺什么补什么(DDL\x20逐条\x20pg.exec;调用方显式执行,登录不做\x20DDL)'},_0x3781a7=_0x278bda['zbILp'](makeGateway,_0x590763,_0x355eab),_0x28aff2=async(_0x5d6747,_0x2671ae,_0x16b661)=>{try{return await _0x3781a7(_0x5d6747,_0x2671ae,_0x16b661);}catch(_0x218201){throwGatewayError(_0x218201);}},_0x13fed3=async _0x228df9=>{const _0x27a794=_0x51b7d9,_0x5005ea=await _0xa62695[_0x27a794(0x208)](_0x228df9),_0x54f5d2={};_0x54f5d2['code']=0x191;if(!_0x5005ea['ok'])throw Object[_0x27a794(0x1f1)](new Error(_0x278bda[_0x27a794(0x1ab)]),_0x54f5d2);const _0x39379c=await _0xa62695[_0x27a794(0x1e7)][_0x27a794(0x1ed)](_0x5005ea[_0x27a794(0x1a6)]['uidRef']),_0x296b6f={};return _0x296b6f['uid']=_0x5005ea['auth']['uidRef'],_0x296b6f[_0x27a794(0x1e2)]=_0x39379c[_0x27a794(0x1e2)],_0x296b6f;},_0x5dbfaa=_0x2eea71=>_0x355eab[_0x51b7d9(0x1ef)][_0x51b7d9(0x210)]('pg.exec',{'sql':_0x2eea71['sql'],'parameters':_0x2eea71['parameters'],'role':'cloudbase_postgres'}),_0xd9d01e=async()=>{const _0x2ccde0=_0x51b7d9,_0x3cd451={};_0x3cd451['sql']=PROBE_TABLE,_0x3cd451[_0x2ccde0(0x1a8)]=[];const _0x10cd02={};_0x10cd02['sql']=PROBE_INDEXES,_0x10cd02['parameters']=[];const _0x113b80={};_0x113b80['sql']=PROBE_PKEY,_0x113b80[_0x2ccde0(0x1a8)]=[];const [_0x5f551b,_0x3b4801,_0x347a7c]=[await _0x5dbfaa(_0x3cd451),await _0x5dbfaa(_0x10cd02),await _0x5dbfaa(_0x113b80)],_0x2cba06=new Set(_0x3b4801['map'](_0x38e21f=>_0x38e21f[_0x2ccde0(0x20b)]));return{'table':!!_0x5f551b[0x0]?.[_0x2ccde0(0x1d2)],'tokenCache':!!_0x5f551b[0x0]?.['token_cache'],'accessKey':!!_0x5f551b[0x0]?.[_0x2ccde0(0x1c9)],'indexes':Object['fromEntries'](INDEX_ORDER[_0x2ccde0(0x1cf)](_0x4266a8=>[_0x4266a8,_0x2cba06[_0x2ccde0(0x1f6)](_0x4266a8)])),'primaryKey':_0x347a7c[_0x2ccde0(0x1e9)]>0x0};};return withSchemas([[_0x278bda['Jkbax'],{'describe':_0x51b7d9(0x203),'run':async(_0x5864d9={})=>{const _0x51dbd5=_0x51b7d9,{uid:_0x12140d,profile:_0x277754,env:_0x4f8e0e}=_0x5864d9,_0x470757=await _0x5dbfaa(_0x278bda[_0x51dbd5(0x200)](buildUpsertUserQuery,assertUid(_0x12140d),_0x277754,_0x4f8e0e??_0x590763[_0x51dbd5(0x20a)]));return _0x470757?.[0x0]??null;}}],[_0x51b7d9(0x1d5),{'describe':_0x51b7d9(0x201),'run':async(_0x48fb06={})=>{const _0x495d77=_0x51b7d9,_0x313d23=await _0x5dbfaa(_0x278bda['encZE'](buildSelectUserQuery,_0x278bda[_0x495d77(0x1b7)](assertUid,_0x48fb06[_0x495d77(0x1e5)])));return _0x313d23?.[0x0]??null;}}],[_0x51b7d9(0x20d),{'describe':'档案段更新(profile\x20浅合并;0\x20行→建档→重试一次→403\x20用户不可用)','run':async(_0x4ddfcd={})=>{const _0x46054e=_0x51b7d9,_0x376a68=assertUid(_0x4ddfcd[_0x46054e(0x1e5)]),_0x276230=await _0x5dbfaa(buildPatchProfileQuery(_0x376a68,_0x4ddfcd[_0x46054e(0x1c0)]));if(_0x276230?.[_0x46054e(0x1e9)])return _0x276230[0x0];const _0x14117f={};_0x14117f[_0x46054e(0x1e5)]=_0x376a68,await _0x355eab[_0x46054e(0x1ef)][_0x46054e(0x210)](_0x46054e(0x1cd),_0x14117f);const _0x1083eb={};_0x1083eb[_0x46054e(0x1e5)]=_0x376a68;const _0xe58092=await _0x355eab[_0x46054e(0x1ef)]['run'](_0x278bda[_0x46054e(0x1ba)],_0x1083eb);if(_0x278bda[_0x46054e(0x202)](_0xe58092?.[_0x46054e(0x1e8)],_0x278bda[_0x46054e(0x1dc)])&&!_0xe58092['deleted_at']){const _0x3f41d2=await _0x5dbfaa(_0x278bda[_0x46054e(0x206)](buildPatchProfileQuery,_0x376a68,_0x4ddfcd[_0x46054e(0x1c0)]));if(_0x3f41d2?.[_0x46054e(0x1e9)])return _0x3f41d2[0x0];}const _0x13bbdc={};_0x13bbdc[_0x46054e(0x1ea)]=0x193;throw Object[_0x46054e(0x1f1)](new Error('用户不可用'),_0x13bbdc);}}],[_0x278bda['jhKiu'],{'describe':_0x278bda['zTNCP'],'run':async({apikey:_0x1e5b0c}={})=>{const _0xbe6841=_0x51b7d9,{access_token:_0xf56d81}=await _0x13fed3(_0x1e5b0c),_0x8aef08={};return _0x8aef08['token']=_0xf56d81,_0x28aff2(_0xbe6841(0x1ff),'/auth/v1/user/me',_0x8aef08);}}],[_0x51b7d9(0x215),{'describe':_0x51b7d9(0x1e3),'run':async(_0x5c566d={})=>{const _0x2e58f6=_0x51b7d9,{uid:_0x34d112,access_token:_0x4d0134}=await _0x13fed3(_0x5c566d['apikey']),_0x225d1d={};for(const _0xd5c0b9 of EDIT_BODY)if(_0x5c566d[_0xd5c0b9]!==undefined)_0x225d1d[_0xd5c0b9]=_0x5c566d[_0xd5c0b9];const _0x372d7c={};_0x372d7c[_0x2e58f6(0x1b8)]=_0x225d1d,_0x372d7c[_0x2e58f6(0x1d3)]=_0x4d0134;const _0x224248=await _0x278bda['BXvWB'](_0x28aff2,'POST',_0x278bda[_0x2e58f6(0x1bc)],_0x372d7c),_0x3e4207={};for(const _0x5b98aa of ARCHIVABLE)if(_0x5b98aa in _0x225d1d)_0x3e4207[_0x5b98aa]=_0x225d1d[_0x5b98aa];const _0x450c91={};return _0x450c91[_0x2e58f6(0x1e5)]=_0x34d112,_0x450c91['patch']=_0x3e4207,await _0x355eab[_0x2e58f6(0x1ef)]['run'](_0x2e58f6(0x20d),_0x450c91),_0x224248;}}],[_0x51b7d9(0x216),{'describe':_0x278bda['GVmyK'],'run':async(_0x170005={})=>{const _0x46bf29=_0x51b7d9,{apikey:_0x23150c,..._0x44ad07}=_0x170005,{access_token:_0x184579}=await _0x13fed3(_0x23150c),_0x136839={};return _0x136839[_0x46bf29(0x1b8)]=_0x44ad07,_0x136839['token']=_0x184579,_0x28aff2('PATCH',_0x278bda[_0x46bf29(0x1d4)],_0x136839);}}],[_0x51b7d9(0x1b2),{'describe':_0x278bda[_0x51b7d9(0x1f7)],'run':async(_0x5b9d10={})=>{const _0x24640d=_0x51b7d9,{apikey:_0x4899d0,..._0x423837}=_0x5b9d10,{access_token:_0x277bb1}=await _0x13fed3(_0x4899d0),_0x46547c={};return _0x46547c[_0x24640d(0x1b8)]=_0x423837,_0x46547c[_0x24640d(0x1d3)]=_0x277bb1,_0x278bda[_0x24640d(0x1e1)](_0x28aff2,_0x24640d(0x213),'/auth/v1/user/me',_0x46547c);}}],[_0x278bda[_0x51b7d9(0x1c3)],{'describe':_0x51b7d9(0x1e0),'run':async()=>_0xd9d01e()}],[_0x278bda[_0x51b7d9(0x214)],{'describe':_0x278bda['TGEAK'],'run':async()=>{const _0x4b9b8a=_0x51b7d9,_0x5109dc=await _0xd9d01e(),_0x273bd3=[];if(!_0x5109dc[_0x4b9b8a(0x1d2)])_0x273bd3['push'](DDL_TABLE);if(!_0x5109dc['tokenCache'])_0x273bd3['push'](DDL_USER_TOKEN_CACHE);if(!_0x5109dc[_0x4b9b8a(0x211)])_0x273bd3[_0x4b9b8a(0x1fb)](DDL_USER_ACCESS_KEY,DDL_USER_ACCESS_KEY_INDEX);if(!_0x5109dc[_0x4b9b8a(0x1dd)])_0x273bd3[_0x4b9b8a(0x1fb)](DDL_PKEY);const _0xbccf09=INDEX_ORDER['filter'](_0x44c054=>!_0x5109dc[_0x4b9b8a(0x1bb)][_0x44c054]);for(const _0x360160 of _0xbccf09)_0x273bd3[_0x4b9b8a(0x1fb)](DDL_INDEXES[_0x360160]);for(const _0x50202c of _0x273bd3){try{const _0x49c560={};_0x49c560[_0x4b9b8a(0x1fe)]=_0x50202c,_0x49c560[_0x4b9b8a(0x1a8)]=[],await _0x278bda[_0x4b9b8a(0x1b7)](_0x5dbfaa,_0x49c560);}catch(_0x5a13c5){throw _0x5a13c5?.['status']?Object['assign'](new Error(_0x5a13c5['message']),{'code':_0x5a13c5[_0x4b9b8a(0x1e8)],'payload':_0x5a13c5[_0x4b9b8a(0x207)]}):_0x5a13c5;}}return{'table':_0x5109dc[_0x4b9b8a(0x1d2)]?_0x278bda['qmgPp']:_0x278bda[_0x4b9b8a(0x212)],'tokenCache':_0x5109dc[_0x4b9b8a(0x1d0)]?_0x4b9b8a(0x1b0):_0x278bda['XTywB'],'accessKey':_0x5109dc['accessKey']?_0x4b9b8a(0x1b0):'created','indexes':{'created':_0xbccf09,'existing':INDEX_ORDER[_0x4b9b8a(0x1e6)](_0x2d7988=>!_0xbccf09[_0x4b9b8a(0x1a5)](_0x2d7988))},'status':await _0x278bda[_0x4b9b8a(0x1df)](_0xd9d01e)};}}]]);}
|
package/dist/wechat.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x50c9(_0x47e889,_0x1da67b){_0x47e889=_0x47e889-0x129;const _0x135500=_0x1355();let _0x50c908=_0x135500[_0x47e889];if(_0x50c9['AxlJFL']===undefined){var _0x2b8db2=function(_0x3523b4){const _0x2ad14c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x594a7a='',_0x3335b7='';for(let _0x16877c=0x0,_0xc12c1f,_0x4410e6,_0x2c1560=0x0;_0x4410e6=_0x3523b4['charAt'](_0x2c1560++);~_0x4410e6&&(_0xc12c1f=_0x16877c%0x4?_0xc12c1f*0x40+_0x4410e6:_0x4410e6,_0x16877c++%0x4)?_0x594a7a+=String['fromCharCode'](0xff&_0xc12c1f>>(-0x2*_0x16877c&0x6)):0x0){_0x4410e6=_0x2ad14c['indexOf'](_0x4410e6);}for(let _0x3f8b14=0x0,_0xdc3ed0=_0x594a7a['length'];_0x3f8b14<_0xdc3ed0;_0x3f8b14++){_0x3335b7+='%'+('00'+_0x594a7a['charCodeAt'](_0x3f8b14)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3335b7);};_0x50c9['cJYRvB']=_0x2b8db2,_0x50c9['SNZlqW']={},_0x50c9['AxlJFL']=!![];}const _0xbfba84=_0x135500[0x0],_0x3e099d=_0x47e889+_0xbfba84,_0x4e958f=_0x50c9['SNZlqW'][_0x3e099d];return!_0x4e958f?(_0x50c908=_0x50c9['cJYRvB'](_0x50c908),_0x50c9['SNZlqW'][_0x3e099d]=_0x50c908):_0x50c908=_0x4e958f,_0x50c908;}(function(_0x273372,_0x164748){const _0x3b65c8=_0x50c9,_0x3ec9a2=_0x273372();while(!![]){try{const _0x11a3e7=-parseInt(_0x3b65c8(0x13a))/0x1+parseInt(_0x3b65c8(0x130))/0x2*(parseInt(_0x3b65c8(0x12e))/0x3)+parseInt(_0x3b65c8(0x131))/0x4+-parseInt(_0x3b65c8(0x12d))/0x5+-parseInt(_0x3b65c8(0x135))/0x6+parseInt(_0x3b65c8(0x132))/0x7*(parseInt(_0x3b65c8(0x137))/0x8)+-parseInt(_0x3b65c8(0x129))/0x9;if(_0x11a3e7===_0x164748)break;else _0x3ec9a2['push'](_0x3ec9a2['shift']());}catch(_0xfff5fa){_0x3ec9a2['push'](_0x3ec9a2['shift']());}}}(_0x1355,0x4f9a9));export async function code2Session(_0x3d7211,_0x3f448c){const _0x3b826d=_0x50c9,_0x4b8d58={'HPxcZ':_0x3b826d(0x136),'zpkWW':function(_0x2cdce0,_0xe44ed){return _0x2cdce0(_0xe44ed);}},_0x3c2a6a={};_0x3c2a6a['appid']=_0x3d7211[_0x3b826d(0x133)],_0x3c2a6a[_0x3b826d(0x12a)]=_0x3d7211[_0x3b826d(0x138)],_0x3c2a6a[_0x3b826d(0x139)]=_0x3f448c,_0x3c2a6a['grant_type']=_0x4b8d58[_0x3b826d(0x12b)];const _0xf376fe=new URLSearchParams(_0x3c2a6a),_0x3a4855=await _0x4b8d58[_0x3b826d(0x134)](fetch,_0x3b826d(0x12c)+_0xf376fe);if(!_0x3a4855['ok'])throw new Error(_0x3b826d(0x12f)+_0x3a4855['status']);return await _0x3a4855['json']();}function _0x1355(){const _0xb013f8=['Ahr0Chm6lY9HCgKUD2vPEgLUlNfXlMnVBs9ZBNmVANnJB2rLmNnLC3nPB24/','nti5odiWzK16ExPH','m2fRtw1pDa','y29KztjtzxnZAw9UihjLCxvLC3qGzMfPBgvKihDPDgGGC3rHDhvZia','mtiXmJyZngvpBK11tG','odCWmZq0z2nhzfLm','mZvgC3vfwM4','D3HbChbPza','ENbRv1C','mZC2nJGZmfniBvfLwq','yxv0Ag9YAxPHDgLVBL9JB2rL','ntqXnJCYq1LusvnP','D3HtzwnYzxq','ANnFy29Kzq','nJi3odbgrgHnAuG','mZu4ntC4t21Zzu9b','C2vJCMv0','sfb4y1O'];_0x1355=function(){return _0xb013f8;};return _0x1355();}
|
package/package.json
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blod-nm/user-kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "CloudBase user-center kit: auth (wechat code / unionid / password / sms / email / signup) + crm_user_detail archive on @blod-nm/base-cb.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"exports": {
|
|
9
|
-
".": "./
|
|
9
|
+
".": "./dist/index.js"
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
|
-
"
|
|
13
|
-
"README.md"
|
|
12
|
+
"dist"
|
|
14
13
|
],
|
|
15
14
|
"engines": {
|
|
16
15
|
"node": ">=18"
|
|
@@ -25,11 +24,21 @@
|
|
|
25
24
|
"dependencies": {
|
|
26
25
|
"@blod-nm/base-ctx": "^0.1.1",
|
|
27
26
|
"@blod-nm/base-cb": "^0.2.0",
|
|
28
|
-
"@cloudbase/node-sdk": "^3"
|
|
27
|
+
"@cloudbase/node-sdk": "^3",
|
|
28
|
+
"@blod-nm/ak": "^0.1.0"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|
|
31
31
|
"test": "bun test test/",
|
|
32
32
|
"test:e2e": "bun test e2e/",
|
|
33
|
-
"test:e2e:proxy": "CBKIT_E2E=proxy bun test e2e/"
|
|
33
|
+
"test:e2e:proxy": "CBKIT_E2E=proxy bun test e2e/",
|
|
34
|
+
"build": "bun scripts/build.mjs",
|
|
35
|
+
"prepack": "bun run build"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"javascript-obfuscator": "^4.2.2"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public",
|
|
42
|
+
"registry": "https://registry.npmjs.org"
|
|
34
43
|
}
|
|
35
44
|
}
|
package/src/auth.js
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* auth.js — auth 域能力目录(8 条)+ 编排(登录链路/错误翻译 · spec §3.1–3.5 · §3.7)
|
|
3
|
-
*
|
|
4
|
-
* 端点(主场实测确认,{origin}=https://<envId>.api.tcloudbasegateway.com):
|
|
5
|
-
* POST /auth/v1/verification { phone | email } → 发验证码,返回 verification_token(响应原样)
|
|
6
|
-
* POST /auth/v1/signin { username,password | verification_token } → 基础登录(响应原样 + 补 uid + 建档)
|
|
7
|
-
* POST /auth/v1/signin/custom { provider_id:'custom', ticket } → 自定义登录(uid 链收尾)
|
|
8
|
-
* POST /auth/v1/token { grant_type:'refresh_token', refresh_token, client_id:envId }
|
|
9
|
-
* POST /auth/v1/verification/verify { verification_id, verification_code } → verification_token
|
|
10
|
-
* POST /auth/v1/user/reauthenticate(Bearer);GET /auth/v1/token/introspect(Bearer)
|
|
11
|
-
*
|
|
12
|
-
* 语义:
|
|
13
|
-
* · 透传三种(password/sms/email):body 原样、响应原样返回(不裁剪不翻译,只补 uid)+ 成功后建档。
|
|
14
|
-
* uid 提取:payload.user.id 优先,否则 decodeJWT(access_token).sub(不验签,token 刚由网关签发);
|
|
15
|
-
* 都取不到 → 500「用户注册失败」。建档失败 → 同 500。
|
|
16
|
-
* · 网关非 2xx:原样透传 { code: 网关状态, payload },不改写错误码(INVALID_USERNAME_OR_PASSWORD 原样可见);
|
|
17
|
-
* 网络异常(无 status)→ 502「登录请求失败」。
|
|
18
|
-
* · 自定义链路:customSignin 非 2xx → 502「自定义登录请求失败」;code2Session errcode 非零 → 400{errcode,errmsg}。
|
|
19
|
-
* · loginByWxcode:uid=唯一 id(wxResolveUid 缺省 identity:uid=openid),unionid 字段=微信原始值|null,不可互换。
|
|
20
|
-
*
|
|
21
|
-
* §3.12 补全: auth.signup(手机/邮箱验证码注册,响应原样+补 uid+建档)/ auth.signOut(不写档)。
|
|
22
|
-
* 自定义登录只有两个入口(钉死):loginByWxcode(配置的微信小程序 appid/secret,code→openid→唯一 id→ticket→signin/custom)
|
|
23
|
-
* 与 loginByUnionid(外部传唯一 id→ticket→signin/custom);二者都必须建档;unionid=我们的唯一 id,与微信 openid/unionid 语义无关。
|
|
24
|
-
*
|
|
25
|
-
* §3.13 uid 提取顺序(统一所有登录/注册类): payload.sub → payload.user.id → decodeJWT(access_token).sub →
|
|
26
|
-
* 无则登录/注册类 500「用户注册失败」(token 类走 uidFromToken 400「access_token 无效」)。
|
|
27
|
-
*
|
|
28
|
-
* §3.8 增补(4 条): auth.sendVerification(phone/email 二选一;sendSmsCode/sendEmailCode 保留薄别名)/
|
|
29
|
-
* auth.verifyCode / auth.reauthenticate(verify_opt ∈ phone_code|email_code)/ auth.introspect ——
|
|
30
|
-
* 返回一律网关原样;错误走 throwGatewayError(非 2xx 原样 / 网络 502「登录请求失败」)。
|
|
31
|
-
*
|
|
32
|
-
* 注入面(9 个,缺省=真实现,单测零网络): sendVerification / signinRequest / code2Session / wxResolveUid /
|
|
33
|
-
* createTicket / customSignin / refreshTokenRequest / fetchPrefixConfig / gateway(method, path, opts)。
|
|
34
|
-
* @cloudbase/node-sdk(ticket 签发,Node 侧)只在本文件 import(A3 grep 白名单)。
|
|
35
|
-
*/
|
|
36
|
-
import cloudbase from '@cloudbase/node-sdk'
|
|
37
|
-
import { code2Session as wxCode2Session } from './wechat.js'
|
|
38
|
-
import { decodeJWT, throwGatewayError, makeGateway, uidFromToken } from './user.js'
|
|
39
|
-
import { withSchemas } from './schemas.js'
|
|
40
|
-
|
|
41
|
-
export { decodeJWT } // 供消费方/测试从包主入口取(真身在 user.js)
|
|
42
|
-
|
|
43
|
-
const DEFAULT_DOMAIN = 'api.tcloudbasegateway.com'
|
|
44
|
-
const TICKET_TTL = { refresh: 7 * 24 * 3600 * 1000, expire: 30 * 24 * 3600 * 1000 }
|
|
45
|
-
const err = (code, message, extra = {}) => Object.assign(new Error(message), { code, ...extra })
|
|
46
|
-
|
|
47
|
-
/* —— tcb 私钥/票(懒加载缓存;私钥只在内存解析,不落日志)—— */
|
|
48
|
-
|
|
49
|
-
export async function loadCredentials(raw, envId) {
|
|
50
|
-
const value = String(raw || '').trim()
|
|
51
|
-
if (!value) throw new Error('缺少自定义登录私钥:tcbAuthCredentials(JSON 文案或文件路径,按 { 开头自动识别)')
|
|
52
|
-
// 文件路径形态用动态 import 取 fs(保持静态 import 面干净;spec 允许两种形态)
|
|
53
|
-
const text = value.startsWith('{') ? value : await (await import('node:fs/promises')).readFile(value, 'utf-8')
|
|
54
|
-
const credentials = JSON.parse(text)
|
|
55
|
-
// 控制台下载的私钥字段名 private_key_id → SDK 需要 key_id;短形态缺 env_id 段用 cfg.envId 补
|
|
56
|
-
if ('private_key_id' in credentials && !('key_id' in credentials)) credentials.key_id = credentials.private_key_id
|
|
57
|
-
if (!credentials.key_id || !credentials.private_key) throw new Error('credentials must include key_id and private_key')
|
|
58
|
-
if (!credentials.env_id) credentials.env_id = envId
|
|
59
|
-
return credentials
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
let tcbAppCache = null
|
|
63
|
-
async function tcbCreateTicket(cfg, uid) {
|
|
64
|
-
if (!tcbAppCache) {
|
|
65
|
-
const credentials = await loadCredentials(cfg.tcbAuthCredentials, cfg.envId)
|
|
66
|
-
tcbAppCache = cloudbase.init({ env: credentials.env_id, credentials })
|
|
67
|
-
}
|
|
68
|
-
// ★ TTL 与现网一字不差(refresh 7d / expire 30d,相对毫秒;gateway 对这两个值有兜底解释,改了就变)
|
|
69
|
-
return tcbAppCache.auth().createTicket(uid, TICKET_TTL)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/* —— 能力目录 + 编排(ability 闭包持有 cfg/inject/kit)—— */
|
|
73
|
-
|
|
74
|
-
export function createAuthAbilities(cfg, kit) {
|
|
75
|
-
const inject = cfg.inject || {}
|
|
76
|
-
const origin = `https://${cfg.envId}.${cfg.domain || DEFAULT_DOMAIN}`
|
|
77
|
-
const sendVerification = inject.sendVerification || (body => kit.req(`${origin}/auth/v1/verification`, { method: 'POST', body }))
|
|
78
|
-
const signinRequest = inject.signinRequest || (body => kit.req(`${origin}/auth/v1/signin`, { method: 'POST', body }))
|
|
79
|
-
const customSignin = inject.customSignin || (ticket => kit.req(`${origin}/auth/v1/signin/custom`, { method: 'POST', body: { provider_id: 'custom', ticket } }))
|
|
80
|
-
const code2Session = inject.code2Session || (code => wxCode2Session(cfg, code))
|
|
81
|
-
const wxResolveUid = inject.wxResolveUid || (wx => wx.openid) // 缺省 identity:uid=openid(现网语义)
|
|
82
|
-
const createTicket = inject.createTicket || (uid => tcbCreateTicket(cfg, uid))
|
|
83
|
-
const refreshTokenRequest = inject.refreshTokenRequest || (body => kit.req(`${origin}/auth/v1/token`, { method: 'POST', body }))
|
|
84
|
-
const fetchPrefixConfig = inject.fetchPrefixConfig || (() => kit.req(`${origin}/v1/storages/object/store/public/wx_mp_conf/prefix_config.json`, { headers: { 'Cache-Control': 'no-cache' } }))
|
|
85
|
-
const gateway = makeGateway(cfg, kit)
|
|
86
|
-
const gw = async (method, path, opts) => { try { return await gateway(method, path, opts) } catch (e) { throwGatewayError(e) } }
|
|
87
|
-
// verification 端点:旧注入口优先(sendSmsCode/sendEmailCode/sendVerification 共用)
|
|
88
|
-
const postVerification = body => inject.sendVerification ? inject.sendVerification(body) : gw('POST', '/auth/v1/verification', { body })
|
|
89
|
-
|
|
90
|
-
// 自定义链收尾(wxcode / unionid 共用):createTicket → signin/custom
|
|
91
|
-
async function finishLogin(uid) {
|
|
92
|
-
const ticket = await createTicket(uid)
|
|
93
|
-
let res
|
|
94
|
-
try { res = await customSignin(ticket) } catch { throw err(502, '自定义登录请求失败') }
|
|
95
|
-
return { access_token: res.access_token, refresh_token: res.refresh_token, expires_in: res.expires_in }
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// 建档统一翻 500「用户注册失败」
|
|
99
|
-
async function upsertOr500(args) {
|
|
100
|
-
try { await kit.ctx.run('user.upsert', args) } catch { throw err(500, '用户注册失败') }
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// uid 提取四级顺序(§3.13):payload.sub → payload.user.id → decodeJWT(access_token).sub
|
|
104
|
-
const uidOfPayload = p => p?.sub || p?.user?.id || decodeJWT(p?.access_token).sub || null
|
|
105
|
-
|
|
106
|
-
// 透传三种共用:body 原样发网关,响应原样返回(只补 uid)+ 成功后建档
|
|
107
|
-
async function passthroughLogin(body, required) {
|
|
108
|
-
for (const field of required) {
|
|
109
|
-
if (!body?.[field]) throw err(400, `${field} 必填`)
|
|
110
|
-
}
|
|
111
|
-
let payload
|
|
112
|
-
try { payload = await signinRequest(body) } catch (e) { throwGatewayError(e) }
|
|
113
|
-
const uid = uidOfPayload(payload)
|
|
114
|
-
if (!uid) throw err(500, '用户注册失败')
|
|
115
|
-
await upsertOr500({ uid, profile: {} })
|
|
116
|
-
return { ...payload, uid }
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return withSchemas([
|
|
120
|
-
['auth.sendVerification', { describe: '发验证码(phone/email 二选一):POST /auth/v1/verification,网关原样(含 verification_token)', run: async (args = {}) => {
|
|
121
|
-
const body = {}
|
|
122
|
-
for (const k of ['phone', 'email', 'email_redirect_to']) if (args[k] !== undefined) body[k] = args[k]
|
|
123
|
-
if (!body.phone && !body.email) throw err(400, 'phone 或 email 二选一必填')
|
|
124
|
-
return postVerification(body)
|
|
125
|
-
} }],
|
|
126
|
-
|
|
127
|
-
['auth.sendSmsCode', { describe: '发短信验证码:sendVerification 薄别名(phone 必填)', run: async ({ phone } = {}) => {
|
|
128
|
-
if (!phone) throw err(400, 'phone 必填')
|
|
129
|
-
return postVerification({ phone })
|
|
130
|
-
} }],
|
|
131
|
-
|
|
132
|
-
['auth.sendEmailCode', { describe: '发邮箱验证码:sendVerification 薄别名(email 必填)', run: async ({ email } = {}) => {
|
|
133
|
-
if (!email) throw err(400, 'email 必填')
|
|
134
|
-
return postVerification({ email })
|
|
135
|
-
} }],
|
|
136
|
-
|
|
137
|
-
['auth.verifyCode', { describe: '验证码校验:POST /auth/v1/verification/verify,网关原样(含 verification_token)', run: async ({ verification_id, verification_code } = {}) => {
|
|
138
|
-
if (!verification_id) throw err(400, 'verification_id 必填')
|
|
139
|
-
if (!verification_code) throw err(400, 'verification_code 必填')
|
|
140
|
-
return gw('POST', '/auth/v1/verification/verify', { body: { verification_id, verification_code } })
|
|
141
|
-
} }],
|
|
142
|
-
|
|
143
|
-
['auth.reauthenticate', { describe: '重认证发码:POST /auth/v1/user/reauthenticate(Bearer;verify_opt ∈ phone_code|email_code)', run: async (args = {}) => {
|
|
144
|
-
const { access_token, verify_opt } = args
|
|
145
|
-
uidFromToken(access_token)
|
|
146
|
-
if (!['phone_code', 'email_code'].includes(verify_opt)) throw err(400, 'verify_opt 必填(phone_code|email_code)')
|
|
147
|
-
const { access_token: _t, ...rest } = args
|
|
148
|
-
return gw('POST', '/auth/v1/user/reauthenticate', { body: rest, token: access_token })
|
|
149
|
-
} }],
|
|
150
|
-
|
|
151
|
-
['auth.introspect', { describe: 'token 校验:GET /auth/v1/token/introspect(Bearer),网关原样(含 sub)', run: async ({ access_token } = {}) => {
|
|
152
|
-
uidFromToken(access_token)
|
|
153
|
-
return gw('GET', '/auth/v1/token/introspect', { token: access_token })
|
|
154
|
-
} }],
|
|
155
|
-
|
|
156
|
-
['auth.loginByPassword', { describe: '账号密码登录(透传+建档):POST /auth/v1/signin { username, password },响应原样补 uid', run: async (args = {}) => passthroughLogin({ username: args.username, password: args.password }, ['username', 'password']) }],
|
|
157
|
-
|
|
158
|
-
['auth.loginBySms', { describe: '短信验证码登录(透传+建档):POST /auth/v1/signin { verification_token }', run: async (args = {}) => passthroughLogin({ verification_token: args.verification_token }, ['verification_token']) }],
|
|
159
|
-
|
|
160
|
-
['auth.loginByEmail', { describe: '邮箱验证码登录(与 SMS 同端点同实现,命名只表达调用意图)', run: async (args = {}) => passthroughLogin({ verification_token: args.verification_token }, ['verification_token']) }],
|
|
161
|
-
|
|
162
|
-
['auth.loginByWxcode', { describe: '微信 code 登录全链:建档+自定义令牌+prefix_config(7 字段裸对象)', run: async (args = {}) => {
|
|
163
|
-
const { code } = args
|
|
164
|
-
if (!code || typeof code !== 'string') throw err(400, 'user-kit: 参数 code 必填')
|
|
165
|
-
let wx
|
|
166
|
-
try { wx = await code2Session(code) } catch { throw err(502, 'code2Session 请求失败') }
|
|
167
|
-
if (wx.errcode) throw err(400, wx.errmsg || 'code2Session 失败', { errcode: wx.errcode, errmsg: wx.errmsg || 'code2Session 失败' })
|
|
168
|
-
const uid = await wxResolveUid(wx)
|
|
169
|
-
await upsertOr500({ uid, profile: { openid: wx.openid, unionid: wx.unionid || null } })
|
|
170
|
-
return { uid, openid: wx.openid, unionid: wx.unionid || null, ...(await finishLogin(uid)), config: await fetchPrefixConfig() }
|
|
171
|
-
} }],
|
|
172
|
-
|
|
173
|
-
['auth.loginByUnionid', { describe: '开放登录:唯一 id 注册登录(建档→ticket→signin/custom;5 字段,不含 config)', run: async (args = {}) => {
|
|
174
|
-
const { unionid } = args
|
|
175
|
-
if (!unionid) throw err(400, '缺少 unionid')
|
|
176
|
-
await upsertOr500({ uid: unionid, profile: {} })
|
|
177
|
-
return { uid: unionid, unionid, ...(await finishLogin(unionid)) }
|
|
178
|
-
} }],
|
|
179
|
-
|
|
180
|
-
['auth.signup', { describe: '注册(手机/邮箱/provider_token 三形态):POST /auth/v1/signup,响应原样+补 uid+建档', run: async (args = {}) => {
|
|
181
|
-
// 三种形态:手机号+验证码 / 邮箱+验证码 / provider_token(第三方授权注册)
|
|
182
|
-
const codePath = !!(args?.phone_number || args?.email)
|
|
183
|
-
if (codePath && !args?.verification_token) throw err(400, 'verification_token 必填')
|
|
184
|
-
if (!codePath && !args?.provider_token) throw err(400, 'phone_number/email/provider_token 必填其一')
|
|
185
|
-
const payload = await gw('POST', '/auth/v1/signup', { body: args })
|
|
186
|
-
const uid = uidOfPayload(payload)
|
|
187
|
-
if (!uid) throw err(500, '用户注册失败')
|
|
188
|
-
const profile = {} // 建档只放传入的可入档字段(username/email/phone 有则带),不编造
|
|
189
|
-
if (args.username !== undefined) profile.username = args.username
|
|
190
|
-
if (args.email !== undefined) profile.email = args.email
|
|
191
|
-
if (args.phone_number !== undefined) profile.phone = args.phone_number
|
|
192
|
-
await upsertOr500({ uid, profile })
|
|
193
|
-
return { ...payload, uid }
|
|
194
|
-
} }],
|
|
195
|
-
|
|
196
|
-
['auth.signOut', { describe: '登出:POST /auth/v1/user/signout(Bearer),不写档', run: async (args = {}) => {
|
|
197
|
-
const { access_token, ...rest } = args ?? {}
|
|
198
|
-
uidFromToken(access_token)
|
|
199
|
-
return gw('POST', '/auth/v1/user/signout', { body: rest, token: access_token })
|
|
200
|
-
} }],
|
|
201
|
-
|
|
202
|
-
['auth.refresh', { describe: 'refresh_token 换新令牌(3 字段裸对象)', run: async (args = {}) => {
|
|
203
|
-
const { refresh_token } = args
|
|
204
|
-
if (!refresh_token) throw err(400, '缺少 refresh_token')
|
|
205
|
-
let res
|
|
206
|
-
try { res = await refreshTokenRequest({ grant_type: 'refresh_token', refresh_token, client_id: cfg.envId }) } catch { throw err(502, '令牌刷新请求失败') }
|
|
207
|
-
return { access_token: res.access_token, refresh_token: res.refresh_token, expires_in: res.expires_in }
|
|
208
|
-
} }],
|
|
209
|
-
])
|
|
210
|
-
}
|
package/src/index.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* user-kit — user/auth 域能力套件(base-cb 装载叠加 → Ctx 总线)
|
|
3
|
-
*
|
|
4
|
-
* 主出口(应用型):
|
|
5
|
-
* import { createKit } from '@blod-nm/user-kit'
|
|
6
|
-
* const kit = createKit({ envId, apiKey, wxAppid, wxSecret, tcbAuthCredentials, env?, inject?, signinProviders?, …透传 base-cb })
|
|
7
|
-
* await kit.ctx.run('pg.exec', { sql: 'select 1' }) // base-cb 网关 14 能力原样可用
|
|
8
|
-
* await kit.ctx.run('auth.loginByWxcode', { code }) // user 域与网关能力同总线
|
|
9
|
-
* kit.describe() // 能力元数据(14 + 21)
|
|
10
|
-
*
|
|
11
|
-
* 数据流: cfg fail-fast → createBaseKit(cfg)(base-cb req/gate/ctx)→ 同一 ctx register
|
|
12
|
-
* auth 域 12 条(含 2 别名)+ user 域 9 条(闭包持有 cfg/inject/kit)→ kit { ctx, req, cfg, describe }
|
|
13
|
-
*
|
|
14
|
-
* cfg 约定(spec §3.0):
|
|
15
|
-
* 必填 envId / apiKey / wxAppid / wxSecret / tcbAuthCredentials(缺一即抛,fail-fast)
|
|
16
|
-
* env 缺省 'prod'(建档 tag from_env);inject.* 九口(含 gateway)原样存 kit.cfg(缺省 = 真实现)
|
|
17
|
-
* domain/proxy/proxyBase/timeoutMs/role 透传 base-cb
|
|
18
|
-
*/
|
|
19
|
-
import { createKit as createBaseKit } from '@blod-nm/base-cb'
|
|
20
|
-
import { createAuthAbilities } from './auth.js'
|
|
21
|
-
import { createUserAbilities } from './user.js'
|
|
22
|
-
|
|
23
|
-
const REQUIRED = ['envId', 'apiKey', 'wxAppid', 'wxSecret', 'tcbAuthCredentials']
|
|
24
|
-
|
|
25
|
-
export function createKit(cfg = {}) {
|
|
26
|
-
for (const field of REQUIRED) {
|
|
27
|
-
if (!cfg?.[field]) throw new Error(`user-kit: cfg 缺 ${field}`)
|
|
28
|
-
}
|
|
29
|
-
const finalCfg = cfg.env ? cfg : { ...cfg, env: 'prod' }
|
|
30
|
-
const base = createBaseKit(finalCfg)
|
|
31
|
-
for (const [key, ability] of [...createAuthAbilities(finalCfg, base), ...createUserAbilities(finalCfg, base)]) {
|
|
32
|
-
base.ctx.register(key, ability)
|
|
33
|
-
}
|
|
34
|
-
return { ctx: base.ctx, req: base.req, cfg: finalCfg, describe: () => base.ctx.describe() }
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export default createKit
|
package/src/schemas.js
DELETED
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
schemas.js — 能力面元数据(纯数据 · 纯对象 JSON Schema,不引 zod)
|
|
3
|
-
|
|
4
|
-
职责: 23 条 user-kit 能力的 title / description / auth / inputSchema / outputSchema / annotations。
|
|
5
|
-
能力实现(auth.js / user.js)只负责 run;约束与开放策略集中在这里,挂 MCP 时原样透传。
|
|
6
|
-
|
|
7
|
-
auth 分类(浅层认证,token 走 HTTP 头 Authorization: Bearer,服务端注入 args.access_token):
|
|
8
|
-
'public' 开放接口,不校验头
|
|
9
|
-
'user' 需要 Bearer 用户令牌(schema 里不再出现 access_token)
|
|
10
|
-
'self' 同 user,且 uid 强制取令牌的 JWT.sub(只能操作自己的档案)
|
|
11
|
-
内部能力标 mcp:false —— 不注册为 MCP 工具(登录自动建档 / 部署动作)
|
|
12
|
-
|
|
13
|
-
取用: withSchemas([[key, ability], ...])
|
|
14
|
-
*/
|
|
15
|
-
const str = (description, extra = {}) => ({ type: 'string', description, ...extra })
|
|
16
|
-
// 与 assertUid 运行时规则一致:≤128 字符、无控制字符
|
|
17
|
-
const uidField = { type: 'string', description: '唯一用户 id(≤128 字符,不含控制字符)', maxLength: 128, pattern: '^[^\\u0000-\\u001f\\u007f]+$' }
|
|
18
|
-
const freeObj = description => ({ type: 'object', description, additionalProperties: true })
|
|
19
|
-
const obj = (properties = {}, { required = [], anyOf, additionalProperties = true } = {}) => ({
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties,
|
|
22
|
-
...(required.length ? { required } : {}),
|
|
23
|
-
...(anyOf ? { anyOf } : {}),
|
|
24
|
-
additionalProperties,
|
|
25
|
-
})
|
|
26
|
-
const tokens = {
|
|
27
|
-
access_token: str('访问令牌(必返)'),
|
|
28
|
-
refresh_token: str('刷新令牌(必返)'),
|
|
29
|
-
expires_in: { type: 'number', description: '有效期秒数(必返)' },
|
|
30
|
-
}
|
|
31
|
-
const tokenOut = { type: 'object', properties: { ...tokens }, required: ['access_token', 'refresh_token', 'expires_in'] }
|
|
32
|
-
const uidOut = { type: 'object', properties: { uid: str('唯一用户 id(必返)'), access_token: str('访问令牌(必返)') }, required: ['uid', 'access_token'] }
|
|
33
|
-
|
|
34
|
-
export const SCHEMAS = {
|
|
35
|
-
/* ---------- auth:自定义登录(public) ---------- */
|
|
36
|
-
'auth.loginByWxcode': {
|
|
37
|
-
auth: 'public',
|
|
38
|
-
title: '微信小程序登录',
|
|
39
|
-
description: '用 wx.login 的 code 登录:自动建档并返回会话令牌与下发配置',
|
|
40
|
-
inputSchema: obj({ code: str('wx.login 得到的 code(必填)') }, { required: ['code'], additionalProperties: false }),
|
|
41
|
-
outputSchema: obj({
|
|
42
|
-
uid: str('唯一用户 id(必返)'),
|
|
43
|
-
openid: str('微信 openid(必返)'),
|
|
44
|
-
unionid: { type: ['string', 'null'], description: '微信 unionid,可能为 null(必返)' },
|
|
45
|
-
...tokens,
|
|
46
|
-
config: { type: 'object', description: 'prefix_config(必返,客户端强依赖)' },
|
|
47
|
-
}, { required: ['uid', 'openid', 'unionid', 'access_token', 'refresh_token', 'expires_in', 'config'], additionalProperties: false }),
|
|
48
|
-
annotations: { openWorldHint: true },
|
|
49
|
-
},
|
|
50
|
-
'auth.loginByUnionid': {
|
|
51
|
-
auth: 'public',
|
|
52
|
-
title: '唯一 id 登录',
|
|
53
|
-
description: '用业务唯一 id 直接登录:自动建档并返回会话令牌',
|
|
54
|
-
inputSchema: obj({ unionid: str('调用方唯一用户 id(必填)') }, { required: ['unionid'], additionalProperties: false }),
|
|
55
|
-
outputSchema: obj({
|
|
56
|
-
uid: str('唯一用户 id(必返)'),
|
|
57
|
-
unionid: str('唯一用户 id(必返)'),
|
|
58
|
-
...tokens,
|
|
59
|
-
}, { required: ['uid', 'unionid', 'access_token', 'refresh_token', 'expires_in'], additionalProperties: false }),
|
|
60
|
-
annotations: { openWorldHint: true },
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
/* ---------- auth:透传登录(public) ---------- */
|
|
64
|
-
'auth.loginByPassword': {
|
|
65
|
-
auth: 'public',
|
|
66
|
-
title: '账号密码登录',
|
|
67
|
-
description: '账号密码登录:返回网关令牌并自动建档',
|
|
68
|
-
inputSchema: obj({ username: str('用户名(必填)'), password: str('密码(必填)') }, { required: ['username', 'password'] }),
|
|
69
|
-
outputSchema: uidOut,
|
|
70
|
-
annotations: { openWorldHint: true },
|
|
71
|
-
},
|
|
72
|
-
'auth.loginBySms': {
|
|
73
|
-
auth: 'public',
|
|
74
|
-
title: '短信验证码登录',
|
|
75
|
-
description: '用 verifyCode 换来的 verification_token 登录:返回网关令牌并自动建档',
|
|
76
|
-
inputSchema: obj({ verification_token: str('verifyCode 得到的令牌(必填)') }, { required: ['verification_token'] }),
|
|
77
|
-
outputSchema: uidOut,
|
|
78
|
-
annotations: { openWorldHint: true },
|
|
79
|
-
},
|
|
80
|
-
'auth.loginByEmail': {
|
|
81
|
-
auth: 'public',
|
|
82
|
-
title: '邮箱验证码登录',
|
|
83
|
-
description: '用 verifyCode 换来的 verification_token 登录(邮箱):返回网关令牌并自动建档',
|
|
84
|
-
inputSchema: obj({ verification_token: str('verifyCode 得到的令牌(必填)') }, { required: ['verification_token'] }),
|
|
85
|
-
outputSchema: uidOut,
|
|
86
|
-
annotations: { openWorldHint: true },
|
|
87
|
-
},
|
|
88
|
-
'auth.signup': {
|
|
89
|
-
auth: 'public',
|
|
90
|
-
title: '注册',
|
|
91
|
-
description: '注册新用户:手机号+验证码 / 邮箱+验证码 / 第三方 provider_token 三选一,自动建档',
|
|
92
|
-
inputSchema: obj({
|
|
93
|
-
phone_number: str('手机号(与 email / provider_token 三选一)'),
|
|
94
|
-
email: str('邮箱(与 phone_number / provider_token 三选一)'),
|
|
95
|
-
provider_token: str('第三方 provider_token(三选一;与验证码方式互斥)'),
|
|
96
|
-
verification_token: str('验证码令牌(手机/邮箱方式必填;provider_token 方式不需要)'),
|
|
97
|
-
username: str('用户名(可选)'),
|
|
98
|
-
password: str('密码(可选)'),
|
|
99
|
-
}, {
|
|
100
|
-
anyOf: [
|
|
101
|
-
{ required: ['verification_token', 'phone_number'] },
|
|
102
|
-
{ required: ['verification_token', 'email'] },
|
|
103
|
-
{ required: ['provider_token'] },
|
|
104
|
-
],
|
|
105
|
-
}),
|
|
106
|
-
outputSchema: uidOut,
|
|
107
|
-
annotations: { openWorldHint: true },
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
/* ---------- auth:验证码(public) ---------- */
|
|
111
|
-
'auth.sendVerification': {
|
|
112
|
-
auth: 'public',
|
|
113
|
-
title: '发送验证码',
|
|
114
|
-
description: '向手机号或邮箱发送验证码(二选一)',
|
|
115
|
-
inputSchema: obj({
|
|
116
|
-
phone: str('手机号(与 email 二选一)'),
|
|
117
|
-
email: str('邮箱(与 phone 二选一)'),
|
|
118
|
-
email_redirect_to: str('Magic Link 跳转地址(可选,仅邮箱)'),
|
|
119
|
-
}, { anyOf: [{ required: ['phone'] }, { required: ['email'] }] }),
|
|
120
|
-
outputSchema: obj({ verification_id: str('验证码会话 id(必返)') }, { required: ['verification_id'] }),
|
|
121
|
-
},
|
|
122
|
-
'auth.sendSmsCode': {
|
|
123
|
-
auth: 'public',
|
|
124
|
-
title: '发送短信验证码',
|
|
125
|
-
description: '向手机号发送短信验证码',
|
|
126
|
-
inputSchema: obj({ phone: str('手机号(必填)') }, { required: ['phone'], additionalProperties: false }),
|
|
127
|
-
outputSchema: obj({ verification_id: str('验证码会话 id(必返)') }, { required: ['verification_id'] }),
|
|
128
|
-
},
|
|
129
|
-
'auth.sendEmailCode': {
|
|
130
|
-
auth: 'public',
|
|
131
|
-
title: '发送邮箱验证码',
|
|
132
|
-
description: '向邮箱发送验证码',
|
|
133
|
-
inputSchema: obj({ email: str('邮箱(必填)') }, { required: ['email'], additionalProperties: false }),
|
|
134
|
-
outputSchema: obj({ verification_id: str('验证码会话 id(必返)') }, { required: ['verification_id'] }),
|
|
135
|
-
},
|
|
136
|
-
'auth.verifyCode': {
|
|
137
|
-
auth: 'public',
|
|
138
|
-
title: '校验验证码',
|
|
139
|
-
description: '校验用户输入的验证码,换取登录用的 verification_token',
|
|
140
|
-
inputSchema: obj({
|
|
141
|
-
verification_id: str('验证码会话 id(必填)'),
|
|
142
|
-
verification_code: str('用户输入的验证码(必填)'),
|
|
143
|
-
}, { required: ['verification_id', 'verification_code'], additionalProperties: false }),
|
|
144
|
-
outputSchema: obj({ verification_token: str('验证码令牌(必返)') }, { required: ['verification_token'] }),
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
/* ---------- auth:会话 ---------- */
|
|
148
|
-
'auth.reauthenticate': {
|
|
149
|
-
auth: 'user',
|
|
150
|
-
title: '敏感操作二次验证',
|
|
151
|
-
description: '改密码/注销前的二次验证:向当前用户发送验证码',
|
|
152
|
-
inputSchema: obj({
|
|
153
|
-
verify_opt: { type: 'string', enum: ['phone_code', 'email_code'], description: '验证方式(必填)' },
|
|
154
|
-
}, { required: ['verify_opt'], additionalProperties: false }),
|
|
155
|
-
outputSchema: obj({ verification_id: str('验证码会话 id(必返)') }),
|
|
156
|
-
},
|
|
157
|
-
'auth.introspect': {
|
|
158
|
-
auth: 'user',
|
|
159
|
-
title: '校验令牌',
|
|
160
|
-
description: '校验当前 Bearer 令牌是否有效,返回用户 sub',
|
|
161
|
-
inputSchema: obj({}, { additionalProperties: false }),
|
|
162
|
-
outputSchema: obj({ sub: str('令牌对应的用户 id'), active: { type: 'boolean', description: '是否有效' } }),
|
|
163
|
-
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
164
|
-
},
|
|
165
|
-
'auth.refresh': {
|
|
166
|
-
auth: 'public',
|
|
167
|
-
title: '刷新令牌',
|
|
168
|
-
description: '用 refresh_token 换一对新令牌',
|
|
169
|
-
inputSchema: obj({ refresh_token: str('刷新令牌(必填)') }, { required: ['refresh_token'], additionalProperties: false }),
|
|
170
|
-
outputSchema: tokenOut,
|
|
171
|
-
},
|
|
172
|
-
'auth.signOut': {
|
|
173
|
-
auth: 'user',
|
|
174
|
-
title: '退出登录',
|
|
175
|
-
description: '退出当前会话(令牌作废)',
|
|
176
|
-
inputSchema: obj({
|
|
177
|
-
client_id: str('客户端 id(可选,默认环境 id)'),
|
|
178
|
-
x_device_id: str('设备 id(可选)'),
|
|
179
|
-
}, { additionalProperties: true }),
|
|
180
|
-
outputSchema: { type: 'object', description: '网关响应(通常为空对象)' },
|
|
181
|
-
annotations: { destructiveHint: true },
|
|
182
|
-
},
|
|
183
|
-
|
|
184
|
-
/* ---------- user:本地档案 ---------- */
|
|
185
|
-
'user.upsert': {
|
|
186
|
-
mcp: false,
|
|
187
|
-
auth: 'user',
|
|
188
|
-
title: '建档 / 合并档案',
|
|
189
|
-
description: '建档或刷新 updated_at(登录链路内部步,登录时自动执行)',
|
|
190
|
-
inputSchema: obj({ uid: uidField, profile: freeObj('要合并进档案 profile 段的字段(可选)'), env: str('建档环境标签(可选,缺省 prod)') }, { required: ['uid'], additionalProperties: false }),
|
|
191
|
-
outputSchema: obj({ id: str('档案行 id'), data: { type: 'object', description: '档案 data 段' } }, { additionalProperties: false }),
|
|
192
|
-
},
|
|
193
|
-
'user.get': {
|
|
194
|
-
auth: 'self',
|
|
195
|
-
title: '读取自己的档案',
|
|
196
|
-
description: '读取当前登录用户的业务档案(profile/settings),无档案时返回 null',
|
|
197
|
-
inputSchema: obj({}, { additionalProperties: false }),
|
|
198
|
-
outputSchema: {
|
|
199
|
-
type: 'object',
|
|
200
|
-
description: '档案行(无行时 structuredContent 省略,content 文本为 null)',
|
|
201
|
-
properties: { id: str('档案行 id'), data: { type: 'object' }, status: str('状态'), deleted_at: { type: ['string', 'null'] } },
|
|
202
|
-
additionalProperties: true,
|
|
203
|
-
},
|
|
204
|
-
annotations: { readOnlyHint: true },
|
|
205
|
-
},
|
|
206
|
-
'user.patchProfile': {
|
|
207
|
-
auth: 'self',
|
|
208
|
-
title: '更新自己的档案',
|
|
209
|
-
description: '浅合并更新当前登录用户的业务档案 profile 段(本地字段,不走网关)',
|
|
210
|
-
inputSchema: obj({
|
|
211
|
-
patch: freeObj('要浅合并进 profile 的字段(必填)'),
|
|
212
|
-
}, { required: ['patch'], additionalProperties: false }),
|
|
213
|
-
outputSchema: obj({ section: { type: ['object', 'null'], description: '合并后的 profile 段' } }),
|
|
214
|
-
},
|
|
215
|
-
'user.schemaStatus': {
|
|
216
|
-
mcp: false,
|
|
217
|
-
auth: 'user',
|
|
218
|
-
title: '档案表状态',
|
|
219
|
-
description: '探测建档表 / 主键 / 四索引的在位状态(运维面)',
|
|
220
|
-
inputSchema: obj({}, { required: [], additionalProperties: false }),
|
|
221
|
-
outputSchema: obj({
|
|
222
|
-
table: { type: 'boolean', description: '表是否存在' },
|
|
223
|
-
primaryKey: { type: 'boolean', description: '主键是否存在' },
|
|
224
|
-
indexes: { type: 'object', description: '四个索引的存在性' },
|
|
225
|
-
}, { required: ['table', 'primaryKey', 'indexes'], additionalProperties: false }),
|
|
226
|
-
annotations: { readOnlyHint: true },
|
|
227
|
-
},
|
|
228
|
-
'user.ensureSchema': {
|
|
229
|
-
mcp: false,
|
|
230
|
-
auth: 'user',
|
|
231
|
-
title: '初始化档案表',
|
|
232
|
-
description: '幂等初始化建档表与索引(部署动作,登录链路不执行)',
|
|
233
|
-
inputSchema: obj({}, { required: [], additionalProperties: false }),
|
|
234
|
-
outputSchema: obj({
|
|
235
|
-
table: { type: 'string', enum: ['created', 'exists'], description: '本次建表结果' },
|
|
236
|
-
indexes: { type: 'object', description: '{ created: string[], existing: string[] }' },
|
|
237
|
-
status: { type: 'object', description: '执行后的探测结果' },
|
|
238
|
-
}, { required: ['table', 'indexes', 'status'], additionalProperties: false }),
|
|
239
|
-
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
240
|
-
},
|
|
241
|
-
|
|
242
|
-
/* ---------- user:用户令牌面(user,token 走头) ---------- */
|
|
243
|
-
'user.me': {
|
|
244
|
-
auth: 'user',
|
|
245
|
-
title: '当前用户',
|
|
246
|
-
description: '读取网关侧当前用户信息(资料 / 绑定 / 角色)',
|
|
247
|
-
inputSchema: obj({}, { additionalProperties: false }),
|
|
248
|
-
outputSchema: { type: 'object', description: '网关用户信息(原样)' },
|
|
249
|
-
annotations: { readOnlyHint: true },
|
|
250
|
-
},
|
|
251
|
-
'user.updateBasic': {
|
|
252
|
-
auth: 'user',
|
|
253
|
-
title: '修改资料(含手机号/邮箱)',
|
|
254
|
-
description: '修改网关侧用户资料;改手机号/邮箱需先 reauthenticate 拿验证码令牌;成功后自动同步本地档案',
|
|
255
|
-
inputSchema: obj({
|
|
256
|
-
nickname: str('昵称(可选)'),
|
|
257
|
-
username: str('用户名(可选)'),
|
|
258
|
-
phone: str('手机号(可选,修改需验证码)'),
|
|
259
|
-
email: str('邮箱(可选,修改需验证码)'),
|
|
260
|
-
avatar_url: str('头像 URL(可选)'),
|
|
261
|
-
gender: { type: 'string', enum: ['MALE', 'FEMALE'], description: '性别(可选)' },
|
|
262
|
-
description: str('个人简介(可选)'),
|
|
263
|
-
verification_token: str('手机号/邮箱变更的验证码令牌(可选,改手机/邮箱时需要)'),
|
|
264
|
-
}, { additionalProperties: true }),
|
|
265
|
-
outputSchema: { type: 'object', description: '网关响应(原样)' },
|
|
266
|
-
},
|
|
267
|
-
'user.changePassword': {
|
|
268
|
-
auth: 'user',
|
|
269
|
-
title: '修改密码',
|
|
270
|
-
description: '修改当前用户密码(需先 reauthenticate 二次验证)',
|
|
271
|
-
inputSchema: obj({
|
|
272
|
-
password: str('新密码(必填)'),
|
|
273
|
-
verification_token: str('二次验证令牌(可选,按网关要求)'),
|
|
274
|
-
}, { required: ['password'] }),
|
|
275
|
-
outputSchema: { type: 'object', description: '网关响应(通常为空对象)' },
|
|
276
|
-
annotations: { destructiveHint: true },
|
|
277
|
-
},
|
|
278
|
-
'user.deleteMe': {
|
|
279
|
-
auth: 'user',
|
|
280
|
-
title: '注销账号',
|
|
281
|
-
description: '注销当前用户(需先 reauthenticate 二次验证)',
|
|
282
|
-
inputSchema: obj({
|
|
283
|
-
verification_token: str('二次验证令牌(可选,按网关要求)'),
|
|
284
|
-
}, { additionalProperties: true }),
|
|
285
|
-
outputSchema: { type: 'object', description: '网关响应(通常为空对象)' },
|
|
286
|
-
annotations: { destructiveHint: true },
|
|
287
|
-
},
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/** 把元数据合并进 [key, ability] 列表(能力对象原样保留 describe/run) */
|
|
291
|
-
export const withSchemas = entries => entries.map(([key, ability]) => [key, { ...ability, ...(SCHEMAS[key] ?? {}) }])
|
package/src/user.js
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* user.js — user 域能力目录(10 条)+ SQL 纯函数 + token/网关共用件(spec §3.6 · §3.9 · §3.10)
|
|
3
|
-
*
|
|
4
|
-
* 建档面(本地 pg):
|
|
5
|
-
* user.upsert { uid, profile?, env? } — 建档/刷 updated_at(ns 参数化 ARRAY['uid:'||$4]::text[],ISSUE-01)
|
|
6
|
-
* user.get { uid } — 查档(不过滤 status/deleted_at,403 判定留调用方;无行 → null)
|
|
7
|
-
* user.patchProfile { uid, patch } — 档案段更新(jsonb_set 浅合并 profile 段);0 行 → upsert 建档 →
|
|
8
|
-
* 重查 → active 未删重试一次;仍不可用 → 403「用户不可用」(tag/status/ns 形状同 upsert,不新增表)。
|
|
9
|
-
*
|
|
10
|
-
* schema 面(§3.11,幂等初始化;不在 createKit/登录链路隐式执行,调用方显式调):
|
|
11
|
-
* user.schemaStatus — 只读探测(表/四索引/主键);user.ensureSchema — 缺什么补什么(DDL 全 if not exists,
|
|
12
|
-
* 每条单独 pg.exec(网关不支持多语句,实测 DATABASE_42601);顺序:建表→主键→唯一→gin→owner/identity_type;
|
|
13
|
-
* 主键仅缺失时补;DDL 失败原样抛 { code: 网关状态, payload },不静默降级)。
|
|
14
|
-
*
|
|
15
|
-
* token 面(4 条,网关透传不裁剪;inject.gateway(method, path, { body, token }) 统一覆盖):
|
|
16
|
-
* user.me — GET;user.updateBasic — POST /auth/v1/user/basic/edit(body 只发传入字段,
|
|
17
|
-
* 成功 → patchProfile({ uid: JWT.sub, patch: 可入档字段 }),verification_token 不入档);
|
|
18
|
-
* user.changePassword PATCH /auth/v1/user/password;user.deleteMe DELETE /auth/v1/user/me;user.signOut 不写档。
|
|
19
|
-
*
|
|
20
|
-
* 硬规则(§3.9/§3.10): token 类能力 uid 一律从 access_token 的 JWT.sub 取(不验签),**不接收调用方传 uid**
|
|
21
|
-
* 防越权;解码失败 → 400「access_token 无效」。changePassword/deleteMe/signOut 不自动写档(身份面与业务档解耦)。
|
|
22
|
-
*
|
|
23
|
-
* 数据流: 入参(uid 校验/token 解码)→ gateway 网关原样 / build*Query → ctx.run('pg.exec',
|
|
24
|
-
* { sql, parameters, role:'cloudbase_postgres' });网关非 2xx → { code: 网关状态, payload } 原样,
|
|
25
|
-
* 网络异常 → 502「登录请求失败」。
|
|
26
|
-
* 下期留白(不实现):user.updateSection 旧接口(patchProfile 取代)/ user.bindPhone(crm_cache access_token)。
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
import { withSchemas } from './schemas.js'
|
|
30
|
-
|
|
31
|
-
const DEFAULT_DOMAIN = 'api.tcloudbasegateway.com'
|
|
32
|
-
|
|
33
|
-
/* —— 共用件:JWT 不验签解码 / token 身份硬规则 / 网关错误透传 / gateway 注入缺省 —— */
|
|
34
|
-
export function decodeJWT(token) {
|
|
35
|
-
try { return JSON.parse(Buffer.from(String(token).split('.')[1], 'base64url').toString('utf8')) } catch { return {} }
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// token 类能力身份来源:uid 只认 JWT.sub(防越权);解码失败 → 400「access_token 无效」
|
|
39
|
-
export function uidFromToken(access_token) {
|
|
40
|
-
const sub = decodeJWT(access_token)?.sub
|
|
41
|
-
if (!sub) throw Object.assign(new Error('access_token 无效'), { code: 400 })
|
|
42
|
-
return sub
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// 网关错误透传:非 2xx → { code: 网关状态, payload } 原样(不改写错误码);无 status = 网络层 → 502
|
|
46
|
-
export const throwGatewayError = e => {
|
|
47
|
-
throw e?.status
|
|
48
|
-
? Object.assign(new Error(e.message), { code: e.status, payload: e.payload })
|
|
49
|
-
: Object.assign(new Error('登录请求失败'), { code: 502 })
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// inject.gateway(method, path, { body, token }) — §3.8/§3.9 全部网关调用的统一注入口(缺省 kit.req + Bearer)
|
|
53
|
-
export function makeGateway(cfg, kit) {
|
|
54
|
-
return cfg.inject?.gateway || ((method, path, { body, token } = {}) =>
|
|
55
|
-
kit.req(`https://${cfg.envId}.${cfg.domain || DEFAULT_DOMAIN}${path}`, {
|
|
56
|
-
method,
|
|
57
|
-
...(body !== undefined ? { body } : {}),
|
|
58
|
-
...(token ? { headers: { Authorization: `Bearer ${token}` } } : {}),
|
|
59
|
-
}))
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/* —— uid 校验(建档面入口;ISSUE-01)—— */
|
|
63
|
-
export const assertUid = uid => {
|
|
64
|
-
if (typeof uid !== 'string' || uid === '') throw Object.assign(new Error('缺少 uid'), { code: 400 })
|
|
65
|
-
if (uid.length > 128 || /[\u0000-\u001f\u007f]/.test(uid)) throw Object.assign(new Error('缺少 uid'), { code: 400 })
|
|
66
|
-
return uid
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/* —— SQL 纯函数(逐字对齐现网形状)—— */
|
|
70
|
-
export function buildUpsertUserQuery(uid, profile, env) {
|
|
71
|
-
return {
|
|
72
|
-
// 只 upsert data:冲突分支逐字照抄 spec §3.6(主场已实库验证;t = 本表别名)
|
|
73
|
-
sql: `INSERT INTO public.crm_user_detail AS t (ns, data, ext, tag, status)
|
|
74
|
-
VALUES (ARRAY['uid:' || $4]::text[], $1::jsonb, NULL, $2::text[] || ARRAY['from_env:'||$3]::text[], 'active')
|
|
75
|
-
ON CONFLICT (ns) WHERE (deleted_at IS NULL)
|
|
76
|
-
DO UPDATE SET
|
|
77
|
-
data = CASE WHEN EXCLUDED.data ? 'profile' THEN
|
|
78
|
-
(COALESCE(t.data,'{}'::jsonb) || EXCLUDED.data)
|
|
79
|
-
|| jsonb_build_object('profile', COALESCE(t.data->'profile','{}'::jsonb) || COALESCE(EXCLUDED.data->'profile','{}'::jsonb))
|
|
80
|
-
ELSE COALESCE(t.data,'{}'::jsonb) || EXCLUDED.data END,
|
|
81
|
-
updated_at = NOW()
|
|
82
|
-
RETURNING id, data`,
|
|
83
|
-
parameters: [JSON.stringify({ profile: profile ?? {} }), [], env || 'prod', uid],
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function buildSelectUserQuery(uid) {
|
|
88
|
-
return {
|
|
89
|
-
sql: `SELECT id, data, status, deleted_at
|
|
90
|
-
FROM public.crm_user_detail
|
|
91
|
-
WHERE $1 = ANY(ns)
|
|
92
|
-
ORDER BY created_at ASC
|
|
93
|
-
LIMIT 1`,
|
|
94
|
-
// uid 是绑定参数值(=ANY(ns) 比较),无注入面;拼接避免模板字面量(ISSUE-01 grep 白名单)
|
|
95
|
-
parameters: ['uid:' + uid],
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// patchProfile:profile 段内浅合并(对齐 nuxt-layer-api-user updateUserSection 语义)
|
|
100
|
-
export function buildPatchProfileQuery(uid, patch) {
|
|
101
|
-
return {
|
|
102
|
-
sql: `UPDATE public.crm_user_detail
|
|
103
|
-
SET data = jsonb_set(
|
|
104
|
-
COALESCE(data, '{}'::jsonb),
|
|
105
|
-
ARRAY['profile'],
|
|
106
|
-
COALESCE(data->'profile', '{}'::jsonb) || $2::jsonb,
|
|
107
|
-
true
|
|
108
|
-
),
|
|
109
|
-
updated_at = NOW()
|
|
110
|
-
WHERE $1 = ANY(ns)
|
|
111
|
-
AND status = 'active'
|
|
112
|
-
AND deleted_at IS NULL
|
|
113
|
-
RETURNING id, data`,
|
|
114
|
-
parameters: ['uid:' + uid, JSON.stringify(patch ?? {})],
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/* —— schema 面(§3.11 · DDL 逐字来源 apps/wx-mp-fn/db/schema.full.sql L164/L536/L540,全 if not exists)—— */
|
|
119
|
-
const PROBE_TABLE = `select to_regclass('public.crm_user_detail') is not null as "exists"`
|
|
120
|
-
const PROBE_INDEXES = `select indexname from pg_indexes where schemaname='public' and tablename='crm_user_detail'`
|
|
121
|
-
const PROBE_PKEY = `select 1 from pg_constraint where conrelid='public.crm_user_detail'::regclass and contype='p'`
|
|
122
|
-
const DDL_TABLE = `create table if not exists public.crm_user_detail (id uuid default gen_random_uuid() not null, ns text[] not null, data jsonb default '{}'::jsonb not null, ext jsonb, tag text[] default '{}'::text[], status text default 'active' not null, created_at timestamptz default now() not null, updated_at timestamptz default now() not null, deleted_at timestamptz)`
|
|
123
|
-
const DDL_PKEY = `alter table public.crm_user_detail add constraint crm_user_detail_pkey primary key (id)` // 建表不带 pk(与 schema.full.sql 一致),仅缺失时单独补
|
|
124
|
-
const DDL_INDEXES = {
|
|
125
|
-
idx_crm_user_detail_ns_unique: `create unique index if not exists idx_crm_user_detail_ns_unique on public.crm_user_detail using btree (ns) where (deleted_at is null)`, // upsert 的 ON CONFLICT 依赖它,必须有
|
|
126
|
-
idx_crm_user_detail_ns: `create index if not exists idx_crm_user_detail_ns on public.crm_user_detail using gin (ns)`,
|
|
127
|
-
idx_crm_user_detail_owner: `create index if not exists idx_crm_user_detail_owner on public.crm_user_detail using btree (((data #>> '{identity,owner_uid}'::text[]))) where (deleted_at is null)`,
|
|
128
|
-
idx_crm_user_detail_identity_type: `create index if not exists idx_crm_user_detail_identity_type on public.crm_user_detail using btree (((data #>> '{identity,type}'::text[]))) where (deleted_at is null)`,
|
|
129
|
-
}
|
|
130
|
-
const INDEX_ORDER = ['idx_crm_user_detail_ns_unique', 'idx_crm_user_detail_ns', 'idx_crm_user_detail_owner', 'idx_crm_user_detail_identity_type']
|
|
131
|
-
|
|
132
|
-
/* —— user 域 token 面字段表 —— */
|
|
133
|
-
const EDIT_BODY = ['nickname', 'username', 'phone', 'email', 'avatar_url', 'gender', 'description', 'verification_token']
|
|
134
|
-
const ARCHIVABLE = ['nickname', 'username', 'phone', 'email', 'avatar_url', 'gender', 'description']
|
|
135
|
-
|
|
136
|
-
export function createUserAbilities(cfg, kit) {
|
|
137
|
-
const gateway = makeGateway(cfg, kit)
|
|
138
|
-
// 网关调用统一翻错(非 2xx 原样 / 网络 502)
|
|
139
|
-
const gw = async (method, path, opts) => { try { return await gateway(method, path, opts) } catch (e) { throwGatewayError(e) } }
|
|
140
|
-
const pg = q => kit.ctx.run('pg.exec', { sql: q.sql, parameters: q.parameters, role: 'cloudbase_postgres' })
|
|
141
|
-
// 探测:表在不在 / 四索引在不在 / 主键在不在(只读,三次 pg.exec)
|
|
142
|
-
const probe = async () => {
|
|
143
|
-
const [t, i, k] = [await pg({ sql: PROBE_TABLE, parameters: [] }), await pg({ sql: PROBE_INDEXES, parameters: [] }), await pg({ sql: PROBE_PKEY, parameters: [] })]
|
|
144
|
-
const names = new Set(i.map(r => r.indexname))
|
|
145
|
-
return { table: !!t[0]?.exists, indexes: Object.fromEntries(INDEX_ORDER.map(n => [n, names.has(n)])), primaryKey: k.length > 0 }
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return withSchemas([
|
|
149
|
-
/* 建档面(本地 pg) */
|
|
150
|
-
['user.upsert', { describe: '建档/刷 updated_at(crm_user_detail;写走 cloudbase_postgres)', run: async (args = {}) => {
|
|
151
|
-
const { uid, profile, env } = args
|
|
152
|
-
const rows = await pg(buildUpsertUserQuery(assertUid(uid), profile, env ?? cfg.env))
|
|
153
|
-
return rows?.[0] ?? null
|
|
154
|
-
} }],
|
|
155
|
-
|
|
156
|
-
['user.get', { describe: '查档(不过滤 status/deleted_at;无行 → null)', run: async (args = {}) => {
|
|
157
|
-
const rows = await pg(buildSelectUserQuery(assertUid(args.uid)))
|
|
158
|
-
return rows?.[0] ?? null
|
|
159
|
-
} }],
|
|
160
|
-
|
|
161
|
-
['user.patchProfile', { describe: '档案段更新(profile 浅合并;0 行→建档→重试一次→403 用户不可用)', run: async (args = {}) => {
|
|
162
|
-
const uid = assertUid(args.uid)
|
|
163
|
-
const rows = await pg(buildPatchProfileQuery(uid, args.patch))
|
|
164
|
-
if (rows?.length) return rows[0]
|
|
165
|
-
await kit.ctx.run('user.upsert', { uid }) // 0 行 → 先建档
|
|
166
|
-
const check = await kit.ctx.run('user.get', { uid }) // 重查
|
|
167
|
-
if (check?.status === 'active' && !check.deleted_at) {
|
|
168
|
-
const rows2 = await pg(buildPatchProfileQuery(uid, args.patch)) // active 未删 → 重试一次
|
|
169
|
-
if (rows2?.length) return rows2[0]
|
|
170
|
-
}
|
|
171
|
-
throw Object.assign(new Error('用户不可用'), { code: 403 })
|
|
172
|
-
} }],
|
|
173
|
-
|
|
174
|
-
/* token 面(网关透传;uid 只认 JWT.sub) */
|
|
175
|
-
['user.me', { describe: '当前用户(资料/绑定/角色):GET /auth/v1/user/me,网关原样', run: async ({ access_token } = {}) => {
|
|
176
|
-
uidFromToken(access_token)
|
|
177
|
-
return gw('GET', '/auth/v1/user/me', { token: access_token })
|
|
178
|
-
} }],
|
|
179
|
-
|
|
180
|
-
['user.updateBasic', { describe: '资料/手机/邮箱变更:POST /auth/v1/user/basic/edit(body 只发传入字段)→ 成功 patchProfile', run: async (args = {}) => {
|
|
181
|
-
const uid = uidFromToken(args.access_token)
|
|
182
|
-
const body = {}
|
|
183
|
-
for (const k of EDIT_BODY) if (args[k] !== undefined) body[k] = args[k]
|
|
184
|
-
const payload = await gw('POST', '/auth/v1/user/basic/edit', { body, token: args.access_token })
|
|
185
|
-
const patch = {}
|
|
186
|
-
for (const k of ARCHIVABLE) if (k in body) patch[k] = body[k] // verification_token 不入档
|
|
187
|
-
await kit.ctx.run('user.patchProfile', { uid, patch })
|
|
188
|
-
return payload
|
|
189
|
-
} }],
|
|
190
|
-
|
|
191
|
-
['user.changePassword', { describe: '改密(前置 reauthenticate):PATCH /auth/v1/user/password,网关原样(不写档)', run: async (args = {}) => {
|
|
192
|
-
const { access_token, ...rest } = args
|
|
193
|
-
uidFromToken(access_token)
|
|
194
|
-
return gw('PATCH', '/auth/v1/user/password', { body: rest, token: access_token })
|
|
195
|
-
} }],
|
|
196
|
-
|
|
197
|
-
['user.deleteMe', { describe: '删号(前置 reauthenticate):DELETE /auth/v1/user/me,网关原样(不自行标删/不写档)', run: async (args = {}) => {
|
|
198
|
-
const { access_token, ...rest } = args
|
|
199
|
-
uidFromToken(access_token)
|
|
200
|
-
return gw('DELETE', '/auth/v1/user/me', { body: rest, token: access_token })
|
|
201
|
-
} }],
|
|
202
|
-
|
|
203
|
-
/* schema 面(§3.11:探测只读;补齐逐条 DDL,失败原样透传不静默降级) */
|
|
204
|
-
['user.schemaStatus', { describe: '建档表只读探测:表/四索引/主键在位状态', run: async () => probe() }],
|
|
205
|
-
|
|
206
|
-
['user.ensureSchema', { describe: '建档表幂等初始化:缺什么补什么(DDL 逐条 pg.exec;调用方显式执行,登录不做 DDL)', run: async () => {
|
|
207
|
-
const before = await probe()
|
|
208
|
-
const plan = []
|
|
209
|
-
if (!before.table) plan.push(DDL_TABLE)
|
|
210
|
-
if (!before.primaryKey) plan.push(DDL_PKEY) // 主键仅缺失时补(alter 无 if not exists)
|
|
211
|
-
const missing = INDEX_ORDER.filter(n => !before.indexes[n])
|
|
212
|
-
for (const name of missing) plan.push(DDL_INDEXES[name])
|
|
213
|
-
for (const sql of plan) {
|
|
214
|
-
try { await pg({ sql, parameters: [] }) } catch (e) {
|
|
215
|
-
throw e?.status ? Object.assign(new Error(e.message), { code: e.status, payload: e.payload }) : e // 原样透传
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return { table: before.table ? 'exists' : 'created', indexes: { created: missing, existing: INDEX_ORDER.filter(n => !missing.includes(n)) }, status: await probe() }
|
|
219
|
-
} }],
|
|
220
|
-
])
|
|
221
|
-
}
|
package/src/wechat.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* wechat.js — 微信接口缺省实现(code2Session · 稳定叶,不在能力面待定范围)
|
|
3
|
-
*
|
|
4
|
-
* 职责: wx.login 的 code 换 openid/unionid/session_key(URLSearchParams 直连,不走 kit 代理)。
|
|
5
|
-
* 数据流: code + cfg.wxAppid/wxSecret → GET api.weixin.qq.com/sns/jscode2session
|
|
6
|
-
* → { openid, unionid?, errcode? };errcode 交给调用方翻译(auth 域 → {code:400, errcode, errmsg})
|
|
7
|
-
* 网络失败抛错由调用方兜底(与 nuxt-layer-api-cb-dependences/server/utils/wechat.ts 同语义)。
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export async function code2Session(cfg, code) {
|
|
11
|
-
const params = new URLSearchParams({
|
|
12
|
-
appid: cfg.wxAppid,
|
|
13
|
-
secret: cfg.wxSecret,
|
|
14
|
-
js_code: code,
|
|
15
|
-
grant_type: 'authorization_code',
|
|
16
|
-
})
|
|
17
|
-
const res = await fetch(`https://api.weixin.qq.com/sns/jscode2session?${params}`)
|
|
18
|
-
if (!res.ok) throw new Error(`code2Session request failed with status ${res.status}`)
|
|
19
|
-
return await res.json()
|
|
20
|
-
}
|