@cloudbase/oauth 2.23.3 → 2.24.0
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/cjs/auth/apis.js +170 -14
- package/dist/cjs/auth/auth-error.js +32 -0
- package/dist/cjs/auth/consts.js +24 -2
- package/dist/cjs/auth/models.js +1 -1
- package/dist/cjs/captcha/captcha-dom.js +223 -0
- package/dist/cjs/captcha/captcha.js +11 -102
- package/dist/cjs/index.js +25 -3
- package/dist/cjs/oauth2client/interface.js +1 -1
- package/dist/cjs/oauth2client/models.js +1 -1
- package/dist/cjs/oauth2client/oauth2client.js +384 -110
- package/dist/cjs/utils/base64.js +15 -2
- package/dist/esm/auth/apis.js +113 -2
- package/dist/esm/auth/auth-error.js +9 -0
- package/dist/esm/auth/consts.js +22 -0
- package/dist/esm/captcha/captcha-dom.js +129 -0
- package/dist/esm/captcha/captcha.js +14 -97
- package/dist/esm/index.js +18 -2
- package/dist/esm/oauth2client/oauth2client.js +162 -36
- package/dist/esm/utils/base64.js +12 -0
- package/dist/miniprogram/index.js +1 -1
- package/dist/types/auth/apis.d.ts +19 -1
- package/dist/types/auth/auth-error.d.ts +6 -0
- package/dist/types/auth/consts.d.ts +22 -0
- package/dist/types/auth/models.d.ts +2 -0
- package/dist/types/captcha/captcha-dom.d.ts +3 -0
- package/dist/types/captcha/captcha.d.ts +3 -1
- package/dist/types/index.d.ts +11 -2
- package/dist/types/oauth2client/interface.d.ts +1 -1
- package/dist/types/oauth2client/models.d.ts +14 -0
- package/dist/types/oauth2client/oauth2client.d.ts +58 -2
- package/dist/types/utils/base64.d.ts +5 -0
- package/package.json +4 -4
- package/src/auth/apis.ts +189 -4
- package/src/auth/auth-error.ts +21 -0
- package/src/auth/consts.ts +28 -0
- package/src/auth/models.ts +2 -0
- package/src/captcha/captcha-dom.ts +178 -0
- package/src/captcha/captcha.ts +25 -115
- package/src/index.ts +51 -3
- package/src/oauth2client/interface.ts +1 -1
- package/src/oauth2client/models.ts +28 -0
- package/src/oauth2client/oauth2client.ts +254 -34
- package/src/utils/base64.ts +12 -0
package/dist/cjs/utils/base64.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.weappJwtDecode = exports.base64_url_decode = exports.weAtob = exports.weBtoa = void 0;
|
|
3
|
+
exports.weappJwtDecodeAll = exports.weappJwtDecode = exports.base64_url_decode = exports.weAtob = exports.weBtoa = void 0;
|
|
4
4
|
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
|
5
5
|
var b64re = /^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;
|
|
6
6
|
function weBtoa(string) {
|
|
@@ -96,4 +96,17 @@ function weappJwtDecode(token, options) {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
exports.weappJwtDecode = weappJwtDecode;
|
|
99
|
-
|
|
99
|
+
function weappJwtDecodeAll(token) {
|
|
100
|
+
if (typeof token !== 'string') {
|
|
101
|
+
throw new Error('Invalid token specified');
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
var parts = token.split('.').map(function (segment, i) { return i === 2 ? segment : JSON.parse(base64_url_decode(segment)); });
|
|
105
|
+
return { claims: parts[1], header: parts[0], signature: parts[2] };
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
throw new Error("Invalid token specified: ".concat(e) ? e.message : '');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.weappJwtDecodeAll = weappJwtDecodeAll;
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2Jhc2U2NC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxJQUFNLEdBQUcsR0FBRyxtRUFBbUUsQ0FBQTtBQUMvRSxJQUFNLEtBQUssR0FBRyxzRUFBc0UsQ0FBQTtBQUdwRixTQUFnQixNQUFNLENBQUMsTUFBYztJQUNuQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZCLElBQUksTUFBTSxDQUFBO0lBQ1YsSUFBSSxDQUFDLENBQUE7SUFDTCxJQUFJLENBQUMsQ0FBQTtJQUNMLElBQUksQ0FBQyxDQUFBO0lBQ0wsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ1QsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFFOUIsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRztRQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMscUhBQXFILENBQUUsQ0FBQTtRQUUvUCxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2pDLE1BQU07ZUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FB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M0U7QUFDSCxDQUFDO0FBVkQsOENBVUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gd2VhcHAgand0LWRlY29kZVxuY29uc3QgYjY0ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89J1xuY29uc3QgYjY0cmUgPSAvXig/OltBLVphLXpcXGQrL117NH0pKj8oPzpbQS1aYS16XFxkKy9dezJ9KD86PT0pP3xbQS1aYS16XFxkKy9dezN9PT8pPyQvXG5cbi8vIGJ0b2FcbmV4cG9ydCBmdW5jdGlvbiB3ZUJ0b2Eoc3RyaW5nOiBzdHJpbmcpIHtcbiAgc3RyaW5nID0gU3RyaW5nKHN0cmluZylcbiAgbGV0IGJpdG1hcFxuICBsZXQgYVxuICBsZXQgYlxuICBsZXQgY1xuICBsZXQgcmVzdWx0ID0gJydcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IHJlc3QgPSBzdHJpbmcubGVuZ3RoICUgM1xuXG4gIGZvciAoOyBpIDwgc3RyaW5nLmxlbmd0aDspIHtcbiAgICBpZiAoKGEgPSBzdHJpbmcuY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fCAoYiA9IHN0cmluZy5jaGFyQ29kZUF0KGkrKykpID4gMjU1IHx8IChjID0gc3RyaW5nLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFxcJ2J0b2FcXCcgb24gXFwnV2luZG93XFwnOiBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQgY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIG9mIHRoZSBMYXRpbjEgcmFuZ2UuJywpXG5cbiAgICBiaXRtYXAgPSAoYSA8PCAxNikgfCAoYiA8PCA4KSB8IGNcbiAgICByZXN1bHRcbiAgICAgICs9IGI2NC5jaGFyQXQoKGJpdG1hcCA+PiAxOCkgJiA2MylcbiAgICAgICsgYjY0LmNoYXJBdCgoYml0bWFwID4+IDEyKSAmIDYzKVxuICAgICAgKyBiNjQuY2hhckF0KChiaXRtYXAgPj4gNikgJiA2MylcbiAgICAgICsgYjY0LmNoYXJBdChiaXRtYXAgJiA2MylcbiAgfVxuXG4gIHJldHVybiByZXN0ID8gcmVzdWx0LnNsaWNlKDAsIHJlc3QgLSAzKSArICc9PT0nLnN1YnN0cmluZyhyZXN0KSA6IHJlc3VsdFxufVxuLy8gYXRvYlxuZXhwb3J0IGNvbnN0IHdlQXRvYiA9IGZ1bmN0aW9uIChzdHJpbmc6IHN0cmluZykge1xuICBzdHJpbmcgPSBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKC9bXFx0XFxuXFxmXFxyIF0rL2csICcnKVxuICBpZiAoIWI2NHJlLnRlc3Qoc3RyaW5nKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIGV4ZWN1dGUgXFwnYXRvYlxcJyBvbiBcXCdXaW5kb3dcXCc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuJylcbiAgc3RyaW5nICs9ICc9PScuc2xpY2UoMiAtIChzdHJpbmcubGVuZ3RoICYgMykpXG4gIGxldCBiaXRtYXBcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGxldCByMVxuICBsZXQgcjJcbiAgbGV0IGkgPSAwXG4gIGZvciAoOyBpIDwgc3RyaW5nLmxlbmd0aDspIHtcbiAgICBiaXRtYXAgPSAgICAgIChiNjQuaW5kZXhPZihzdHJpbmcuY2hhckF0KGkrKykpIDw8IDE4KVxuICAgICAgfCAoYjY0LmluZGV4T2Yoc3RyaW5nLmNoYXJBdChpKyspKSA8PCAxMilcbiAgICAgIHwgKChyMSA9IGI2NC5pbmRleE9mKHN0cmluZy5jaGFyQXQoaSsrKSkpIDw8IDYpXG4gICAgICB8IChyMiA9IGI2NC5pbmRleE9mKHN0cmluZy5jaGFyQXQoaSsrKSkpXG5cbiAgICByZXN1bHRcbiAgICAgICs9IHIxID09PSA2NFxuICAgICAgICA/IFN0cmluZy5mcm9tQ2hhckNvZGUoKGJpdG1hcCA+PiAxNikgJiAyNTUpXG4gICAgICAgIDogcjIgPT09IDY0XG4gICAgICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKChiaXRtYXAgPj4gMTYpICYgMjU1LCAoYml0bWFwID4+IDgpICYgMjU1KVxuICAgICAgICAgIDogU3RyaW5nLmZyb21DaGFyQ29kZSgoYml0bWFwID4+IDE2KSAmIDI1NSwgKGJpdG1hcCA+PiA4KSAmIDI1NSwgYml0bWFwICYgMjU1KVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHdlQXRvYihzdHIpLnJlcGxhY2UoLyguKS9nLCAocCkgPT4ge1xuICAgIGxldCBjb2RlID0gcC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KVxuICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XG4gICAgICBjb2RlID0gYDAke2NvZGV9YFxuICAgIH1cbiAgICByZXR1cm4gYCUke2NvZGV9YFxuICB9KSwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRfdXJsX2RlY29kZShzdHI6IHN0cmluZykge1xuICBsZXQgb3V0cHV0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJylcbiAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgIGNhc2UgMDpcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAyOlxuICAgICAgb3V0cHV0ICs9ICc9PSdcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAzOlxuICAgICAgb3V0cHV0ICs9ICc9J1xuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchJylcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gd2VBdG9iKG91dHB1dClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2VhcHBKd3REZWNvZGUodG9rZW46IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICBpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQnKVxuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDFcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShiYXNlNjRfdXJsX2RlY29kZSh0b2tlbi5zcGxpdCgnLicpW3Bvc10pKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogJHtlfWAgPyAoZSBhcyBhbnkpLm1lc3NhZ2UgOiAnJylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2VhcHBKd3REZWNvZGVBbGwodG9rZW46IHN0cmluZykge1xuICBpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQnKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpLm1hcCgoc2VnbWVudCwgaSkgPT4gaSA9PT0gMiA/IHNlZ21lbnQgOiBKU09OLnBhcnNlKGJhc2U2NF91cmxfZGVjb2RlKHNlZ21lbnQpKSlcbiAgICByZXR1cm4geyBjbGFpbXM6IHBhcnRzWzFdLCBoZWFkZXI6IHBhcnRzWzBdLCBzaWduYXR1cmU6IHBhcnRzWzJdfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogJHtlfWAgPyAoZSBhcyBhbnkpLm1lc3NhZ2UgOiAnJylcbiAgfVxufVxuIl19
|
package/dist/esm/auth/apis.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
import { ApiUrls, ApiUrlsV2, ErrorType } from './consts';
|
|
2
|
+
import { ApiUrls, ApiUrlsV2, AUTH_STATE_CHANGED_TYPE, ErrorType, EVENTS, OAUTH_TYPE } from './consts';
|
|
3
3
|
import { OAuth2Client, defaultStorage } from '../oauth2client/oauth2client';
|
|
4
4
|
import { Captcha } from '../captcha/captcha';
|
|
5
5
|
import { deepClone } from '../utils';
|
|
6
6
|
import MyURLSearchParams from '../utils/urlSearchParams';
|
|
7
|
+
import { AuthError } from '..';
|
|
7
8
|
function getEncryptUtils(isEncrypt, adapter) {
|
|
8
9
|
const getUtils = () => {
|
|
9
10
|
try {
|
|
@@ -54,16 +55,19 @@ export class Auth {
|
|
|
54
55
|
onCredentialsError: opts.onCredentialsError,
|
|
55
56
|
headers: opts.headers || {},
|
|
56
57
|
i18n: opts.i18n,
|
|
58
|
+
debug: opts.debug,
|
|
57
59
|
};
|
|
58
60
|
oAuth2Client = new OAuth2Client(initOptions);
|
|
59
61
|
}
|
|
60
62
|
if (!request) {
|
|
61
63
|
const baseRequest = oAuth2Client.request.bind(oAuth2Client);
|
|
62
64
|
const captcha = new Captcha({
|
|
65
|
+
env: opts.env,
|
|
63
66
|
clientId: opts.clientId,
|
|
64
67
|
request: baseRequest,
|
|
65
68
|
storage: opts.storage,
|
|
66
69
|
adapter: opts.adapter,
|
|
70
|
+
oauthInstance: this,
|
|
67
71
|
...opts.captchaOptions,
|
|
68
72
|
});
|
|
69
73
|
request = captcha.request.bind(captcha);
|
|
@@ -240,6 +244,99 @@ export class Auth {
|
|
|
240
244
|
});
|
|
241
245
|
return Promise.resolve(credentials);
|
|
242
246
|
}
|
|
247
|
+
async toBindIdentity(params) {
|
|
248
|
+
const credentials = params.credentials || (await this.config.credentialsClient.localCredentials.getCredentials());
|
|
249
|
+
let res;
|
|
250
|
+
try {
|
|
251
|
+
await this.bindWithProvider({
|
|
252
|
+
provider_token: params.provider_token,
|
|
253
|
+
}, credentials);
|
|
254
|
+
res = { data: { type: OAUTH_TYPE.BIND_IDENTITY, provider: params.provider }, error: null };
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
res = { data: { type: OAUTH_TYPE.BIND_IDENTITY }, error: new AuthError(error) };
|
|
258
|
+
}
|
|
259
|
+
if (params.fireEvent) {
|
|
260
|
+
this.config.eventBus?.fire?.(EVENTS.AUTH_STATE_CHANGED, {
|
|
261
|
+
event: AUTH_STATE_CHANGED_TYPE.BIND_IDENTITY,
|
|
262
|
+
info: res,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
return res;
|
|
266
|
+
}
|
|
267
|
+
async getInitialSession() {
|
|
268
|
+
let data = {};
|
|
269
|
+
try {
|
|
270
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
271
|
+
return { data: null, error: null };
|
|
272
|
+
}
|
|
273
|
+
const localSearch = new URLSearchParams(location?.search);
|
|
274
|
+
const code = localSearch.get('code');
|
|
275
|
+
const state = localSearch.get('state');
|
|
276
|
+
if (!code || !state) {
|
|
277
|
+
return { data: null, error: null };
|
|
278
|
+
}
|
|
279
|
+
let cacheData = null;
|
|
280
|
+
try {
|
|
281
|
+
cacheData = JSON.parse(sessionStorage.getItem(state) || 'null');
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
}
|
|
285
|
+
data = { type: cacheData?.type };
|
|
286
|
+
const errorParam = localSearch.get('error');
|
|
287
|
+
const errorDescription = localSearch.get('error_description');
|
|
288
|
+
if (errorParam || errorDescription) {
|
|
289
|
+
return {
|
|
290
|
+
data,
|
|
291
|
+
error: new AuthError({ message: errorDescription || errorParam || 'Unknown error from OAuth provider' }),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const provider = cacheData?.provider || localSearch.get('provider');
|
|
295
|
+
if (!provider) {
|
|
296
|
+
return { data, error: new AuthError({ message: 'Provider is required for OAuth verification' }) };
|
|
297
|
+
}
|
|
298
|
+
const redirectUri = location.origin + location.pathname;
|
|
299
|
+
const { provider_token: providerToken } = await this.grantProviderToken({
|
|
300
|
+
provider_id: provider,
|
|
301
|
+
provider_redirect_uri: redirectUri,
|
|
302
|
+
provider_code: code,
|
|
303
|
+
});
|
|
304
|
+
let credentials;
|
|
305
|
+
let user = null;
|
|
306
|
+
let res;
|
|
307
|
+
if (cacheData.type === OAUTH_TYPE.BIND_IDENTITY) {
|
|
308
|
+
credentials = await this.config.credentialsClient.localCredentials.getCredentials();
|
|
309
|
+
res = await this.toBindIdentity({ provider, provider_token: providerToken, credentials });
|
|
310
|
+
}
|
|
311
|
+
else if (cacheData.type === OAUTH_TYPE.SIGN_IN) {
|
|
312
|
+
res = this.getParamsByVersion({ provider }, 'AUTH_SIGN_IN_WITH_PROVIDER_URL');
|
|
313
|
+
credentials = await this.config.request(res.url, {
|
|
314
|
+
method: 'POST',
|
|
315
|
+
body: { provider_token: providerToken },
|
|
316
|
+
});
|
|
317
|
+
try {
|
|
318
|
+
user = await this.getUserInfo({ credentials });
|
|
319
|
+
}
|
|
320
|
+
catch (e) {
|
|
321
|
+
console.error('get user info error', e);
|
|
322
|
+
}
|
|
323
|
+
res = { data: { ...data, session: credentials, user }, error: null };
|
|
324
|
+
}
|
|
325
|
+
localSearch.delete('code');
|
|
326
|
+
localSearch.delete('state');
|
|
327
|
+
localSearch.delete('provider');
|
|
328
|
+
this.restoreUrlState(cacheData?.search === undefined ? `?${localSearch.toString()}` : cacheData.search, cacheData?.hash || location.hash);
|
|
329
|
+
try {
|
|
330
|
+
sessionStorage.removeItem(state);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
}
|
|
334
|
+
return res;
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
return { data, error: new AuthError(error) };
|
|
338
|
+
}
|
|
339
|
+
}
|
|
243
340
|
async signInCustom(params) {
|
|
244
341
|
const credentials = await this.config.request(ApiUrls.AUTH_SIGN_IN_CUSTOM, {
|
|
245
342
|
method: 'POST',
|
|
@@ -256,11 +353,12 @@ export class Auth {
|
|
|
256
353
|
await this.config.credentialsClient.setCredentials(credentials);
|
|
257
354
|
return Promise.resolve(credentials);
|
|
258
355
|
}
|
|
259
|
-
async bindWithProvider(params) {
|
|
356
|
+
async bindWithProvider(params, credentials) {
|
|
260
357
|
return this.config.request(ApiUrls.PROVIDER_BIND_URL, {
|
|
261
358
|
method: 'POST',
|
|
262
359
|
body: params,
|
|
263
360
|
withCredentials: true,
|
|
361
|
+
getCredentials: credentials ? () => credentials : undefined,
|
|
264
362
|
});
|
|
265
363
|
}
|
|
266
364
|
async getUserProfile(params) {
|
|
@@ -275,6 +373,7 @@ export class Auth {
|
|
|
275
373
|
const userInfo = await this.config.request(res.url, {
|
|
276
374
|
method: 'GET',
|
|
277
375
|
withCredentials: true,
|
|
376
|
+
getCredentials: params.credentials ? () => params.credentials : undefined,
|
|
278
377
|
});
|
|
279
378
|
if (userInfo.sub) {
|
|
280
379
|
userInfo.uid = userInfo.sub;
|
|
@@ -635,4 +734,16 @@ export class Auth {
|
|
|
635
734
|
},
|
|
636
735
|
});
|
|
637
736
|
}
|
|
737
|
+
restoreUrlState(search, hash) {
|
|
738
|
+
if (search === undefined)
|
|
739
|
+
return;
|
|
740
|
+
try {
|
|
741
|
+
const url = new URL(window.location.href);
|
|
742
|
+
url.search = search;
|
|
743
|
+
url.hash = hash || '';
|
|
744
|
+
window.history.replaceState(null, '', url.toString());
|
|
745
|
+
}
|
|
746
|
+
catch {
|
|
747
|
+
}
|
|
748
|
+
}
|
|
638
749
|
}
|
package/dist/esm/auth/consts.js
CHANGED
|
@@ -112,3 +112,25 @@ export var ErrorType;
|
|
|
112
112
|
ErrorType["CAPTCHA_REQUIRED"] = "captcha_required";
|
|
113
113
|
ErrorType["CAPTCHA_INVALID"] = "captcha_invalid";
|
|
114
114
|
})(ErrorType || (ErrorType = {}));
|
|
115
|
+
export const LOGIN_STATE_CHANGED_TYPE = {
|
|
116
|
+
SIGN_OUT: 'sign_out',
|
|
117
|
+
SIGN_IN: 'sign_in',
|
|
118
|
+
CREDENTIALS_ERROR: 'credentials_error',
|
|
119
|
+
};
|
|
120
|
+
export const AUTH_STATE_CHANGED_TYPE = {
|
|
121
|
+
SIGNED_OUT: 'SIGNED_OUT',
|
|
122
|
+
SIGNED_IN: 'SIGNED_IN',
|
|
123
|
+
INITIAL_SESSION: 'INITIAL_SESSION',
|
|
124
|
+
PASSWORD_RECOVERY: 'PASSWORD_RECOVERY',
|
|
125
|
+
TOKEN_REFRESHED: 'TOKEN_REFRESHED',
|
|
126
|
+
USER_UPDATED: 'USER_UPDATED',
|
|
127
|
+
BIND_IDENTITY: 'BIND_IDENTITY',
|
|
128
|
+
};
|
|
129
|
+
export const EVENTS = {
|
|
130
|
+
LOGIN_STATE_CHANGED: 'loginStateChanged',
|
|
131
|
+
AUTH_STATE_CHANGED: 'authStateChanged',
|
|
132
|
+
};
|
|
133
|
+
export const OAUTH_TYPE = {
|
|
134
|
+
SIGN_IN: 'sign_in',
|
|
135
|
+
BIND_IDENTITY: 'bind_identity',
|
|
136
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { CloudbaseEventEmitter } from '@cloudbase/utilities/dist/cjs/libs/events';
|
|
2
|
+
import { parseCaptcha } from '@cloudbase/utilities/dist/cjs/libs/util';
|
|
3
|
+
const debounce = (func, delay) => {
|
|
4
|
+
let timeoutId;
|
|
5
|
+
return (...args) => {
|
|
6
|
+
clearTimeout(timeoutId);
|
|
7
|
+
timeoutId = setTimeout(() => func.apply(null, args), delay);
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
const eventBus = new CloudbaseEventEmitter();
|
|
11
|
+
const CAPTCHA_EVENT = {
|
|
12
|
+
CAPTCHA_DATA_CHANGE: 'captchaDataChange',
|
|
13
|
+
RESOLVE_CAPTCHA_DATA: 'resolveCaptchaData',
|
|
14
|
+
};
|
|
15
|
+
const CAPTCHA_STYLES = {
|
|
16
|
+
overlay: 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);z-index:999',
|
|
17
|
+
modal: 'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:320px;padding:20px;background:#fff;border-radius:8px;box-shadow:0 0 10px rgba(0,0,0,0.2);z-index:1000',
|
|
18
|
+
prompt: 'margin-bottom:15px',
|
|
19
|
+
captchaWrap: 'display:flex;align-items:center;justify-content:space-between;margin-bottom:15px',
|
|
20
|
+
captchaImg: 'width:100%;height:auto;border:1px solid #eee',
|
|
21
|
+
refreshBtn: 'padding:10px 8px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer;flex:1;white-space:nowrap;margin-left:10px',
|
|
22
|
+
input: 'width:100%;padding:14px 16px;margin-bottom:15px;box-sizing:border-box;border:2px solid #e8ecf4;border-radius:10px;font-size:15px',
|
|
23
|
+
confirmBtn: 'width:100%;padding:10px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer',
|
|
24
|
+
loading: 'background:#6c757d;cursor:not-allowed',
|
|
25
|
+
};
|
|
26
|
+
const genCaptchaDom = ({ oauthInstance, captchaState }) => {
|
|
27
|
+
const CAPTCHA_IMG_ID = 'captcha-image';
|
|
28
|
+
const refreshCaptcha = async () => {
|
|
29
|
+
try {
|
|
30
|
+
const result = await oauthInstance.createCaptchaData({ state: captchaState.state });
|
|
31
|
+
captchaState = { ...captchaState, captchaData: result.data, token: result.token };
|
|
32
|
+
document.getElementById(CAPTCHA_IMG_ID).src = result.data;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error('刷新图形验证码失败', error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const createElement = (tag, styles, text) => {
|
|
39
|
+
const el = document.createElement(tag);
|
|
40
|
+
if (styles)
|
|
41
|
+
el.style.cssText = styles;
|
|
42
|
+
if (text)
|
|
43
|
+
el.textContent = text;
|
|
44
|
+
return el;
|
|
45
|
+
};
|
|
46
|
+
const overlay = createElement('div', CAPTCHA_STYLES.overlay);
|
|
47
|
+
const modal = createElement('div', CAPTCHA_STYLES.modal);
|
|
48
|
+
modal.appendChild(createElement('p', CAPTCHA_STYLES.prompt, '请输入你看到的字符:'));
|
|
49
|
+
const captchaWrap = createElement('div', CAPTCHA_STYLES.captchaWrap);
|
|
50
|
+
const captchaImg = createElement('img', CAPTCHA_STYLES.captchaImg);
|
|
51
|
+
captchaImg.id = CAPTCHA_IMG_ID;
|
|
52
|
+
captchaImg.src = captchaState.captchaData;
|
|
53
|
+
captchaWrap.appendChild(captchaImg);
|
|
54
|
+
const refreshBtn = createElement('button', CAPTCHA_STYLES.refreshBtn, '刷新');
|
|
55
|
+
refreshBtn.onclick = debounce(async () => {
|
|
56
|
+
refreshBtn.textContent = '加载中...';
|
|
57
|
+
refreshBtn.disabled = true;
|
|
58
|
+
refreshBtn.style.cssText = `${CAPTCHA_STYLES.refreshBtn};${CAPTCHA_STYLES.loading}`;
|
|
59
|
+
try {
|
|
60
|
+
await refreshCaptcha();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
refreshBtn.textContent = '刷新';
|
|
64
|
+
refreshBtn.disabled = false;
|
|
65
|
+
refreshBtn.style.cssText = CAPTCHA_STYLES.refreshBtn;
|
|
66
|
+
}
|
|
67
|
+
}, 500);
|
|
68
|
+
captchaWrap.appendChild(refreshBtn);
|
|
69
|
+
modal.appendChild(captchaWrap);
|
|
70
|
+
const input = createElement('input', CAPTCHA_STYLES.input);
|
|
71
|
+
input.type = 'text';
|
|
72
|
+
input.placeholder = '输入字符';
|
|
73
|
+
input.maxLength = 4;
|
|
74
|
+
modal.appendChild(input);
|
|
75
|
+
const errorMsg = createElement('div', 'color:#dc3545;font-size:12px;margin-bottom:10px;display:none;padding:8px;background:#f8d7da;border:1px solid #f5c6cb;border-radius:4px');
|
|
76
|
+
modal.appendChild(errorMsg);
|
|
77
|
+
const showError = (message) => {
|
|
78
|
+
errorMsg.textContent = message;
|
|
79
|
+
errorMsg.style.display = 'block';
|
|
80
|
+
};
|
|
81
|
+
const confirmBtn = createElement('button', CAPTCHA_STYLES.confirmBtn, '确定');
|
|
82
|
+
confirmBtn.onclick = debounce(async () => {
|
|
83
|
+
const inputValue = input.value.trim();
|
|
84
|
+
if (!inputValue) {
|
|
85
|
+
showError('请输入字符');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
errorMsg.style.display = 'none';
|
|
89
|
+
confirmBtn.textContent = '验证中...';
|
|
90
|
+
confirmBtn.disabled = true;
|
|
91
|
+
confirmBtn.style.cssText = `${CAPTCHA_STYLES.confirmBtn};${CAPTCHA_STYLES.loading}`;
|
|
92
|
+
try {
|
|
93
|
+
const verifyResult = await oauthInstance.verifyCaptchaData({
|
|
94
|
+
token: captchaState.token,
|
|
95
|
+
key: inputValue,
|
|
96
|
+
});
|
|
97
|
+
eventBus.fire(CAPTCHA_EVENT.RESOLVE_CAPTCHA_DATA, verifyResult);
|
|
98
|
+
console.log('图形验证码校验成功');
|
|
99
|
+
document.body.removeChild(overlay);
|
|
100
|
+
document.body.removeChild(modal);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('图形验证码校验失败', error);
|
|
104
|
+
const errorMessage = error.error_description || '图形验证码校验失败';
|
|
105
|
+
showError(errorMessage);
|
|
106
|
+
input.value = '';
|
|
107
|
+
input.focus();
|
|
108
|
+
await refreshCaptcha();
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
confirmBtn.textContent = '确定';
|
|
112
|
+
confirmBtn.disabled = false;
|
|
113
|
+
confirmBtn.style.cssText = CAPTCHA_STYLES.confirmBtn;
|
|
114
|
+
}
|
|
115
|
+
}, 500);
|
|
116
|
+
modal.appendChild(confirmBtn);
|
|
117
|
+
document.body.appendChild(overlay);
|
|
118
|
+
document.body.appendChild(modal);
|
|
119
|
+
};
|
|
120
|
+
export const openURIWithCallback = async (url, oauthInstance) => {
|
|
121
|
+
const { captchaData, state, token } = parseCaptcha(url);
|
|
122
|
+
genCaptchaDom({ oauthInstance, captchaState: { captchaData, state, token } });
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
console.log('等待图形验证码校验结果...');
|
|
125
|
+
eventBus.on(CAPTCHA_EVENT.RESOLVE_CAPTCHA_DATA, (res) => {
|
|
126
|
+
resolve(res?.data);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ApiUrls, ErrorType } from '../auth/consts';
|
|
2
2
|
import { defaultStorage } from '../oauth2client/oauth2client';
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { isMp } from '../utils/mp';
|
|
4
|
+
import { openURIWithCallback } from './captcha-dom';
|
|
5
5
|
export class Captcha {
|
|
6
6
|
constructor(opts) {
|
|
7
7
|
if (!opts.openURIWithCallback) {
|
|
@@ -11,7 +11,7 @@ export class Captcha {
|
|
|
11
11
|
opts.storage = defaultStorage;
|
|
12
12
|
}
|
|
13
13
|
this.config = opts;
|
|
14
|
-
this.tokenSectionName = `captcha_${opts.clientId}`;
|
|
14
|
+
this.tokenSectionName = `captcha_${opts.clientId || opts.env}`;
|
|
15
15
|
}
|
|
16
16
|
isMatch() {
|
|
17
17
|
return this.config?.adapter?.isMatch?.() || isMp();
|
|
@@ -42,65 +42,7 @@ export class Captcha {
|
|
|
42
42
|
return resp;
|
|
43
43
|
}
|
|
44
44
|
getDefaultOpenURIWithCallback() {
|
|
45
|
-
|
|
46
|
-
if (window.location.search.indexOf('__captcha') > 0) {
|
|
47
|
-
document.body.style.display = 'none';
|
|
48
|
-
}
|
|
49
|
-
if (document.getElementById('captcha_panel_wrap') === null) {
|
|
50
|
-
const elementDiv = document.createElement('div');
|
|
51
|
-
elementDiv.style.cssText = 'background-color: rgba(0, 0, 0, 0.7);position: fixed;left: 0px;right: 0px;top: 0px;bottom: 0px;padding: 9vw 0 0 0;display: none;z-index:100;';
|
|
52
|
-
elementDiv.setAttribute('id', 'captcha_panel_wrap');
|
|
53
|
-
setTimeout(() => {
|
|
54
|
-
document.body.appendChild(elementDiv);
|
|
55
|
-
}, 0);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return this.defaultOpenURIWithCallback;
|
|
59
|
-
}
|
|
60
|
-
async defaultOpenURIWithCallback(url, opts) {
|
|
61
|
-
const { width = '355px', height = '355px' } = opts || {};
|
|
62
|
-
const matched = url.match(/^(data:.*)$/);
|
|
63
|
-
if (matched) {
|
|
64
|
-
return Promise.reject({
|
|
65
|
-
error: ErrorType.UNIMPLEMENTED,
|
|
66
|
-
error_description: 'need to impl captcha data',
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
const target = document.getElementById('captcha_panel_wrap');
|
|
70
|
-
const iframe = document.createElement('iframe');
|
|
71
|
-
target.innerHTML = '';
|
|
72
|
-
iframe.setAttribute('src', url);
|
|
73
|
-
iframe.setAttribute('id', 'review-panel-iframe');
|
|
74
|
-
iframe.style.cssText = `min-width:${width};display:block;height:${height};margin:0 auto;background-color: rgb(255, 255, 255);border: none;`;
|
|
75
|
-
target.appendChild(iframe);
|
|
76
|
-
target.style.display = 'block';
|
|
77
|
-
return new Promise((resolve, reject) => {
|
|
78
|
-
iframe.onload = function () {
|
|
79
|
-
try {
|
|
80
|
-
const windowLocation = window.location;
|
|
81
|
-
const iframeLocation = iframe.contentWindow.location;
|
|
82
|
-
if (iframeLocation.host + iframeLocation.pathname === windowLocation.host + windowLocation.pathname) {
|
|
83
|
-
target.style.display = 'none';
|
|
84
|
-
const iframeUrlParams = new MyURLSearchParams(iframeLocation.search);
|
|
85
|
-
const captchToken = iframeUrlParams.get('captcha_token');
|
|
86
|
-
if (captchToken) {
|
|
87
|
-
return resolve({
|
|
88
|
-
captcha_token: captchToken,
|
|
89
|
-
expires_in: Number(iframeUrlParams.get('expires_in')),
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
return reject({
|
|
93
|
-
error: iframeUrlParams.get('error'),
|
|
94
|
-
error_description: iframeUrlParams.get('error_description'),
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
target.style.display = 'block';
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
target.style.display = 'block';
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
});
|
|
45
|
+
return (url) => openURIWithCallback(url, this.config.oauthInstance);
|
|
104
46
|
}
|
|
105
47
|
async getCaptchaToken(forceNewToken, state) {
|
|
106
48
|
if (!forceNewToken) {
|
|
@@ -109,41 +51,16 @@ export class Captcha {
|
|
|
109
51
|
return captchaToken;
|
|
110
52
|
}
|
|
111
53
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
withCredentials: false,
|
|
123
|
-
});
|
|
124
|
-
if (captchaTokenResp.captcha_token) {
|
|
125
|
-
const captchaToken = {
|
|
126
|
-
captcha_token: captchaTokenResp.captcha_token,
|
|
127
|
-
expires_in: captchaTokenResp.expires_in,
|
|
128
|
-
};
|
|
129
|
-
this.saveCaptchaToken(captchaToken);
|
|
130
|
-
return captchaTokenResp.captcha_token;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
const captchaDataResp = await this.config.request(ApiUrls.CAPTCHA_DATA_URL, {
|
|
135
|
-
method: 'POST',
|
|
136
|
-
body: {
|
|
137
|
-
state,
|
|
138
|
-
redirect_uri: '',
|
|
139
|
-
},
|
|
140
|
-
withCredentials: false,
|
|
141
|
-
});
|
|
142
|
-
captchaTokenResp = {
|
|
143
|
-
url: `${captchaDataResp.data}?state=${encodeURIComponent(state)}&token=${encodeURIComponent(captchaDataResp.token)}`,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
const captchaToken = await this.config.openURIWithCallback(captchaTokenResp.url);
|
|
54
|
+
const captchaDataResp = await this.config.request(ApiUrls.CAPTCHA_DATA_URL, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
body: {
|
|
57
|
+
state,
|
|
58
|
+
redirect_uri: '',
|
|
59
|
+
},
|
|
60
|
+
withCredentials: false,
|
|
61
|
+
});
|
|
62
|
+
const captchaTokenUrl = `${captchaDataResp.data}?state=${encodeURIComponent(state)}&token=${encodeURIComponent(captchaDataResp.token)}`;
|
|
63
|
+
const captchaToken = await this.config.openURIWithCallback(captchaTokenUrl);
|
|
147
64
|
this.saveCaptchaToken(captchaToken);
|
|
148
65
|
return captchaToken.captcha_token;
|
|
149
66
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -2,12 +2,16 @@ import { OAuth2Client } from './oauth2client/oauth2client';
|
|
|
2
2
|
import { Auth } from './auth/apis';
|
|
3
3
|
import { AUTH_API_PREFIX } from './auth/consts';
|
|
4
4
|
export { Auth } from './auth/apis';
|
|
5
|
-
export { AUTH_API_PREFIX } from './auth/consts';
|
|
5
|
+
export { AUTH_API_PREFIX, OAUTH_TYPE } from './auth/consts';
|
|
6
|
+
export { AuthError } from './auth/auth-error';
|
|
6
7
|
import * as authModels_1 from './auth/models';
|
|
7
8
|
export { authModels_1 as authModels };
|
|
9
|
+
export { weappJwtDecodeAll } from './utils/base64';
|
|
10
|
+
export { LOGIN_STATE_CHANGED_TYPE, EVENTS, AUTH_STATE_CHANGED_TYPE } from './auth/consts';
|
|
8
11
|
export class CloudbaseOAuth {
|
|
9
12
|
constructor(authOptions) {
|
|
10
|
-
const { apiOrigin, apiPath = AUTH_API_PREFIX, clientId, env, storage, request, baseRequest, anonymousSignInFunc, wxCloud, adapter, onCredentialsError, headers, i18n, useWxCloud } = authOptions;
|
|
13
|
+
const { apiOrigin, apiPath = AUTH_API_PREFIX, clientId, env, storage, request, baseRequest, anonymousSignInFunc, wxCloud, adapter, onCredentialsError, headers, i18n, useWxCloud, eventBus, detectSessionInUrl, debug, } = authOptions;
|
|
14
|
+
this.detectSessionInUrl = detectSessionInUrl ?? false;
|
|
11
15
|
this.oauth2client = new OAuth2Client({
|
|
12
16
|
apiOrigin,
|
|
13
17
|
apiPath,
|
|
@@ -21,6 +25,8 @@ export class CloudbaseOAuth {
|
|
|
21
25
|
headers: headers || {},
|
|
22
26
|
i18n,
|
|
23
27
|
useWxCloud,
|
|
28
|
+
eventBus,
|
|
29
|
+
debug,
|
|
24
30
|
});
|
|
25
31
|
this.authApi = new Auth({
|
|
26
32
|
credentialsClient: this.oauth2client,
|
|
@@ -28,5 +34,15 @@ export class CloudbaseOAuth {
|
|
|
28
34
|
request: request ? this.oauth2client.request.bind(this.oauth2client) : undefined,
|
|
29
35
|
adapter,
|
|
30
36
|
});
|
|
37
|
+
if (detectSessionInUrl) {
|
|
38
|
+
this.oauth2client.setGetInitialSession(this.authApi.getInitialSession.bind(this.authApi));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
initializeSession(onUserObtained) {
|
|
42
|
+
if (!this.detectSessionInUrl) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.oauth2client.setOnInitialSessionObtained(onUserObtained);
|
|
46
|
+
this.oauth2client.initialize();
|
|
31
47
|
}
|
|
32
48
|
}
|