@ts-core/oauth 3.1.17 → 3.1.18
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/cjs/external/cordovaInAppBrowserTgPlugin.d.ts +8 -0
- package/cjs/external/cordovaInAppBrowserTgPlugin.js +106 -0
- package/cjs/external/index.d.ts +1 -0
- package/cjs/external/index.js +1 -0
- package/cjs/public-api.d.ts +1 -0
- package/cjs/public-api.js +1 -0
- package/cjs/tg/TgAuth.d.ts +2 -0
- package/cjs/tg/TgAuth.js +12 -0
- package/esm/external/cordovaInAppBrowserTgPlugin.d.ts +8 -0
- package/esm/external/cordovaInAppBrowserTgPlugin.js +102 -0
- package/esm/external/index.d.ts +1 -0
- package/esm/external/index.js +1 -0
- package/esm/public-api.d.ts +1 -0
- package/esm/public-api.js +1 -0
- package/esm/tg/TgAuth.d.ts +2 -0
- package/esm/tg/TgAuth.js +12 -0
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TgAuth } from '../tg/TgAuth';
|
|
2
|
+
export declare const TgAuthCordovaInAppBrowserPluginPropertiesSet: (item: TgAuth, options: ITgAuthCordovaInAppBrowserOptions) => void;
|
|
3
|
+
export interface ITgAuthCordovaInAppBrowserOptions {
|
|
4
|
+
origin: string;
|
|
5
|
+
returnUrl: string;
|
|
6
|
+
requestAccess?: 'write';
|
|
7
|
+
inAppBrowserOptions?: string;
|
|
8
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TgAuthCordovaInAppBrowserPluginPropertiesSet = void 0;
|
|
4
|
+
const common_1 = require("@ts-core/common");
|
|
5
|
+
const PopUpBase_1 = require("../PopUpBase");
|
|
6
|
+
const TgUser_1 = require("../tg/TgUser");
|
|
7
|
+
const _ = require("lodash");
|
|
8
|
+
const TgAuthCordovaInAppBrowserPluginPropertiesSet = (item, options) => {
|
|
9
|
+
let returnUrl = options.returnUrl;
|
|
10
|
+
let origin = options.origin;
|
|
11
|
+
let requestAccess = options.requestAccess;
|
|
12
|
+
let inAppBrowserOptions = !_.isNil(options.inAppBrowserOptions) ? options.inAppBrowserOptions : 'location=no,clearcache=yes,clearsessioncache=yes';
|
|
13
|
+
item.userProvider = (botId) => new Promise((resolve, reject) => {
|
|
14
|
+
let cordova = window['cordova'];
|
|
15
|
+
if (_.isNil(cordova) || _.isNil(cordova.InAppBrowser)) {
|
|
16
|
+
reject(new common_1.ExtendedError(`Cordova InAppBrowser undefined, please check installed plugins`));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let url = `https://oauth.telegram.org/auth?bot_id=${botId}`
|
|
20
|
+
+ `&origin=${encodeURIComponent(origin)}`
|
|
21
|
+
+ `&return_to=${encodeURIComponent(returnUrl)}`;
|
|
22
|
+
if (!_.isNil(requestAccess)) {
|
|
23
|
+
url += `&request_access=${requestAccess}`;
|
|
24
|
+
}
|
|
25
|
+
let popUp = cordova.InAppBrowser.open(url, '_blank', inAppBrowserOptions);
|
|
26
|
+
let isSettled = false;
|
|
27
|
+
let cleanup = () => {
|
|
28
|
+
popUp.removeEventListener('loadstart', onLoad);
|
|
29
|
+
popUp.removeEventListener('loadstop', onLoad);
|
|
30
|
+
popUp.removeEventListener('exit', onExit);
|
|
31
|
+
};
|
|
32
|
+
let onLoad = (event) => {
|
|
33
|
+
if (isSettled || _.isNil(event) || _.isNil(event.url) || event.url.indexOf(returnUrl) !== 0) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let user = parseTgAuthResult(event.url);
|
|
37
|
+
if (_.isNil(user)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
isSettled = true;
|
|
41
|
+
cleanup();
|
|
42
|
+
popUp.close();
|
|
43
|
+
resolve(user);
|
|
44
|
+
};
|
|
45
|
+
let onExit = () => {
|
|
46
|
+
cleanup();
|
|
47
|
+
if (!isSettled) {
|
|
48
|
+
reject(new common_1.ExtendedError(PopUpBase_1.PopUpBase.ERROR_WINDOW_CLOSED, PopUpBase_1.PopUpBase.ERROR_WINDOW_CLOSED));
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
popUp.addEventListener('loadstart', onLoad, false);
|
|
52
|
+
popUp.addEventListener('loadstop', onLoad, false);
|
|
53
|
+
popUp.addEventListener('exit', onExit, false);
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
exports.TgAuthCordovaInAppBrowserPluginPropertiesSet = TgAuthCordovaInAppBrowserPluginPropertiesSet;
|
|
57
|
+
function parseTgAuthResult(url) {
|
|
58
|
+
let raw = null;
|
|
59
|
+
let hashIndex = url.indexOf('#');
|
|
60
|
+
if (hashIndex >= 0) {
|
|
61
|
+
let value = new URLSearchParams(url.substring(hashIndex + 1)).get('tgAuthResult');
|
|
62
|
+
if (!_.isEmpty(value)) {
|
|
63
|
+
try {
|
|
64
|
+
raw = base64UrlDecode(value);
|
|
65
|
+
}
|
|
66
|
+
catch (error) { }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
let data = null;
|
|
70
|
+
if (!_.isNil(raw)) {
|
|
71
|
+
try {
|
|
72
|
+
data = JSON.parse(raw);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
let qIndex = url.indexOf('?');
|
|
80
|
+
if (qIndex < 0) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
let query = new URLSearchParams(url.substring(qIndex + 1, hashIndex >= 0 ? hashIndex : undefined));
|
|
84
|
+
if (_.isEmpty(query.get('hash'))) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
data = {};
|
|
88
|
+
query.forEach((v, k) => data[k] = v);
|
|
89
|
+
}
|
|
90
|
+
if (_.isNil(data) || _.isNil(data.hash)) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
let user = new TgUser_1.TgUser();
|
|
94
|
+
user.parse(data);
|
|
95
|
+
return user;
|
|
96
|
+
}
|
|
97
|
+
function base64UrlDecode(value) {
|
|
98
|
+
let normalized = value.replace(/-/g, '+').replace(/_/g, '/');
|
|
99
|
+
let pad = normalized.length % 4;
|
|
100
|
+
if (pad !== 0) {
|
|
101
|
+
normalized += '='.repeat(4 - pad);
|
|
102
|
+
}
|
|
103
|
+
let binary = atob(normalized);
|
|
104
|
+
let bytes = Uint8Array.from(binary, c => c.charCodeAt(0));
|
|
105
|
+
return new TextDecoder().decode(bytes);
|
|
106
|
+
}
|
package/cjs/external/index.d.ts
CHANGED
package/cjs/external/index.js
CHANGED
|
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./browser"), exports);
|
|
18
18
|
__exportStar(require("./cordovaOAuthPlugin"), exports);
|
|
19
19
|
__exportStar(require("./cordovaInAppBrowserPlugin"), exports);
|
|
20
|
+
__exportStar(require("./cordovaInAppBrowserTgPlugin"), exports);
|
package/cjs/public-api.d.ts
CHANGED
package/cjs/public-api.js
CHANGED
|
@@ -34,3 +34,4 @@ __exportStar(require("./keycloak/KeycloakUser"), exports);
|
|
|
34
34
|
__exportStar(require("./external/browser"), exports);
|
|
35
35
|
__exportStar(require("./external/cordovaOAuthPlugin"), exports);
|
|
36
36
|
__exportStar(require("./external/cordovaInAppBrowserPlugin"), exports);
|
|
37
|
+
__exportStar(require("./external/cordovaInAppBrowserTgPlugin"), exports);
|
package/cjs/tg/TgAuth.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export declare class TgAuth extends LoggerWrapper {
|
|
|
8
8
|
private static urlParseHashParams;
|
|
9
9
|
private static urlParseQueryString;
|
|
10
10
|
private static urlSafeDecode;
|
|
11
|
+
userProvider: ITgUserProvider;
|
|
11
12
|
protected promise: PromiseHandler<TgUser, ExtendedError>;
|
|
12
13
|
protected settings: ITgAuthSettings;
|
|
13
14
|
constructor(logger: ILogger, settings: ITgAuthSettings);
|
|
@@ -18,3 +19,4 @@ export interface ITgAuthSettings {
|
|
|
18
19
|
api: ITgApiLoader;
|
|
19
20
|
botId: number;
|
|
20
21
|
}
|
|
22
|
+
export type ITgUserProvider = (botId: number) => Promise<TgUser>;
|
package/cjs/tg/TgAuth.js
CHANGED
|
@@ -85,6 +85,18 @@ class TgAuth extends common_1.LoggerWrapper {
|
|
|
85
85
|
return this.promise.promise;
|
|
86
86
|
}
|
|
87
87
|
this.promise = common_1.PromiseHandler.create();
|
|
88
|
+
if (!_.isNil(this.userProvider)) {
|
|
89
|
+
this.userProvider(this.settings.botId)
|
|
90
|
+
.then(user => {
|
|
91
|
+
this.promise.resolve(user);
|
|
92
|
+
})
|
|
93
|
+
.catch(error => {
|
|
94
|
+
this.promise.reject(error instanceof common_1.ExtendedError ? error : new common_1.ExtendedError(error.message));
|
|
95
|
+
}).finally(() => {
|
|
96
|
+
this.promise = null;
|
|
97
|
+
});
|
|
98
|
+
return this.promise.promise;
|
|
99
|
+
}
|
|
88
100
|
this.settings.api.getApi()
|
|
89
101
|
.then(item => {
|
|
90
102
|
item.Login.auth({ bot_id: this.settings.botId }, item => {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TgAuth } from '../tg/TgAuth';
|
|
2
|
+
export declare const TgAuthCordovaInAppBrowserPluginPropertiesSet: (item: TgAuth, options: ITgAuthCordovaInAppBrowserOptions) => void;
|
|
3
|
+
export interface ITgAuthCordovaInAppBrowserOptions {
|
|
4
|
+
origin: string;
|
|
5
|
+
returnUrl: string;
|
|
6
|
+
requestAccess?: 'write';
|
|
7
|
+
inAppBrowserOptions?: string;
|
|
8
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ExtendedError } from '@ts-core/common';
|
|
2
|
+
import { PopUpBase } from '../PopUpBase';
|
|
3
|
+
import { TgUser } from '../tg/TgUser';
|
|
4
|
+
import * as _ from 'lodash';
|
|
5
|
+
export const TgAuthCordovaInAppBrowserPluginPropertiesSet = (item, options) => {
|
|
6
|
+
let returnUrl = options.returnUrl;
|
|
7
|
+
let origin = options.origin;
|
|
8
|
+
let requestAccess = options.requestAccess;
|
|
9
|
+
let inAppBrowserOptions = !_.isNil(options.inAppBrowserOptions) ? options.inAppBrowserOptions : 'location=no,clearcache=yes,clearsessioncache=yes';
|
|
10
|
+
item.userProvider = (botId) => new Promise((resolve, reject) => {
|
|
11
|
+
let cordova = window['cordova'];
|
|
12
|
+
if (_.isNil(cordova) || _.isNil(cordova.InAppBrowser)) {
|
|
13
|
+
reject(new ExtendedError(`Cordova InAppBrowser undefined, please check installed plugins`));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
let url = `https://oauth.telegram.org/auth?bot_id=${botId}`
|
|
17
|
+
+ `&origin=${encodeURIComponent(origin)}`
|
|
18
|
+
+ `&return_to=${encodeURIComponent(returnUrl)}`;
|
|
19
|
+
if (!_.isNil(requestAccess)) {
|
|
20
|
+
url += `&request_access=${requestAccess}`;
|
|
21
|
+
}
|
|
22
|
+
let popUp = cordova.InAppBrowser.open(url, '_blank', inAppBrowserOptions);
|
|
23
|
+
let isSettled = false;
|
|
24
|
+
let cleanup = () => {
|
|
25
|
+
popUp.removeEventListener('loadstart', onLoad);
|
|
26
|
+
popUp.removeEventListener('loadstop', onLoad);
|
|
27
|
+
popUp.removeEventListener('exit', onExit);
|
|
28
|
+
};
|
|
29
|
+
let onLoad = (event) => {
|
|
30
|
+
if (isSettled || _.isNil(event) || _.isNil(event.url) || event.url.indexOf(returnUrl) !== 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
let user = parseTgAuthResult(event.url);
|
|
34
|
+
if (_.isNil(user)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
isSettled = true;
|
|
38
|
+
cleanup();
|
|
39
|
+
popUp.close();
|
|
40
|
+
resolve(user);
|
|
41
|
+
};
|
|
42
|
+
let onExit = () => {
|
|
43
|
+
cleanup();
|
|
44
|
+
if (!isSettled) {
|
|
45
|
+
reject(new ExtendedError(PopUpBase.ERROR_WINDOW_CLOSED, PopUpBase.ERROR_WINDOW_CLOSED));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
popUp.addEventListener('loadstart', onLoad, false);
|
|
49
|
+
popUp.addEventListener('loadstop', onLoad, false);
|
|
50
|
+
popUp.addEventListener('exit', onExit, false);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
function parseTgAuthResult(url) {
|
|
54
|
+
let raw = null;
|
|
55
|
+
let hashIndex = url.indexOf('#');
|
|
56
|
+
if (hashIndex >= 0) {
|
|
57
|
+
let value = new URLSearchParams(url.substring(hashIndex + 1)).get('tgAuthResult');
|
|
58
|
+
if (!_.isEmpty(value)) {
|
|
59
|
+
try {
|
|
60
|
+
raw = base64UrlDecode(value);
|
|
61
|
+
}
|
|
62
|
+
catch (error) { }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
let data = null;
|
|
66
|
+
if (!_.isNil(raw)) {
|
|
67
|
+
try {
|
|
68
|
+
data = JSON.parse(raw);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
let qIndex = url.indexOf('?');
|
|
76
|
+
if (qIndex < 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
let query = new URLSearchParams(url.substring(qIndex + 1, hashIndex >= 0 ? hashIndex : undefined));
|
|
80
|
+
if (_.isEmpty(query.get('hash'))) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
data = {};
|
|
84
|
+
query.forEach((v, k) => data[k] = v);
|
|
85
|
+
}
|
|
86
|
+
if (_.isNil(data) || _.isNil(data.hash)) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
let user = new TgUser();
|
|
90
|
+
user.parse(data);
|
|
91
|
+
return user;
|
|
92
|
+
}
|
|
93
|
+
function base64UrlDecode(value) {
|
|
94
|
+
let normalized = value.replace(/-/g, '+').replace(/_/g, '/');
|
|
95
|
+
let pad = normalized.length % 4;
|
|
96
|
+
if (pad !== 0) {
|
|
97
|
+
normalized += '='.repeat(4 - pad);
|
|
98
|
+
}
|
|
99
|
+
let binary = atob(normalized);
|
|
100
|
+
let bytes = Uint8Array.from(binary, c => c.charCodeAt(0));
|
|
101
|
+
return new TextDecoder().decode(bytes);
|
|
102
|
+
}
|
package/esm/external/index.d.ts
CHANGED
package/esm/external/index.js
CHANGED
package/esm/public-api.d.ts
CHANGED
package/esm/public-api.js
CHANGED
package/esm/tg/TgAuth.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export declare class TgAuth extends LoggerWrapper {
|
|
|
8
8
|
private static urlParseHashParams;
|
|
9
9
|
private static urlParseQueryString;
|
|
10
10
|
private static urlSafeDecode;
|
|
11
|
+
userProvider: ITgUserProvider;
|
|
11
12
|
protected promise: PromiseHandler<TgUser, ExtendedError>;
|
|
12
13
|
protected settings: ITgAuthSettings;
|
|
13
14
|
constructor(logger: ILogger, settings: ITgAuthSettings);
|
|
@@ -18,3 +19,4 @@ export interface ITgAuthSettings {
|
|
|
18
19
|
api: ITgApiLoader;
|
|
19
20
|
botId: number;
|
|
20
21
|
}
|
|
22
|
+
export type ITgUserProvider = (botId: number) => Promise<TgUser>;
|
package/esm/tg/TgAuth.js
CHANGED
|
@@ -82,6 +82,18 @@ export class TgAuth extends LoggerWrapper {
|
|
|
82
82
|
return this.promise.promise;
|
|
83
83
|
}
|
|
84
84
|
this.promise = PromiseHandler.create();
|
|
85
|
+
if (!_.isNil(this.userProvider)) {
|
|
86
|
+
this.userProvider(this.settings.botId)
|
|
87
|
+
.then(user => {
|
|
88
|
+
this.promise.resolve(user);
|
|
89
|
+
})
|
|
90
|
+
.catch(error => {
|
|
91
|
+
this.promise.reject(error instanceof ExtendedError ? error : new ExtendedError(error.message));
|
|
92
|
+
}).finally(() => {
|
|
93
|
+
this.promise = null;
|
|
94
|
+
});
|
|
95
|
+
return this.promise.promise;
|
|
96
|
+
}
|
|
85
97
|
this.settings.api.getApi()
|
|
86
98
|
.then(item => {
|
|
87
99
|
item.Login.auth({ bot_id: this.settings.botId }, item => {
|