@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.
Files changed (56) hide show
  1. package/dist/cjs/index.d.ts +53 -101
  2. package/dist/cjs/index.js +431 -773
  3. package/dist/esm/index.d.ts +53 -101
  4. package/dist/esm/index.js +432 -770
  5. package/package.json +52 -54
  6. package/src/index.ts +409 -767
  7. package/dist/cjs/common.d.ts +0 -8
  8. package/dist/cjs/common.js +0 -64
  9. package/dist/cjs/constants.d.ts +0 -12
  10. package/dist/cjs/constants.js +0 -17
  11. package/dist/cjs/providers/anonymousAuthProvider.d.ts +0 -15
  12. package/dist/cjs/providers/anonymousAuthProvider.js +0 -256
  13. package/dist/cjs/providers/base.d.ts +0 -21
  14. package/dist/cjs/providers/base.js +0 -152
  15. package/dist/cjs/providers/customAuthProvider.d.ts +0 -5
  16. package/dist/cjs/providers/customAuthProvider.js +0 -150
  17. package/dist/cjs/providers/emailAuthProvider.d.ts +0 -9
  18. package/dist/cjs/providers/emailAuthProvider.js +0 -250
  19. package/dist/cjs/providers/oauth2AuthProvider.d.ts +0 -61
  20. package/dist/cjs/providers/oauth2AuthProvider.js +0 -404
  21. package/dist/cjs/providers/phoneAuthProvider.d.ts +0 -17
  22. package/dist/cjs/providers/phoneAuthProvider.js +0 -219
  23. package/dist/cjs/providers/usernameAuthProvider.d.ts +0 -5
  24. package/dist/cjs/providers/usernameAuthProvider.js +0 -169
  25. package/dist/cjs/providers/weixinAuthProvider.d.ts +0 -28
  26. package/dist/cjs/providers/weixinAuthProvider.js +0 -294
  27. package/dist/esm/common.d.ts +0 -8
  28. package/dist/esm/common.js +0 -61
  29. package/dist/esm/constants.d.ts +0 -12
  30. package/dist/esm/constants.js +0 -14
  31. package/dist/esm/providers/anonymousAuthProvider.d.ts +0 -15
  32. package/dist/esm/providers/anonymousAuthProvider.js +0 -253
  33. package/dist/esm/providers/base.d.ts +0 -21
  34. package/dist/esm/providers/base.js +0 -149
  35. package/dist/esm/providers/customAuthProvider.d.ts +0 -5
  36. package/dist/esm/providers/customAuthProvider.js +0 -147
  37. package/dist/esm/providers/emailAuthProvider.d.ts +0 -9
  38. package/dist/esm/providers/emailAuthProvider.js +0 -247
  39. package/dist/esm/providers/oauth2AuthProvider.d.ts +0 -61
  40. package/dist/esm/providers/oauth2AuthProvider.js +0 -401
  41. package/dist/esm/providers/phoneAuthProvider.d.ts +0 -17
  42. package/dist/esm/providers/phoneAuthProvider.js +0 -216
  43. package/dist/esm/providers/usernameAuthProvider.d.ts +0 -5
  44. package/dist/esm/providers/usernameAuthProvider.js +0 -166
  45. package/dist/esm/providers/weixinAuthProvider.d.ts +0 -28
  46. package/dist/esm/providers/weixinAuthProvider.js +0 -291
  47. package/src/common.ts +0 -21
  48. package/src/constants.ts +0 -13
  49. package/src/providers/anonymousAuthProvider.ts +0 -126
  50. package/src/providers/base.ts +0 -78
  51. package/src/providers/customAuthProvider.ts +0 -69
  52. package/src/providers/emailAuthProvider.ts +0 -142
  53. package/src/providers/oauth2AuthProvider.ts +0 -585
  54. package/src/providers/phoneAuthProvider.ts +0 -132
  55. package/src/providers/usernameAuthProvider.ts +0 -77
  56. 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
- }
@@ -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
- }