ngx-oauth 4.2.3 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +17 -16
- package/components/index.d.ts +1 -0
- package/components/{login/oauth-login.component.d.ts → o-auth-login.component.d.ts} +7 -9
- package/config/index.d.ts +17 -0
- package/esm2022/components/index.mjs +2 -0
- package/esm2022/components/o-auth-login.component.mjs +261 -0
- package/esm2022/config/index.mjs +32 -0
- package/esm2022/index.mjs +8 -0
- package/esm2022/models/index.mjs +16 -0
- package/esm2022/services/index.mjs +5 -0
- package/esm2022/services/o-auth-http-client.mjs +15 -0
- package/esm2022/services/o-auth-token.service.mjs +80 -0
- package/esm2022/services/o-auth.interceptor.mjs +43 -0
- package/esm2022/services/o-auth.service.mjs +302 -0
- package/fesm2022/ngx-oauth.mjs +731 -0
- package/fesm2022/ngx-oauth.mjs.map +1 -0
- package/index.d.ts +3 -5
- package/models/index.d.ts +3 -22
- package/package.json +10 -18
- package/services/index.d.ts +4 -0
- package/services/o-auth-http-client.d.ts +6 -0
- package/services/{token.service.d.ts → o-auth-token.service.d.ts} +5 -6
- package/services/o-auth.interceptor.d.ts +2 -0
- package/services/{oauth.service.d.ts → o-auth.service.d.ts} +5 -5
- package/esm2020/components/login/oauth-login.component.mjs +0 -123
- package/esm2020/index.mjs +0 -10
- package/esm2020/models/index.mjs +0 -47
- package/esm2020/oauth.module.mjs +0 -120
- package/esm2020/services/oauth.interceptor.mjs +0 -53
- package/esm2020/services/oauth.service.mjs +0 -300
- package/esm2020/services/token.service.mjs +0 -83
- package/fesm2015/ngx-oauth.mjs +0 -642
- package/fesm2015/ngx-oauth.mjs.map +0 -1
- package/fesm2020/ngx-oauth.mjs +0 -701
- package/fesm2020/ngx-oauth.mjs.map +0 -1
- package/oauth.module.d.ts +0 -14
- package/services/oauth.interceptor.d.ts +0 -13
- /package/{esm2020 → esm2022}/ngx-oauth.mjs +0 -0
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
var _OAuthTokenService_token$;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Inject, Injectable } from '@angular/core';
|
|
4
|
-
import { BehaviorSubject, distinctUntilChanged, of, switchMap } from 'rxjs';
|
|
5
|
-
import { HEADER_APPLICATION, OAUTH_HTTP_CLIENT } from '../models';
|
|
6
|
-
import { catchError, map, shareReplay } from 'rxjs/operators';
|
|
7
|
-
import { HttpParams } from '@angular/common/http';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "../models";
|
|
10
|
-
import * as i2 from "@angular/common/http";
|
|
11
|
-
const isExpiredToken = (token) => token && token.expires && Date.now() > token.expires || false;
|
|
12
|
-
export class OAuthTokenService {
|
|
13
|
-
constructor(authConfig, http, zone) {
|
|
14
|
-
this.authConfig = authConfig;
|
|
15
|
-
this.http = http;
|
|
16
|
-
this.zone = zone;
|
|
17
|
-
_OAuthTokenService_token$.set(this, new BehaviorSubject(this.saved));
|
|
18
|
-
this.token$ = __classPrivateFieldGet(this, _OAuthTokenService_token$, "f").pipe(distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)), shareReplay(1), switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)));
|
|
19
|
-
this.type$ = this.token$.pipe(map(token => token?.type), shareReplay(1));
|
|
20
|
-
this.accessToken$ = this.token$.pipe(map(token => token?.access_token), shareReplay(1));
|
|
21
|
-
}
|
|
22
|
-
get token() {
|
|
23
|
-
return __classPrivateFieldGet(this, _OAuthTokenService_token$, "f").value;
|
|
24
|
-
}
|
|
25
|
-
set token(token) {
|
|
26
|
-
const expiresIn = Number(token.expires_in) || 0;
|
|
27
|
-
const result = {
|
|
28
|
-
...token,
|
|
29
|
-
...expiresIn && { expires: Date.now() + expiresIn * 1000 } || {}
|
|
30
|
-
};
|
|
31
|
-
this.saved = result;
|
|
32
|
-
__classPrivateFieldGet(this, _OAuthTokenService_token$, "f").next(result);
|
|
33
|
-
}
|
|
34
|
-
get saved() {
|
|
35
|
-
const { storageKey, storage } = this.authConfig;
|
|
36
|
-
return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};
|
|
37
|
-
}
|
|
38
|
-
set saved(token) {
|
|
39
|
-
const { storageKey, storage } = this.authConfig;
|
|
40
|
-
if (storage && storageKey) {
|
|
41
|
-
if (token) {
|
|
42
|
-
storage[storageKey] = JSON.stringify(token);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
delete storage[storageKey];
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
refreshToken(token) {
|
|
50
|
-
const { tokenPath, clientId, clientSecret, scope } = this.authConfig.config;
|
|
51
|
-
const { refresh_token } = token || {};
|
|
52
|
-
return tokenPath && refresh_token && this.http.post(tokenPath, new HttpParams({
|
|
53
|
-
fromObject: {
|
|
54
|
-
client_id: clientId,
|
|
55
|
-
...clientSecret && { client_secret: clientSecret } || {},
|
|
56
|
-
grant_type: 'refresh_token',
|
|
57
|
-
refresh_token,
|
|
58
|
-
...scope && { scope } || {},
|
|
59
|
-
}
|
|
60
|
-
}), {
|
|
61
|
-
headers: HEADER_APPLICATION
|
|
62
|
-
}).pipe(catchError(() => {
|
|
63
|
-
this.token = {};
|
|
64
|
-
return of(this.token);
|
|
65
|
-
}), map(token => {
|
|
66
|
-
this.token = {
|
|
67
|
-
...this.token,
|
|
68
|
-
...token
|
|
69
|
-
};
|
|
70
|
-
return this.token;
|
|
71
|
-
})) || of(token);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
_OAuthTokenService_token$ = new WeakMap();
|
|
75
|
-
OAuthTokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthTokenService, deps: [{ token: i1.OAuthConfig }, { token: OAUTH_HTTP_CLIENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
76
|
-
OAuthTokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthTokenService });
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthTokenService, decorators: [{
|
|
78
|
-
type: Injectable
|
|
79
|
-
}], ctorParameters: function () { return [{ type: i1.OAuthConfig }, { type: i2.HttpClient, decorators: [{
|
|
80
|
-
type: Inject,
|
|
81
|
-
args: [OAUTH_HTTP_CLIENT]
|
|
82
|
-
}] }, { type: i0.NgZone }]; } });
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQTBCLE1BQU0sV0FBVyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBYSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUU1RCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztBQUc3RyxNQUFNLE9BQU8saUJBQWlCO0lBaUI1QixZQUFzQixVQUF1QixFQUNJLElBQWdCLEVBQzNDLElBQVk7UUFGWixlQUFVLEdBQVYsVUFBVSxDQUFhO1FBQ0ksU0FBSSxHQUFKLElBQUksQ0FBWTtRQUMzQyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBakJsQyxvQ0FBVSxJQUFJLGVBQWUsQ0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUM7UUFDdEQsV0FBTSxHQUFHLHVCQUFBLElBQUksaUNBQVEsQ0FBQyxJQUFJLENBQ3hCLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxD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RUFBRTtZQUNGLE9BQU8sRUFBRSxrQkFBa0I7U0FDNUIsQ0FBQyxDQUFDLElBQUksQ0FDTCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsR0FBRyxJQUFJLENBQUMsS0FBSztnQkFDYixHQUFHLEtBQUs7YUFDVCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUNILElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7Ozs4R0E5RVUsaUJBQWlCLDZDQWtCUixpQkFBaUI7a0hBbEIxQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTs7MEJBbUJJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtIRUFERVJfQVBQTElDQVRJT04sIE9BVVRIX0hUVFBfQ0xJRU5ULCBPQXV0aENvbmZpZywgT0F1dGhUb2tlbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwLCBzaGFyZVJlcGxheX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmNvbnN0IGlzRXhwaXJlZFRva2VuID0gKHRva2VuPzogT0F1dGhUb2tlbikgPT4gdG9rZW4gJiYgdG9rZW4uZXhwaXJlcyAmJiBEYXRlLm5vdygpID4gdG9rZW4uZXhwaXJlcyB8fCBmYWxzZTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoVG9rZW5TZXJ2aWNlIHtcblxuICAjdG9rZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPQXV0aFRva2VuPih0aGlzLnNhdmVkKTtcbiAgdG9rZW4kID0gdGhpcy4jdG9rZW4kLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IEpTT04uc3RyaW5naWZ5KHAgfHwgbnVsbCkgPT09IEpTT04uc3RyaW5naWZ5KGMgfHwgbnVsbCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgIHN3aXRjaE1hcCh0b2tlbiA9PiAhaXNFeHBpcmVkVG9rZW4odG9rZW4pICYmIG9mKHRva2VuKSB8fCB0aGlzLnJlZnJlc2hUb2tlbih0b2tlbikpLFxuICApO1xuICB0eXBlJCA9IHRoaXMudG9rZW4kLnBpcGUoXG4gICAgbWFwKHRva2VuID0+IHRva2VuPy50eXBlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICBhY2Nlc3NUb2tlbiQgPSB0aGlzLnRva2VuJC5waXBlKFxuICAgIG1hcCh0b2tlbiA9PiB0b2tlbj8uYWNjZXNzX3Rva2VuKSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXV0aENvbmZpZzogT0F1dGhDb25maWcsXG4gICAgICAgICAgICAgIEBJbmplY3QoT0FVVEhfSFRUUF9DTElFTlQpIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lKSB7XG4gIH1cblxuICBnZXQgdG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Rva2VuJC52YWx1ZTtcbiAgfVxuXG4gIHNldCB0b2tlbih0b2tlbikge1xuICAgIGNvbnN0IGV4cGlyZXNJbiA9IE51bWJlcih0b2tlbi5leHBpcmVzX2luKSB8fCAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIC4uLnRva2VuLFxuICAgICAgLi4uZXhwaXJlc0luICYmIHtleHBpcmVzOiBEYXRlLm5vdygpICsgZXhwaXJlc0luICogMTAwMH0gfHwge31cbiAgICB9O1xuICAgIHRoaXMuc2F2ZWQgPSByZXN1bHQ7XG4gICAgdGhpcy4jdG9rZW4kLm5leHQocmVzdWx0KTtcbiAgfVxuXG4gIGdldCBzYXZlZCgpIHtcbiAgICBjb25zdCB7c3RvcmFnZUtleSwgc3RvcmFnZX0gPSB0aGlzLmF1dGhDb25maWc7XG4gICAgcmV0dXJuIHN0b3JhZ2VLZXkgJiYgc3RvcmFnZSAmJiBzdG9yYWdlW3N0b3JhZ2VLZXldICYmIEpTT04ucGFyc2Uoc3RvcmFnZVtzdG9yYWdlS2V5XSkgfHwge307XG4gIH1cblxuICBzZXQgc2F2ZWQodG9rZW46IE9BdXRoVG9rZW4pIHtcbiAgICBjb25zdCB7c3RvcmFnZUtleSwgc3RvcmFnZX0gPSB0aGlzLmF1dGhDb25maWc7XG4gICAgaWYgKHN0b3JhZ2UgJiYgc3RvcmFnZUtleSkge1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBKU09OLnN0cmluZ2lmeSh0b2tlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgc3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFRva2VuKHRva2VuPzogT0F1dGhUb2tlbik6IE9ic2VydmFibGU8T0F1dGhUb2tlbj4ge1xuICAgIGNvbnN0IHt0b2tlblBhdGgsIGNsaWVudElkLCBjbGllbnRTZWNyZXQsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHtyZWZyZXNoX3Rva2VufSA9IHRva2VuIHx8IHt9O1xuICAgIHJldHVybiB0b2tlblBhdGggJiYgcmVmcmVzaF90b2tlbiAmJiB0aGlzLmh0dHAucG9zdDxPQXV0aFRva2VuPih0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgIHJlZnJlc2hfdG9rZW4sXG4gICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICB9XG4gICAgfSksIHtcbiAgICAgIGhlYWRlcnM6IEhFQURFUl9BUFBMSUNBVElPTlxuICAgIH0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHt9O1xuICAgICAgICByZXR1cm4gb2YodGhpcy50b2tlbik7XG4gICAgICB9KSxcbiAgICAgIG1hcCh0b2tlbiA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4udGhpcy50b2tlbixcbiAgICAgICAgICAuLi50b2tlblxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgICAgIH0pXG4gICAgKSB8fCBvZih0b2tlbik7XG4gIH1cbn1cbiJdfQ==
|