@cloudbase/auth 1.7.3-alpha.0 → 2.0.0-alpha.3
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/index.d.ts +53 -101
- package/dist/cjs/index.js +431 -773
- package/dist/esm/index.d.ts +53 -101
- package/dist/esm/index.js +432 -770
- package/package.json +52 -54
- package/src/index.ts +409 -767
- package/dist/cjs/common.d.ts +0 -8
- package/dist/cjs/common.js +0 -64
- package/dist/cjs/constants.d.ts +0 -12
- package/dist/cjs/constants.js +0 -17
- package/dist/cjs/providers/anonymousAuthProvider.d.ts +0 -15
- package/dist/cjs/providers/anonymousAuthProvider.js +0 -256
- package/dist/cjs/providers/base.d.ts +0 -21
- package/dist/cjs/providers/base.js +0 -152
- package/dist/cjs/providers/customAuthProvider.d.ts +0 -5
- package/dist/cjs/providers/customAuthProvider.js +0 -150
- package/dist/cjs/providers/emailAuthProvider.d.ts +0 -9
- package/dist/cjs/providers/emailAuthProvider.js +0 -250
- package/dist/cjs/providers/oauth2AuthProvider.d.ts +0 -61
- package/dist/cjs/providers/oauth2AuthProvider.js +0 -404
- package/dist/cjs/providers/phoneAuthProvider.d.ts +0 -17
- package/dist/cjs/providers/phoneAuthProvider.js +0 -219
- package/dist/cjs/providers/usernameAuthProvider.d.ts +0 -5
- package/dist/cjs/providers/usernameAuthProvider.js +0 -169
- package/dist/cjs/providers/weixinAuthProvider.d.ts +0 -28
- package/dist/cjs/providers/weixinAuthProvider.js +0 -294
- package/dist/esm/common.d.ts +0 -8
- package/dist/esm/common.js +0 -61
- package/dist/esm/constants.d.ts +0 -12
- package/dist/esm/constants.js +0 -14
- package/dist/esm/providers/anonymousAuthProvider.d.ts +0 -15
- package/dist/esm/providers/anonymousAuthProvider.js +0 -253
- package/dist/esm/providers/base.d.ts +0 -21
- package/dist/esm/providers/base.js +0 -149
- package/dist/esm/providers/customAuthProvider.d.ts +0 -5
- package/dist/esm/providers/customAuthProvider.js +0 -147
- package/dist/esm/providers/emailAuthProvider.d.ts +0 -9
- package/dist/esm/providers/emailAuthProvider.js +0 -247
- package/dist/esm/providers/oauth2AuthProvider.d.ts +0 -61
- package/dist/esm/providers/oauth2AuthProvider.js +0 -401
- package/dist/esm/providers/phoneAuthProvider.d.ts +0 -17
- package/dist/esm/providers/phoneAuthProvider.js +0 -216
- package/dist/esm/providers/usernameAuthProvider.d.ts +0 -5
- package/dist/esm/providers/usernameAuthProvider.js +0 -166
- package/dist/esm/providers/weixinAuthProvider.d.ts +0 -28
- package/dist/esm/providers/weixinAuthProvider.js +0 -291
- package/src/common.ts +0 -21
- package/src/constants.ts +0 -13
- package/src/providers/anonymousAuthProvider.ts +0 -126
- package/src/providers/base.ts +0 -78
- package/src/providers/customAuthProvider.ts +0 -69
- package/src/providers/emailAuthProvider.ts +0 -142
- package/src/providers/oauth2AuthProvider.ts +0 -585
- package/src/providers/phoneAuthProvider.ts +0 -132
- package/src/providers/usernameAuthProvider.ts +0 -77
- package/src/providers/weixinAuthProvider.ts +0 -193
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
extendStatics(d, b);
|
|
10
|
-
function __() { this.constructor = d; }
|
|
11
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
12
|
-
};
|
|
13
|
-
})();
|
|
14
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
};
|
|
20
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
};
|
|
23
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
24
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
25
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
26
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
27
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
28
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
29
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
33
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
34
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
35
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
36
|
-
function step(op) {
|
|
37
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
38
|
-
while (_) try {
|
|
39
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
40
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
41
|
-
switch (op[0]) {
|
|
42
|
-
case 0: case 1: t = op; break;
|
|
43
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
44
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
45
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
46
|
-
default:
|
|
47
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
48
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
49
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
50
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
51
|
-
if (t[2]) _.ops.pop();
|
|
52
|
-
_.trys.pop(); continue;
|
|
53
|
-
}
|
|
54
|
-
op = body.call(thisArg, _);
|
|
55
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
56
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
import { AuthProvider } from './base';
|
|
60
|
-
import { constants, adapters, utils, helpers } from '@cloudbase/utilities/';
|
|
61
|
-
import { eventBus, EVENTS, LoginState } from '..';
|
|
62
|
-
import { LOGINTYPE } from '../constants';
|
|
63
|
-
var getSdkName = constants.getSdkName, ERRORS = constants.ERRORS, COMMUNITY_SITE_URL = constants.COMMUNITY_SITE_URL;
|
|
64
|
-
var RUNTIME = adapters.RUNTIME;
|
|
65
|
-
var getQuery = utils.getQuery, getHash = utils.getHash, removeParam = utils.removeParam, printWarn = utils.printWarn;
|
|
66
|
-
var catchErrorsDecorator = helpers.catchErrorsDecorator;
|
|
67
|
-
var WeixinAuthProvider = (function (_super) {
|
|
68
|
-
__extends(WeixinAuthProvider, _super);
|
|
69
|
-
function WeixinAuthProvider(config, appid, scope, state) {
|
|
70
|
-
var _this = _super.call(this, config) || this;
|
|
71
|
-
_this._runtime = config.runtime;
|
|
72
|
-
_this._appid = appid;
|
|
73
|
-
_this._scope = scope;
|
|
74
|
-
_this._state = state || 'weixin';
|
|
75
|
-
return _this;
|
|
76
|
-
}
|
|
77
|
-
WeixinAuthProvider.prototype.signIn = function () {
|
|
78
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
79
|
-
return __generator(this, function (_a) {
|
|
80
|
-
return [2, printWarn(ERRORS.OPERATION_FAIL, 'API signIn has been deprecated, please use signInWithRedirect insteed')];
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
WeixinAuthProvider.prototype.signInWithRedirect = function () {
|
|
85
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
86
|
-
return __generator(this, function (_a) {
|
|
87
|
-
return [2, this._redirect()];
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
};
|
|
91
|
-
WeixinAuthProvider.prototype.getRedirectResult = function (options) {
|
|
92
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
93
|
-
var code;
|
|
94
|
-
return __generator(this, function (_a) {
|
|
95
|
-
code = getWeixinCode();
|
|
96
|
-
if (!code) {
|
|
97
|
-
return [2, null];
|
|
98
|
-
}
|
|
99
|
-
return [2, this._signInWithCode(code, options)];
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
};
|
|
103
|
-
WeixinAuthProvider.prototype.getLinkRedirectResult = function (options) {
|
|
104
|
-
if (options === void 0) { options = {}; }
|
|
105
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
106
|
-
var _a, withUnionId, code, appid, loginType, hybridMiniapp;
|
|
107
|
-
return __generator(this, function (_b) {
|
|
108
|
-
_a = options.withUnionId, withUnionId = _a === void 0 ? false : _a;
|
|
109
|
-
code = getWeixinCode();
|
|
110
|
-
if (!code) {
|
|
111
|
-
return [2, null];
|
|
112
|
-
}
|
|
113
|
-
appid = this._appid;
|
|
114
|
-
loginType = (function (scope) {
|
|
115
|
-
switch (scope) {
|
|
116
|
-
case 'snsapi_login':
|
|
117
|
-
return 'WECHAT-OPEN';
|
|
118
|
-
default:
|
|
119
|
-
return 'WECHAT-PUBLIC';
|
|
120
|
-
}
|
|
121
|
-
})(this._scope);
|
|
122
|
-
hybridMiniapp = this._runtime === RUNTIME.WX_MP ? '1' : '0';
|
|
123
|
-
return [2, this._request.send('auth.linkWithWeixinCode', {
|
|
124
|
-
payload: {
|
|
125
|
-
appid: appid,
|
|
126
|
-
loginType: loginType,
|
|
127
|
-
code: code,
|
|
128
|
-
hybridMiniapp: hybridMiniapp,
|
|
129
|
-
withUnionId: withUnionId
|
|
130
|
-
}
|
|
131
|
-
})];
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
};
|
|
135
|
-
WeixinAuthProvider.prototype._redirect = function () {
|
|
136
|
-
var currUrl = removeParam('code', location.href);
|
|
137
|
-
currUrl = removeParam('state', currUrl);
|
|
138
|
-
currUrl = encodeURIComponent(currUrl);
|
|
139
|
-
var host = '//open.weixin.qq.com/connect/oauth2/authorize';
|
|
140
|
-
if (this._scope === 'snsapi_login') {
|
|
141
|
-
host = '//open.weixin.qq.com/connect/qrconnect';
|
|
142
|
-
}
|
|
143
|
-
try {
|
|
144
|
-
location.href = host + "?appid=" + this._appid + "&redirect_uri=" + currUrl + "&response_type=code&scope=" + this._scope + "&state=" + this._state + "#wechat_redirect";
|
|
145
|
-
}
|
|
146
|
-
catch (e) {
|
|
147
|
-
throw new Error("[" + getSdkName() + "][" + ERRORS.UNKOWN_ERROR + "]" + e);
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
WeixinAuthProvider.prototype._signInWithCode = function (code, options) {
|
|
151
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
152
|
-
var _a, accessTokenKey, accessTokenExpireKey, refreshTokenKey, loginType, refreshTokenRes, refreshToken, loginState;
|
|
153
|
-
return __generator(this, function (_b) {
|
|
154
|
-
switch (_b.label) {
|
|
155
|
-
case 0:
|
|
156
|
-
_a = this._cache.keys, accessTokenKey = _a.accessTokenKey, accessTokenExpireKey = _a.accessTokenExpireKey, refreshTokenKey = _a.refreshTokenKey;
|
|
157
|
-
loginType = (function (scope) {
|
|
158
|
-
switch (scope) {
|
|
159
|
-
case 'snsapi_login':
|
|
160
|
-
return 'WECHAT-OPEN';
|
|
161
|
-
default:
|
|
162
|
-
return 'WECHAT-PUBLIC';
|
|
163
|
-
}
|
|
164
|
-
})(this._scope);
|
|
165
|
-
return [4, this._getRefreshTokenByWXCode(this._appid, loginType, code, options)];
|
|
166
|
-
case 1:
|
|
167
|
-
refreshTokenRes = _b.sent();
|
|
168
|
-
refreshToken = refreshTokenRes.refreshToken;
|
|
169
|
-
return [4, this._cache.setStoreAsync(refreshTokenKey, refreshToken)];
|
|
170
|
-
case 2:
|
|
171
|
-
_b.sent();
|
|
172
|
-
if (!refreshTokenRes.accessToken) return [3, 4];
|
|
173
|
-
return [4, this._cache.setStoreAsync(accessTokenKey, refreshTokenRes.accessToken)];
|
|
174
|
-
case 3:
|
|
175
|
-
_b.sent();
|
|
176
|
-
_b.label = 4;
|
|
177
|
-
case 4:
|
|
178
|
-
if (!refreshTokenRes.accessTokenExpire) return [3, 6];
|
|
179
|
-
return [4, this._cache.setStoreAsync(accessTokenExpireKey, String(refreshTokenRes.accessTokenExpire + Date.now()))];
|
|
180
|
-
case 5:
|
|
181
|
-
_b.sent();
|
|
182
|
-
_b.label = 6;
|
|
183
|
-
case 6:
|
|
184
|
-
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED);
|
|
185
|
-
eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, {
|
|
186
|
-
env: this._config.env,
|
|
187
|
-
loginType: LOGINTYPE.WECHAT,
|
|
188
|
-
persistence: this._config.persistence
|
|
189
|
-
});
|
|
190
|
-
return [4, this.refreshUserInfo()];
|
|
191
|
-
case 7:
|
|
192
|
-
_b.sent();
|
|
193
|
-
loginState = new LoginState({
|
|
194
|
-
envId: this._config.env,
|
|
195
|
-
cache: this._cache,
|
|
196
|
-
request: this._request
|
|
197
|
-
});
|
|
198
|
-
return [4, loginState.checkLocalStateAsync()];
|
|
199
|
-
case 8:
|
|
200
|
-
_b.sent();
|
|
201
|
-
return [2, loginState];
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
};
|
|
206
|
-
WeixinAuthProvider.prototype._getRefreshTokenByWXCode = function (appid, loginType, code, options) {
|
|
207
|
-
if (options === void 0) { options = {}; }
|
|
208
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
209
|
-
var _a, withUnionId, _b, createUser, syncUserInfo, action, hybridMiniapp;
|
|
210
|
-
return __generator(this, function (_c) {
|
|
211
|
-
_a = options.withUnionId, withUnionId = _a === void 0 ? false : _a, _b = options.createUser, createUser = _b === void 0 ? true : _b;
|
|
212
|
-
syncUserInfo = this._scope === 'snsapi_base' ? false : options.syncUserInfo || false;
|
|
213
|
-
action = 'auth.signIn';
|
|
214
|
-
hybridMiniapp = this._runtime === RUNTIME.WX_MP ? '1' : '0';
|
|
215
|
-
return [2, this._request.send(action, {
|
|
216
|
-
appid: appid,
|
|
217
|
-
loginType: loginType,
|
|
218
|
-
hybridMiniapp: hybridMiniapp,
|
|
219
|
-
syncUserInfo: syncUserInfo,
|
|
220
|
-
loginCredential: code,
|
|
221
|
-
withUnionId: withUnionId,
|
|
222
|
-
createUser: createUser
|
|
223
|
-
}).then(function (res) {
|
|
224
|
-
if (res.code) {
|
|
225
|
-
throw new Error("[" + getSdkName() + "][" + ERRORS.OPERATION_FAIL + "] failed login via wechat: " + res.code);
|
|
226
|
-
}
|
|
227
|
-
if (res.refresh_token) {
|
|
228
|
-
return {
|
|
229
|
-
refreshToken: res.refresh_token,
|
|
230
|
-
accessToken: res.access_token,
|
|
231
|
-
accessTokenExpire: res.access_token_expire
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
throw new Error("[" + getSdkName() + "][" + ERRORS.OPERATION_FAIL + "] action:getJwt not return refreshToken");
|
|
236
|
-
}
|
|
237
|
-
})];
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
};
|
|
241
|
-
__decorate([
|
|
242
|
-
catchErrorsDecorator({
|
|
243
|
-
title: '跳转微信公众号授权失败',
|
|
244
|
-
messages: [
|
|
245
|
-
'请确认以下各项:',
|
|
246
|
-
' 1 - 调用 auth().weixinAuthProvider().signInWithRedirect() 的语法或参数是否正确',
|
|
247
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A" + COMMUNITY_SITE_URL
|
|
248
|
-
]
|
|
249
|
-
}),
|
|
250
|
-
__metadata("design:type", Function),
|
|
251
|
-
__metadata("design:paramtypes", []),
|
|
252
|
-
__metadata("design:returntype", Promise)
|
|
253
|
-
], WeixinAuthProvider.prototype, "signInWithRedirect", null);
|
|
254
|
-
__decorate([
|
|
255
|
-
catchErrorsDecorator({
|
|
256
|
-
title: '微信公众号登录失败',
|
|
257
|
-
messages: [
|
|
258
|
-
'请确认以下各项:',
|
|
259
|
-
' 1 - 调用 auth().weixinAuthProvider().getRedirectResult() 的语法或参数是否正确',
|
|
260
|
-
' 2 - 当前环境是否开通了微信公众号登录授权',
|
|
261
|
-
' 3 - 微信公众号的 AppId 与 AppSecret 配置是否正确',
|
|
262
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A" + COMMUNITY_SITE_URL
|
|
263
|
-
]
|
|
264
|
-
}),
|
|
265
|
-
__metadata("design:type", Function),
|
|
266
|
-
__metadata("design:paramtypes", [Object]),
|
|
267
|
-
__metadata("design:returntype", Promise)
|
|
268
|
-
], WeixinAuthProvider.prototype, "getRedirectResult", null);
|
|
269
|
-
__decorate([
|
|
270
|
-
catchErrorsDecorator({
|
|
271
|
-
title: '获取微信重定向绑定结果',
|
|
272
|
-
messages: [
|
|
273
|
-
'请确认以下各项:',
|
|
274
|
-
' 1 - 调用 auth().weixinAuthProvider().getLinkRedirectResult() 的语法或参数是否正确',
|
|
275
|
-
' 2 - 当前环境是否开通了微信公众号登录授权',
|
|
276
|
-
' 3 - 微信公众号的 AppId 与 AppSecret 配置是否正确',
|
|
277
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A" + COMMUNITY_SITE_URL
|
|
278
|
-
]
|
|
279
|
-
}),
|
|
280
|
-
__metadata("design:type", Function),
|
|
281
|
-
__metadata("design:paramtypes", [Object]),
|
|
282
|
-
__metadata("design:returntype", Promise)
|
|
283
|
-
], WeixinAuthProvider.prototype, "getLinkRedirectResult", null);
|
|
284
|
-
return WeixinAuthProvider;
|
|
285
|
-
}(AuthProvider));
|
|
286
|
-
export { WeixinAuthProvider };
|
|
287
|
-
function getWeixinCode() {
|
|
288
|
-
return getQuery('code') || getHash('code');
|
|
289
|
-
}
|
|
290
|
-
;
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VpeGluQXV0aFByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy93ZWl4aW5BdXRoUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWpDLElBQUEsVUFBVSxHQUFpQyxTQUFTLFdBQTFDLEVBQUUsTUFBTSxHQUF5QixTQUFTLE9BQWxDLEVBQUUsa0JBQWtCLEdBQUssU0FBUyxtQkFBZCxDQUFlO0FBQ3JELElBQUEsT0FBTyxHQUFLLFFBQVEsUUFBYixDQUFjO0FBQ3JCLElBQUEsUUFBUSxHQUFzQyxLQUFLLFNBQTNDLEVBQUUsT0FBTyxHQUE2QixLQUFLLFFBQWxDLEVBQUUsV0FBVyxHQUFnQixLQUFLLFlBQXJCLEVBQUUsU0FBUyxHQUFLLEtBQUssVUFBVixDQUFXO0FBQ3BELElBQUEsb0JBQW9CLEdBQUssT0FBTyxxQkFBWixDQUFhO0FBRXpDO0lBQXdDLHNDQUFZO0lBTWxELDRCQUFZLE1BQTZGLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFBRSxLQUFjO1FBQXZKLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBTWQ7UUFKQyxLQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDL0IsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsS0FBSSxDQUFDLE1BQU0s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LEFBL0tELENBQXdDLFlBQVksR0ErS25EO1NBL0tZLGtCQUFrQjtBQWlML0IsU0FBUyxhQUFhO0lBQ3BCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhQcm92aWRlciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBJQ2xvdWRiYXNlQXV0aENvbmZpZyB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvYXV0aCc7XG5pbXBvcnQgeyBJQ2xvdWRiYXNlQ2FjaGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NhY2hlJztcbmltcG9ydCB7IElDbG91ZGJhc2VSZXF1ZXN0IH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZXF1ZXN0JztcbmltcG9ydCB7IGNvbnN0YW50cywgYWRhcHRlcnMsdXRpbHMsIGhlbHBlcnMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcy8nO1xuaW1wb3J0IHsgZXZlbnRCdXMsIEVWRU5UUywgTG9naW5TdGF0ZSB9IGZyb20gJy4uJztcbmltcG9ydCB7IExPR0lOVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmNvbnN0IHsgZ2V0U2RrTmFtZSwgRVJST1JTLCBDT01NVU5JVFlfU0lURV9VUkwgfSA9IGNvbnN0YW50cztcbmNvbnN0IHsgUlVOVElNRSB9ID0gYWRhcHRlcnM7XG5jb25zdCB7IGdldFF1ZXJ5LCBnZXRIYXNoLCByZW1vdmVQYXJhbSwgcHJpbnRXYXJuIH0gPSB1dGlscztcbmNvbnN0IHsgY2F0Y2hFcnJvcnNEZWNvcmF0b3IgfSA9IGhlbHBlcnM7XG5cbmV4cG9ydCBjbGFzcyBXZWl4aW5BdXRoUHJvdmlkZXIgZXh0ZW5kcyBBdXRoUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9zY29wZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBpZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOnN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IElDbG91ZGJhc2VBdXRoQ29uZmlnJntjYWNoZTpJQ2xvdWRiYXNlQ2FjaGUscmVxdWVzdDpJQ2xvdWRiYXNlUmVxdWVzdCxydW50aW1lOnN0cmluZ30sIGFwcGlkOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHN0YXRlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuX3J1bnRpbWUgPSBjb25maWcucnVudGltZTtcbiAgICB0aGlzLl9hcHBpZCA9IGFwcGlkO1xuICAgIHRoaXMuX3Njb3BlID0gc2NvcGU7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZSB8fCAnd2VpeGluJztcbiAgfVxuICBcbiAgcHVibGljIGFzeW5jIHNpZ25Jbigpe1xuICAgIHJldHVybiBwcmludFdhcm4oRVJST1JTLk9QRVJBVElPTl9GQUlMLCdBUEkgc2lnbkluIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2Ugc2lnbkluV2l0aFJlZGlyZWN0IGluc3RlZWQnKTtcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6Lez6L2s5b6u5L+h5YWs5LyX5Y+35o6I5p2D5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS53ZWl4aW5BdXRoUHJvdmlkZXIoKS5zaWduSW5XaXRoUmVkaXJlY3QoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWBcbiAgICBdXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoUmVkaXJlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0KCk7XG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+W+ruS/oeWFrOS8l+WPt+eZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkud2VpeGluQXV0aFByb3ZpZGVyKCkuZ2V0UmVkaXJlY3RSZXN1bHQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOmAmuS6huW+ruS/oeWFrOS8l+WPt+eZu+W9leaOiOadgycsXG4gICAgICAnICAzIC0g5b6u5L+h5YWs5LyX5Y+355qEIEFwcElkIOS4jiBBcHBTZWNyZXQg6YWN572u5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gXG4gICAgXVxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0UmVkaXJlY3RSZXN1bHQob3B0aW9uczp7IHdpdGhVbmlvbklkPzogYm9vbGVhbjsgc3luY1VzZXJJbmZvPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgY29kZSA9IGdldFdlaXhpbkNvZGUoKTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2lnbkluV2l0aENvZGUoY29kZSxvcHRpb25zKTtcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W5b6u5L+h6YeN5a6a5ZCR57uR5a6a57uT5p6cJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS53ZWl4aW5BdXRoUHJvdmlkZXIoKS5nZXRMaW5rUmVkaXJlY3RSZXN1bHQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOmAmuS6huW+ruS/oeWFrOS8l+WPt+eZu+W9leaOiOadgycsXG4gICAgICAnICAzIC0g5b6u5L+h5YWs5LyX5Y+355qEIEFwcElkIOS4jiBBcHBTZWNyZXQg6YWN572u5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gXG4gICAgXVxuICB9KVxuICBhc3luYyBnZXRMaW5rUmVkaXJlY3RSZXN1bHQob3B0aW9uczogeyB3aXRoVW5pb25JZD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgY29uc3QgeyB3aXRoVW5pb25JZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvZGUgPSBnZXRXZWl4aW5Db2RlKCk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBfYXBwaWQ6IGFwcGlkIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxvZ2luVHlwZSA9IChzY29wZSA9PiB7XG4gICAgICBzd2l0Y2ggKHNjb3BlKSB7XG4gICAgICAgIGNhc2UgJ3Nuc2FwaV9sb2dpbic6XG4gICAgICAgICAgcmV0dXJuICdXRUNIQVQtT1BFTic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICdXRUNIQVQtUFVCTElDJztcbiAgICAgIH1cbiAgICB9KSh0aGlzLl9zY29wZSk7XG4gICAgY29uc3QgaHlicmlkTWluaWFwcCA9IHRoaXMuX3J1bnRpbWUgPT09IFJVTlRJTUUuV1hfTVAgPyAnMScgOiAnMCc7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Quc2VuZCgnYXV0aC5saW5rV2l0aFdlaXhpbkNvZGUnLCB7IFxuICAgICAgcGF5bG9hZDogeyBcbiAgICAgICAgYXBwaWQsIFxuICAgICAgICBsb2dpblR5cGUsIFxuICAgICAgICBjb2RlLCBcbiAgICAgICAgaHlicmlkTWluaWFwcCwgXG4gICAgICAgIHdpdGhVbmlvbklkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWRpcmVjdCgpOiBhbnkge1xuICAgIGxldCBjdXJyVXJsID0gcmVtb3ZlUGFyYW0oJ2NvZGUnLCBsb2NhdGlvbi5ocmVmKTtcbiAgICBjdXJyVXJsID0gcmVtb3ZlUGFyYW0oJ3N0YXRlJywgY3VyclVybCk7XG4gICAgY3VyclVybCA9IGVuY29kZVVSSUNvbXBvbmVudChjdXJyVXJsKTtcblxuICAgIGxldCBob3N0ID0gJy8vb3Blbi53ZWl4aW4ucXEuY29tL2Nvbm5lY3Qvb2F1dGgyL2F1dGhvcml6ZSc7XG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSAnc25zYXBpX2xvZ2luJykge1xuICAgICAgaG9zdCA9ICcvL29wZW4ud2VpeGluLnFxLmNvbS9jb25uZWN0L3FyY29ubmVjdCc7XG4gICAgfVxuICAgIHRyeXtcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSBgJHtob3N0fT9hcHBpZD0ke3RoaXMuX2FwcGlkfSZyZWRpcmVjdF91cmk9JHtjdXJyVXJsfSZyZXNwb25zZV90eXBlPWNvZGUmc2NvcGU9JHt0aGlzLl9zY29wZX0mc3RhdGU9JHt0aGlzLl9zdGF0ZX0jd2VjaGF0X3JlZGlyZWN0YDtcbiAgICB9Y2F0Y2goZSl7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFske2dldFNka05hbWUoKX1dWyR7RVJST1JTLlVOS09XTl9FUlJPUn1dJHtlfWApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfc2lnbkluV2l0aENvZGUoY29kZTpzdHJpbmcsb3B0aW9ucykge1xuICAgIGNvbnN0IHsgYWNjZXNzVG9rZW5LZXksIGFjY2Vzc1Rva2VuRXhwaXJlS2V5LCByZWZyZXNoVG9rZW5LZXkgfSA9IHRoaXMuX2NhY2hlLmtleXM7XG4gICAgLy8g5pyJY29kZe+8jOeUqGNvZGXmjaJyZWZyZXNoIHRva2VuXG4gICAgY29uc3QgbG9naW5UeXBlID0gKHNjb3BlID0+IHtcbiAgICAgIHN3aXRjaCAoc2NvcGUpIHtcbiAgICAgICAgY2FzZSAnc25zYXBpX2xvZ2luJzpcbiAgICAgICAgICByZXR1cm4gJ1dFQ0hBVC1PUEVOJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ1dFQ0hBVC1QVUJMSUMnO1xuICAgICAgfVxuICAgIH0pKHRoaXMuX3Njb3BlKTtcblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlblJlcyA9IGF3YWl0IHRoaXMuX2dldFJlZnJlc2hUb2tlbkJ5V1hDb2RlKHRoaXMuX2FwcGlkLCBsb2dpblR5cGUsIGNvZGUsb3B0aW9ucyk7XG4gICAgY29uc3QgeyByZWZyZXNoVG9rZW4gfSA9IHJlZnJlc2hUb2tlblJlcztcblxuICAgIC8vIOacrOWcsOWtmOS4i1xuICAgIGF3YWl0IHRoaXMuX2NhY2hlLnNldFN0b3JlQXN5bmMocmVmcmVzaFRva2VuS2V5LCByZWZyZXNoVG9rZW4pO1xuICAgIGlmIChyZWZyZXNoVG9rZW5SZXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NhY2hlLnNldFN0b3JlQXN5bmMoYWNjZXNzVG9rZW5LZXksIHJlZnJlc2hUb2tlblJlcy5hY2Nlc3NUb2tlbik7XG4gICAgfVxuICAgIGlmIChyZWZyZXNoVG9rZW5SZXMuYWNjZXNzVG9rZW5FeHBpcmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NhY2hlLnNldFN0b3JlQXN5bmMoYWNjZXNzVG9rZW5FeHBpcmVLZXksIFN0cmluZyhyZWZyZXNoVG9rZW5SZXMuYWNjZXNzVG9rZW5FeHBpcmUgKyBEYXRlLm5vdygpKSk7XG4gICAgfVxuICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1NUQVRFX0NIQU5HRUQpO1xuICAgIC8vIOaKm+WHuueZu+W9leexu+Wei+abtOaUueS6i+S7tlxuICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1RZUEVfQ0hBTkdFRCwgeyBcbiAgICAgIGVudjogdGhpcy5fY29uZmlnLmVudixcbiAgICAgIGxvZ2luVHlwZTogTE9HSU5UWVBFLldFQ0hBVCwgXG4gICAgICBwZXJzaXN0ZW5jZTogdGhpcy5fY29uZmlnLnBlcnNpc3RlbmNlIFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaFVzZXJJbmZvKCk7XG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IG5ldyBMb2dpblN0YXRlKHtcbiAgICAgIGVudklkOiB0aGlzLl9jb25maWcuZW52LFxuICAgICAgY2FjaGU6IHRoaXMuX2NhY2hlLFxuICAgICAgcmVxdWVzdDogdGhpcy5fcmVxdWVzdFxuICAgIH0pO1xuICAgIGF3YWl0IGxvZ2luU3RhdGUuY2hlY2tMb2NhbFN0YXRlQXN5bmMoKTtcbiAgICBcbiAgICByZXR1cm4gbG9naW5TdGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldFJlZnJlc2hUb2tlbkJ5V1hDb2RlKFxuICAgIGFwcGlkOiBzdHJpbmcsIFxuICAgIGxvZ2luVHlwZTogc3RyaW5nLCBcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogYW55ID0ge31cbiAgKTogUHJvbWlzZTx7IHJlZnJlc2hUb2tlbjogc3RyaW5nOyBhY2Nlc3NUb2tlbjogc3RyaW5nOyBhY2Nlc3NUb2tlbkV4cGlyZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IHdpdGhVbmlvbklkID0gZmFsc2UsIGNyZWF0ZVVzZXIgPSB0cnVlIH0gPSBvcHRpb25zO1xuICAgIC8vIHNuc2FwaV91c2VyaW5mbyDlkowgc25zYXBpX2xvZ2luIOaJjeWPr+S7peiOt+WPlueUqOaIt+eahOW+ruS/oeS/oeaBr1xuICAgIGNvbnN0IHN5bmNVc2VySW5mbyA9IHRoaXMuX3Njb3BlID09PSAnc25zYXBpX2Jhc2UnID8gZmFsc2UgOiBvcHRpb25zLnN5bmNVc2VySW5mbyB8fCBmYWxzZTtcblxuICAgIGNvbnN0IGFjdGlvbiA9ICdhdXRoLnNpZ25Jbic7XG4gICAgY29uc3QgaHlicmlkTWluaWFwcCA9IHRoaXMuX3J1bnRpbWUgPT09IFJVTlRJTUUuV1hfTVAgPyAnMScgOiAnMCc7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Quc2VuZChhY3Rpb24sIHsgXG4gICAgICBhcHBpZCwgXG4gICAgICBsb2dpblR5cGUsIFxuICAgICAgaHlicmlkTWluaWFwcCxcbiAgICAgIHN5bmNVc2VySW5mbyxcbiAgICAgIGxvZ2luQ3JlZGVudGlhbDogY29kZSxcbiAgICAgIHdpdGhVbmlvbklkLFxuICAgICAgY3JlYXRlVXNlclxuICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMuY29kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFske2dldFNka05hbWUoKX1dWyR7RVJST1JTLk9QRVJBVElPTl9GQUlMfV0gZmFpbGVkIGxvZ2luIHZpYSB3ZWNoYXQ6ICR7cmVzLmNvZGV9YCk7XG4gICAgICB9XG4gICAgICBpZiAocmVzLnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZWZyZXNoVG9rZW46IHJlcy5yZWZyZXNoX3Rva2VuLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXMuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJlOiByZXMuYWNjZXNzX3Rva2VuX2V4cGlyZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbJHtnZXRTZGtOYW1lKCl9XVske0VSUk9SUy5PUEVSQVRJT05fRkFJTH1dIGFjdGlvbjpnZXRKd3Qgbm90IHJldHVybiByZWZyZXNoVG9rZW5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWl4aW5Db2RlICgpIHtcbiAgcmV0dXJuIGdldFF1ZXJ5KCdjb2RlJykgfHwgZ2V0SGFzaCgnY29kZScpO1xufTsiXX0=
|
package/src/common.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { ICloudbase } from '@cloudbase/types';
|
|
2
|
-
|
|
3
|
-
export const checkFromAuthV2 = async (_fromApp: ICloudbase) => {
|
|
4
|
-
// const authInstance = _fromApp.authInstance
|
|
5
|
-
const oauthInstance = _fromApp.oauthInstance || (_fromApp as any).oauth()
|
|
6
|
-
// const authLogin = authInstance && await authInstance.getLoginState()
|
|
7
|
-
// if (authLogin) {
|
|
8
|
-
// return {
|
|
9
|
-
// authType: 'auth',
|
|
10
|
-
// instance: authInstance
|
|
11
|
-
// }
|
|
12
|
-
// }
|
|
13
|
-
const oauthLogin = oauthInstance && await oauthInstance.hasLoginState()
|
|
14
|
-
if (oauthLogin) {
|
|
15
|
-
return {
|
|
16
|
-
authType: 'oauth',
|
|
17
|
-
instance: oauthInstance
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return {}
|
|
21
|
-
}
|
package/src/constants.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export enum LOGINTYPE {
|
|
2
|
-
ANONYMOUS = 'ANONYMOUS',
|
|
3
|
-
WECHAT = 'WECHAT',
|
|
4
|
-
WECHAT_PUBLIC = 'WECHAT-PUBLIC',
|
|
5
|
-
WECHAT_OPEN = 'WECHAT-OPEN',
|
|
6
|
-
CUSTOM = 'CUSTOM',
|
|
7
|
-
EMAIL = 'EMAIL',
|
|
8
|
-
USERNAME = 'USERNAME',
|
|
9
|
-
NULL = 'NULL',
|
|
10
|
-
PHONE = 'PHONE'
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const OAUTH2_LOGINTYPE_PREFIX = 'OAUTH2'
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { AuthProvider } from './base';
|
|
2
|
-
import { ICloudbaseAuthConfig, ILoginState } from '@cloudbase/types/auth';
|
|
3
|
-
import { constants, utils, helpers, events } from '@cloudbase/utilities';
|
|
4
|
-
import { ICloudbaseCache } from '@cloudbase/types/cache';
|
|
5
|
-
import { ICloudbaseRequest } from '@cloudbase/types/request';
|
|
6
|
-
import { LOGINTYPE } from '../constants';
|
|
7
|
-
import { EVENTS, eventBus, LoginState } from '..';
|
|
8
|
-
|
|
9
|
-
const { ERRORS, COMMUNITY_SITE_URL } = constants;
|
|
10
|
-
const { throwError, isString } = utils;
|
|
11
|
-
const { addEventListener } = events;
|
|
12
|
-
const { catchErrorsDecorator, stopAuthLoginWithOAuth } = helpers;
|
|
13
|
-
|
|
14
|
-
export class AnonymousAuthProvider extends AuthProvider {
|
|
15
|
-
constructor(config: ICloudbaseAuthConfig & { cache: ICloudbaseCache, request: ICloudbaseRequest }) {
|
|
16
|
-
super(config);
|
|
17
|
-
|
|
18
|
-
this._onConverted = this._onConverted.bind(this);
|
|
19
|
-
// 监听转正事件
|
|
20
|
-
addEventListener(EVENTS.ANONYMOUS_CONVERTED, this._onConverted);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@stopAuthLoginWithOAuth()
|
|
24
|
-
@catchErrorsDecorator({
|
|
25
|
-
title: '匿名登录失败',
|
|
26
|
-
messages: [
|
|
27
|
-
'请确认以下各项:',
|
|
28
|
-
' 1 - 当前环境是否开启了匿名登录',
|
|
29
|
-
' 2 - 调用 auth().anonymouseProvider().signIn() 的语法或参数是否正确',
|
|
30
|
-
`如果问题依然存在,建议到官方问答社区提问或寻找帮助:${COMMUNITY_SITE_URL}`
|
|
31
|
-
]
|
|
32
|
-
})
|
|
33
|
-
public async signIn(): Promise<ILoginState> {
|
|
34
|
-
// 匿名登录前迁移cache到localstorage
|
|
35
|
-
await this._cache.updatePersistenceAsync('local');
|
|
36
|
-
const { anonymousUuidKey, refreshTokenKey } = this._cache.keys;
|
|
37
|
-
// 如果本地存有uid则匿名登录时传给server
|
|
38
|
-
const anonymous_uuid = await this._cache.getStoreAsync(anonymousUuidKey);
|
|
39
|
-
// 此处cache为基类property
|
|
40
|
-
const refresh_token = await this._cache.getStoreAsync(refreshTokenKey);
|
|
41
|
-
|
|
42
|
-
const res = await this._request.send('auth.signInAnonymously', {
|
|
43
|
-
anonymous_uuid,
|
|
44
|
-
refresh_token
|
|
45
|
-
});
|
|
46
|
-
if (res.uuid && res.refresh_token) {
|
|
47
|
-
await this._setAnonymousUUID(res.uuid);
|
|
48
|
-
await this.setRefreshToken(res.refresh_token);
|
|
49
|
-
await this._request.refreshAccessToken();
|
|
50
|
-
|
|
51
|
-
eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, {
|
|
52
|
-
env: this._config.env,
|
|
53
|
-
loginType: LOGINTYPE.ANONYMOUS,
|
|
54
|
-
persistence: 'local'
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED);
|
|
58
|
-
|
|
59
|
-
const loginState = new LoginState({
|
|
60
|
-
envId: this._config.env,
|
|
61
|
-
cache: this._cache,
|
|
62
|
-
request: this._request
|
|
63
|
-
});
|
|
64
|
-
await loginState.checkLocalStateAsync();
|
|
65
|
-
await loginState.user.refresh();
|
|
66
|
-
return loginState;
|
|
67
|
-
} else {
|
|
68
|
-
throw new Error(JSON.stringify({
|
|
69
|
-
code: ERRORS.OPERATION_FAIL,
|
|
70
|
-
msg: JSON.stringify(res) || 'anonymous signIn failed'
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* 匿名转正
|
|
76
|
-
* @param ticket
|
|
77
|
-
*/
|
|
78
|
-
public async linkAndRetrieveDataWithTicket(ticket: string): Promise<ILoginState> {
|
|
79
|
-
if (!isString(ticket)) {
|
|
80
|
-
throwError(ERRORS.INVALID_PARAMS, 'ticket must be a string');
|
|
81
|
-
}
|
|
82
|
-
const { anonymousUuidKey, refreshTokenKey } = this._cache.keys;
|
|
83
|
-
const anonymous_uuid = await this._cache.getStoreAsync(anonymousUuidKey);
|
|
84
|
-
const refresh_token = await this._cache.getStoreAsync(refreshTokenKey);
|
|
85
|
-
const res = await this._request.send('auth.linkAndRetrieveDataWithTicket', {
|
|
86
|
-
anonymous_uuid,
|
|
87
|
-
refresh_token,
|
|
88
|
-
ticket
|
|
89
|
-
});
|
|
90
|
-
if (res.refresh_token) {
|
|
91
|
-
// 转正后清除本地保存的匿名uuid
|
|
92
|
-
await this._clearAnonymousUUID();
|
|
93
|
-
await this.setRefreshToken(res.refresh_token);
|
|
94
|
-
await this._request.refreshAccessToken();
|
|
95
|
-
eventBus.fire(EVENTS.ANONYMOUS_CONVERTED, { env: this._config.env });
|
|
96
|
-
eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, { loginType: LOGINTYPE.CUSTOM, persistence: 'local' });
|
|
97
|
-
const loginState = new LoginState({
|
|
98
|
-
envId: this._config.env,
|
|
99
|
-
cache: this._cache,
|
|
100
|
-
request: this._request
|
|
101
|
-
});
|
|
102
|
-
await loginState.checkLocalStateAsync();
|
|
103
|
-
|
|
104
|
-
return loginState;
|
|
105
|
-
} else {
|
|
106
|
-
throwError(ERRORS.OPERATION_FAIL, JSON.stringify(res) || 'linkAndRetrieveDataWithTicket failed');
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
private async _setAnonymousUUID(id: string) {
|
|
110
|
-
const { anonymousUuidKey, loginTypeKey } = this._cache.keys;
|
|
111
|
-
await this._cache.removeStoreAsync(anonymousUuidKey);
|
|
112
|
-
await this._cache.setStoreAsync(anonymousUuidKey, id);
|
|
113
|
-
await this._cache.setStoreAsync(loginTypeKey, LOGINTYPE.ANONYMOUS);
|
|
114
|
-
}
|
|
115
|
-
private async _clearAnonymousUUID() {
|
|
116
|
-
await this._cache.removeStoreAsync(this._cache.keys.anonymousUuidKey);
|
|
117
|
-
}
|
|
118
|
-
private async _onConverted(ev) {
|
|
119
|
-
const { env } = ev.data;
|
|
120
|
-
if (env !== this._config.env) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
// 匿名转正后迁移cache
|
|
124
|
-
await this._cache.updatePersistenceAsync(this._config.persistence);
|
|
125
|
-
}
|
|
126
|
-
}
|
package/src/providers/base.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { ICloudbaseConfig, ICloudbase } from '@cloudbase/types';
|
|
2
|
-
import { ICloudbaseCache } from '@cloudbase/types/cache';
|
|
3
|
-
import { ICloudbaseRequest } from '@cloudbase/types/request';
|
|
4
|
-
import { ICloudbaseAuthConfig } from '@cloudbase/types/auth';
|
|
5
|
-
import { LoginState } from '..';
|
|
6
|
-
|
|
7
|
-
export abstract class AuthProvider {
|
|
8
|
-
protected readonly _config: ICloudbaseConfig;
|
|
9
|
-
protected readonly _cache: ICloudbaseCache;
|
|
10
|
-
protected readonly _request: ICloudbaseRequest;
|
|
11
|
-
protected readonly _fromApp: ICloudbase;
|
|
12
|
-
|
|
13
|
-
constructor(config: ICloudbaseAuthConfig & { cache: ICloudbaseCache, request: ICloudbaseRequest }) {
|
|
14
|
-
this._config = config;
|
|
15
|
-
this._cache = config.cache;
|
|
16
|
-
this._request = config.request;
|
|
17
|
-
this._fromApp = config._fromApp
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 判断本地是否已经有登录态,如果有且没过期,则返回true,否则清理本地登录态
|
|
21
|
-
*/
|
|
22
|
-
protected async checkLocalLoginState() {
|
|
23
|
-
const { accessTokenKey, accessTokenExpireKey } = this._cache.keys;
|
|
24
|
-
const accessToken = await this._cache.getStoreAsync(accessTokenKey);
|
|
25
|
-
const accessTokenExpire = await this._cache.getStoreAsync(accessTokenExpireKey);
|
|
26
|
-
|
|
27
|
-
if (accessToken) {
|
|
28
|
-
if (accessTokenExpire && accessTokenExpire > Date.now()) {
|
|
29
|
-
// access存在且没有过期,那么直接返回
|
|
30
|
-
const loginState = new LoginState({
|
|
31
|
-
envId: this._config.env,
|
|
32
|
-
cache: this._cache,
|
|
33
|
-
request: this._request
|
|
34
|
-
});
|
|
35
|
-
await loginState.checkLocalStateAsync();
|
|
36
|
-
|
|
37
|
-
return loginState;
|
|
38
|
-
} else {
|
|
39
|
-
// access token存在但是过期了,那么删除掉重新拉
|
|
40
|
-
// await this._cache.removeStoreAsync(accessTokenKey);
|
|
41
|
-
// await this._cache.removeStoreAsync(accessTokenExpireKey);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
protected async setRefreshToken(refreshToken: string) {
|
|
46
|
-
const { accessTokenKey, accessTokenExpireKey, refreshTokenKey } = this._cache.keys;
|
|
47
|
-
// refresh token设置前,先清掉 access token
|
|
48
|
-
await this._cache.removeStoreAsync(accessTokenKey);
|
|
49
|
-
await this._cache.removeStoreAsync(accessTokenExpireKey);
|
|
50
|
-
await this._cache.setStoreAsync(refreshTokenKey, refreshToken);
|
|
51
|
-
}
|
|
52
|
-
protected async setAccessToken(accessToken: string, accessTokenExpire: string) {
|
|
53
|
-
const { accessTokenKey, accessTokenExpireKey } = this._cache.keys;
|
|
54
|
-
await this._cache.setStoreAsync(accessTokenKey, accessToken);
|
|
55
|
-
await this._cache.setStoreAsync(accessTokenExpireKey, accessTokenExpire);
|
|
56
|
-
}
|
|
57
|
-
protected async refreshUserInfo() {
|
|
58
|
-
const action = 'auth.getUserInfo';
|
|
59
|
-
const { data: userInfo } = await this._request.send(action, {});
|
|
60
|
-
await this.setLocalUserInfo(userInfo);
|
|
61
|
-
return userInfo;
|
|
62
|
-
}
|
|
63
|
-
protected async setLocalUserInfo(userInfo) {
|
|
64
|
-
const { userInfoKey } = this._cache.keys;
|
|
65
|
-
await this._cache.setStoreAsync(userInfoKey, userInfo);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// protected async stopAuthLoginWithOauth() {
|
|
69
|
-
// const { _fromApp } = this._config
|
|
70
|
-
// const checkRes = await checkFromAuthV1OrV2(_fromApp)
|
|
71
|
-
// const { authType } = checkRes
|
|
72
|
-
// console.log('authType', authType)
|
|
73
|
-
// if (authType === 'oauth') {
|
|
74
|
-
// throw Error('当前已使用 oauth 登录,请手动退出 oauth 登录后再进行 auth 登录')
|
|
75
|
-
// }
|
|
76
|
-
// }
|
|
77
|
-
abstract signIn(...args: any[]): Promise<any>;
|
|
78
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { utils, constants, helpers } from '@cloudbase/utilities';
|
|
3
|
-
import { ILoginState } from '@cloudbase/types/auth';
|
|
4
|
-
import { AuthProvider } from './base';
|
|
5
|
-
import { LOGINTYPE } from '../constants';
|
|
6
|
-
import { eventBus, EVENTS, LoginState } from '..';
|
|
7
|
-
|
|
8
|
-
const { ERRORS, COMMUNITY_SITE_URL } = constants;
|
|
9
|
-
const { isString } = utils;
|
|
10
|
-
const { catchErrorsDecorator, stopAuthLoginWithOAuth } = helpers;
|
|
11
|
-
|
|
12
|
-
export class CustomAuthProvider extends AuthProvider {
|
|
13
|
-
|
|
14
|
-
@stopAuthLoginWithOAuth()
|
|
15
|
-
@catchErrorsDecorator({
|
|
16
|
-
title: '自定义登录失败',
|
|
17
|
-
messages: [
|
|
18
|
-
'请确认以下各项:',
|
|
19
|
-
' 1 - 当前环境是否开启了自定义登录',
|
|
20
|
-
' 2 - 调用 auth().customAuthProvider().signIn() 的语法或参数是否正确',
|
|
21
|
-
' 3 - ticket 是否归属于当前环境',
|
|
22
|
-
' 4 - 创建 ticket 的自定义登录私钥是否过期',
|
|
23
|
-
`如果问题依然存在,建议到官方问答社区提问或寻找帮助:${COMMUNITY_SITE_URL}`
|
|
24
|
-
]
|
|
25
|
-
})
|
|
26
|
-
public async signIn(ticket: string): Promise<ILoginState> {
|
|
27
|
-
if (!isString(ticket)) {
|
|
28
|
-
throw new Error(JSON.stringify({
|
|
29
|
-
code: ERRORS.INVALID_PARAMS,
|
|
30
|
-
msg: 'ticket must be a string'
|
|
31
|
-
}));
|
|
32
|
-
}
|
|
33
|
-
const { refreshTokenKey } = this._cache.keys;
|
|
34
|
-
const res = await this._request.send('auth.signInWithTicket', {
|
|
35
|
-
ticket,
|
|
36
|
-
refresh_token: await this._cache.getStoreAsync(refreshTokenKey) || ''
|
|
37
|
-
});
|
|
38
|
-
if (res.refresh_token) {
|
|
39
|
-
// 保存新refresh token并且刷新access token
|
|
40
|
-
await this.setRefreshToken(res.refresh_token);
|
|
41
|
-
await this._request.refreshAccessToken();
|
|
42
|
-
|
|
43
|
-
eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, {
|
|
44
|
-
env: this._config.env,
|
|
45
|
-
loginType: LOGINTYPE.CUSTOM,
|
|
46
|
-
persistence: this._config.persistence
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED);
|
|
50
|
-
|
|
51
|
-
// set user info
|
|
52
|
-
await this.refreshUserInfo();
|
|
53
|
-
|
|
54
|
-
const loginState = new LoginState({
|
|
55
|
-
envId: this._config.env,
|
|
56
|
-
cache: this._cache,
|
|
57
|
-
request: this._request
|
|
58
|
-
});
|
|
59
|
-
await loginState.checkLocalStateAsync();
|
|
60
|
-
|
|
61
|
-
return loginState;
|
|
62
|
-
} else {
|
|
63
|
-
throw new Error(JSON.stringify({
|
|
64
|
-
code: ERRORS.OPERATION_FAIL,
|
|
65
|
-
msg: 'custom signIn failed'
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|