@point3/logto-module 1.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/README.md +224 -0
- package/client/__tests__/m2m-client.spec.ts +60 -0
- package/client/__tests__/oauth-client.spec.ts +43 -0
- package/client/config.ts +79 -0
- package/client/index.ts +5 -0
- package/client/logto-login-session.ts +239 -0
- package/client/m2m-client.ts +428 -0
- package/client/oauth-client.ts +231 -0
- package/client/types.ts +136 -0
- package/dist/client/__tests__/m2m-client.spec.d.ts +1 -0
- package/dist/client/__tests__/m2m-client.spec.js +55 -0
- package/dist/client/__tests__/m2m-client.spec.js.map +1 -0
- package/dist/client/__tests__/oauth-client.spec.d.ts +1 -0
- package/dist/client/__tests__/oauth-client.spec.js +40 -0
- package/dist/client/__tests__/oauth-client.spec.js.map +1 -0
- package/dist/client/config.d.ts +21 -0
- package/dist/client/config.js +16 -0
- package/dist/client/config.js.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.js +22 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/logto-login-session.d.ts +28 -0
- package/dist/client/logto-login-session.js +128 -0
- package/dist/client/logto-login-session.js.map +1 -0
- package/dist/client/m2m-client.d.ts +34 -0
- package/dist/client/m2m-client.js +201 -0
- package/dist/client/m2m-client.js.map +1 -0
- package/dist/client/oauth-client.d.ts +25 -0
- package/dist/client/oauth-client.js +135 -0
- package/dist/client/oauth-client.js.map +1 -0
- package/dist/client/types.d.ts +45 -0
- package/dist/client/types.js +37 -0
- package/dist/client/types.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.js +62 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/module.d.ts +4 -0
- package/dist/module.js +47 -0
- package/dist/module.js.map +1 -0
- package/dist/stateless/decorator.d.ts +7 -0
- package/dist/stateless/decorator.js +10 -0
- package/dist/stateless/decorator.js.map +1 -0
- package/dist/stateless/guard.d.ts +10 -0
- package/dist/stateless/guard.js +102 -0
- package/dist/stateless/guard.js.map +1 -0
- package/dist/stateless/guard.spec.d.ts +1 -0
- package/dist/stateless/guard.spec.js +210 -0
- package/dist/stateless/guard.spec.js.map +1 -0
- package/dist/stateless/index.d.ts +2 -0
- package/dist/stateless/index.js +19 -0
- package/dist/stateless/index.js.map +1 -0
- package/dist/token/access-token.d.ts +31 -0
- package/dist/token/access-token.js +19 -0
- package/dist/token/access-token.js.map +1 -0
- package/dist/token/index.d.ts +2 -0
- package/dist/token/index.js +19 -0
- package/dist/token/index.js.map +1 -0
- package/dist/token/verifier.d.ts +13 -0
- package/dist/token/verifier.js +66 -0
- package/dist/token/verifier.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/errors.ts +58 -0
- package/index.ts +13 -0
- package/jest.config.js +6 -0
- package/module.ts +85 -0
- package/package.json +33 -0
- package/stateless/decorator.ts +16 -0
- package/stateless/guard.spec.ts +305 -0
- package/stateless/guard.ts +76 -0
- package/stateless/index.ts +2 -0
- package/token/access-token.ts +48 -0
- package/token/index.ts +2 -0
- package/token/verifier.ts +101 -0
- package/tsconfig.json +23 -0
package/client/types.ts
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { axiosAdapter, p3Values } from 'point3-common-tool';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* LogtoUserAlreadyExistsError
|
|
5
|
+
*
|
|
6
|
+
* 사용자 생성 시 이미 동일한 사용자가 존재할 경우 발생하는 에러입니다.
|
|
7
|
+
* 사용자 중복 체크 및 예외 처리에 사용됩니다.
|
|
8
|
+
*/
|
|
9
|
+
export class LogtoUserAlreadyExistsError extends Error {
|
|
10
|
+
constructor(message: string) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'UserAlreadyExistsError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* LogtoPasswordAlgorithm
|
|
18
|
+
*
|
|
19
|
+
* Logto에서 지원하는 비밀번호 해시 알고리즘 Enum입니다.
|
|
20
|
+
* - Argon2i, Argon2id, Argon2d: Argon2 계열(권장)
|
|
21
|
+
* - SHA1, Bcrypt: 기타 호환 알고리즘
|
|
22
|
+
* 기본값은 Argon2i 입니다.
|
|
23
|
+
*/
|
|
24
|
+
export enum LogtoPasswordAlgorithm {
|
|
25
|
+
Argon2i = 'Argon2i',
|
|
26
|
+
Argon2id = 'Argon2id',
|
|
27
|
+
Argon2d = 'Argon2d',
|
|
28
|
+
SHA1 = 'SHA1',
|
|
29
|
+
Bcrypt = 'Bcrypt',
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* LogtoUser
|
|
34
|
+
*
|
|
35
|
+
* Logto 사용자 생성/수정 시 사용하는 타입입니다.
|
|
36
|
+
* - username: Guid 문자열
|
|
37
|
+
* - primaryPhone: 대표 휴대폰번호
|
|
38
|
+
* - primaryEmail: 대표 이메일
|
|
39
|
+
* - password: 비밀번호(필수)
|
|
40
|
+
* - passwordAlgorithm: 비밀번호 해시 알고리즘(기본값 Argon2i)
|
|
41
|
+
* - name: 사용자 이름
|
|
42
|
+
* - avatar: 프로필 이미지(선택)
|
|
43
|
+
* - customData: 추가 사용자 데이터(선택)
|
|
44
|
+
*/
|
|
45
|
+
export type LogtoUser = {
|
|
46
|
+
username: string; // Guid's string value(dash to underscore)
|
|
47
|
+
primaryPhone: string;
|
|
48
|
+
primaryEmail: string;
|
|
49
|
+
password: string;
|
|
50
|
+
passwordAlgorithm?: LogtoPasswordAlgorithm; // default: Argon2i
|
|
51
|
+
name: string;
|
|
52
|
+
avatar?: string;
|
|
53
|
+
customData?: Record<string, any>;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* LogtoUserResponse
|
|
58
|
+
*
|
|
59
|
+
* 사용자 생성/조회 시 반환되는 타입입니다.
|
|
60
|
+
* - id: 사용자 고유 ID
|
|
61
|
+
* - LogtoUser의 모든 필드 포함
|
|
62
|
+
*/
|
|
63
|
+
export type LogtoUserResponse = { id: string } & LogtoUser;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* LogtoRole
|
|
67
|
+
*
|
|
68
|
+
* Logto 역할(Role) 생성/수정 시 사용하는 타입입니다.
|
|
69
|
+
* - name: 역할 이름
|
|
70
|
+
* - description: 역할 설명
|
|
71
|
+
* - type: 역할 유형(User, MachineToMachine 등)
|
|
72
|
+
* - isDefault: 기본 역할 여부(선택)
|
|
73
|
+
*/
|
|
74
|
+
export type LogtoRole = {
|
|
75
|
+
name: string;
|
|
76
|
+
description: string;
|
|
77
|
+
type: string; // User, MachineToMachine
|
|
78
|
+
isDefault?: boolean;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* LogtoRoleResponse
|
|
83
|
+
*
|
|
84
|
+
* 역할 생성/조회 시 반환되는 타입입니다.
|
|
85
|
+
* - id: 역할 고유 ID
|
|
86
|
+
* - LogtoRole의 모든 필드 포함
|
|
87
|
+
*/
|
|
88
|
+
export type LogtoRoleResponse = { id: string } & LogtoRole;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* VerificationMethodType
|
|
92
|
+
*
|
|
93
|
+
* 인증코드(Verification Code) 발송 시 사용할 수 있는 인증 수단 타입입니다.
|
|
94
|
+
* - phone: 휴대폰 인증(p3Values.PhoneNumber)
|
|
95
|
+
* - email: 이메일 인증(p3Values.Email)
|
|
96
|
+
*
|
|
97
|
+
* 예시:
|
|
98
|
+
* VerificationMethodType.phone
|
|
99
|
+
* VerificationMethodType.email
|
|
100
|
+
*/
|
|
101
|
+
export class VerificationMethodType {
|
|
102
|
+
static phone = p3Values.PhoneNumber;
|
|
103
|
+
static email = p3Values.Email;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* SMSVerificationResponse
|
|
108
|
+
*
|
|
109
|
+
* SMS 인증코드 발송 시 반환되는 응답 객체입니다.
|
|
110
|
+
* - verificationId: 인증 세션 고유 ID
|
|
111
|
+
* - expiresAt: 만료 시각(ISO8601 문자열)
|
|
112
|
+
*/
|
|
113
|
+
export class SMSVerificationResponse {
|
|
114
|
+
verificationId: string;
|
|
115
|
+
expiresAt: string;
|
|
116
|
+
|
|
117
|
+
constructor(verificationId: string, expiresAt: string) {
|
|
118
|
+
this.verificationId = verificationId;
|
|
119
|
+
this.expiresAt = expiresAt;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* LogtoOAuthRESTTemplate
|
|
125
|
+
*
|
|
126
|
+
* Logto OAuth 및 API 요청을 위한 REST 템플릿 클래스입니다.
|
|
127
|
+
* axiosAdapter.RESTTemplate을 상속하여, 인증/권한 관련 요청에 사용됩니다.
|
|
128
|
+
*/
|
|
129
|
+
export class LogtoOAuthRESTTemplate extends axiosAdapter.RESTTemplate {};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* LogtoLoggerServiceToken
|
|
133
|
+
*
|
|
134
|
+
* DI(의존성 주입)에서 사용되는 로거 서비스 토큰입니다.
|
|
135
|
+
*/
|
|
136
|
+
export const LogtoLoggerServiceToken = Symbol.for("LogtoLoggerService");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const config_1 = require("@nestjs/config");
|
|
5
|
+
const point3_common_tool_1 = require("point3-common-tool");
|
|
6
|
+
const __1 = require("..");
|
|
7
|
+
const token_1 = require("../../token");
|
|
8
|
+
const common_1 = require("@nestjs/common");
|
|
9
|
+
describe('M2mclient를 이용한 Logto API 테스트', () => {
|
|
10
|
+
let m2mClient;
|
|
11
|
+
let testUser;
|
|
12
|
+
let testUserId = 'bead71jr45u1';
|
|
13
|
+
let testRoleId = '0fwcgs8okjy7lav216sb3';
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
const module = await testing_1.Test.createTestingModule({
|
|
16
|
+
imports: [
|
|
17
|
+
config_1.ConfigModule.forRoot({
|
|
18
|
+
envFilePath: `env/.env.${process.env.NODE_ENV}`,
|
|
19
|
+
isGlobal: true,
|
|
20
|
+
})
|
|
21
|
+
],
|
|
22
|
+
providers: [
|
|
23
|
+
{
|
|
24
|
+
provide: token_1.LogtoTokenVerifierToken,
|
|
25
|
+
useClass: token_1.LogtoTokenVerifier
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
provide: __1.LogtoLoggerServiceToken,
|
|
29
|
+
useClass: common_1.ConsoleLogger
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
}).compile();
|
|
33
|
+
m2mClient = module.get(__1.LogtoM2MClientToken);
|
|
34
|
+
const randomNumber = Math.floor(1000 + Math.random() * 9000);
|
|
35
|
+
testUser = {
|
|
36
|
+
username: point3_common_tool_1.p3Values.Guid.create('test').toString().replace(/-/g, '_'),
|
|
37
|
+
name: 'test' + randomNumber,
|
|
38
|
+
primaryEmail: 'test' + randomNumber + '@test.com',
|
|
39
|
+
password: 'test123',
|
|
40
|
+
primaryPhone: '0101111' + randomNumber,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
it('유저 생성', async () => {
|
|
44
|
+
const userId = await m2mClient.createUser(testUser);
|
|
45
|
+
expect(userId).toBeDefined();
|
|
46
|
+
testUserId = userId;
|
|
47
|
+
});
|
|
48
|
+
it('토큰 발급', async () => {
|
|
49
|
+
await m2mClient.fetchAccessToken();
|
|
50
|
+
});
|
|
51
|
+
it('유저 정보 수정', async () => {
|
|
52
|
+
await m2mClient.updateUserClientInfo(testUserId);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=m2m-client.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"m2m-client.spec.js","sourceRoot":"","sources":["../../../client/__tests__/m2m-client.spec.ts"],"names":[],"mappings":";;AACA,6CAAsD;AACtD,2CAA8C;AAC9C,2DAA8C;AAE9C,0BAA6F;AAC7F,uCAA0E;AAC1E,2CAA+C;AAE/C,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC1C,IAAI,SAAyB,CAAC;IAC9B,IAAI,QAAoB,CAAC;IACzB,IAAI,UAAU,GAAY,cAAc,CAAC;IACzC,IAAI,UAAU,GAAY,uBAAuB,CAAC;IAClD,SAAS,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACzD,OAAO,EAAE;gBACL,qBAAY,CAAC,OAAO,CAAC;oBACjB,WAAW,EAAE,YAAY,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAC/C,QAAQ,EAAE,IAAI;iBACjB,CAAC;aACL;YACD,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,+BAAuB;oBAChC,QAAQ,EAAE,0BAAkB;iBAC/B;gBACD;oBACI,OAAO,EAAE,2BAAuB;oBAChC,QAAQ,EAAE,sBAAa;iBAC1B;aACJ;SACJ,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,SAAS,GAAG,MAAM,CAAC,GAAG,CAAiB,uBAAmB,CAAC,CAAC;QAG5D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7D,QAAQ,GAAG;YACP,QAAQ,EAAE,6BAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YACpE,IAAI,EAAE,MAAM,GAAG,YAAY;YAC3B,YAAY,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW;YACjD,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,SAAS,GAAG,YAAY;SACzC,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,UAAU,GAAG,MAAM,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACnB,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACtB,MAAM,SAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const __1 = require("..");
|
|
5
|
+
const config_1 = require("@nestjs/config");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const token_1 = require("../../token");
|
|
8
|
+
describe('OAuthClient', () => {
|
|
9
|
+
let oauthClient;
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
const testingModule = await testing_1.Test.createTestingModule({
|
|
12
|
+
imports: [
|
|
13
|
+
config_1.ConfigModule.forRoot({
|
|
14
|
+
envFilePath: `env/.env.${process.env.NODE_ENV}`,
|
|
15
|
+
isGlobal: true,
|
|
16
|
+
}),
|
|
17
|
+
],
|
|
18
|
+
providers: [
|
|
19
|
+
{
|
|
20
|
+
provide: __1.LogtoLoggerServiceToken,
|
|
21
|
+
useClass: common_1.ConsoleLogger
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
provide: __1.OAuthClientToken,
|
|
25
|
+
useClass: __1.OAuthClient
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
provide: token_1.LogtoTokenVerifierToken,
|
|
29
|
+
useClass: token_1.LogtoTokenVerifier
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
}).compile();
|
|
33
|
+
oauthClient = testingModule.get(__1.OAuthClientToken);
|
|
34
|
+
});
|
|
35
|
+
it('로그인/ 회원가입을 위한 로그인 페이지 요청 URI 생성', () => {
|
|
36
|
+
const uri = oauthClient.getSignInURI(__1.SignInType.Admin);
|
|
37
|
+
expect(uri).toContain('prompt=login');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=oauth-client.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client.spec.js","sourceRoot":"","sources":["../../../client/__tests__/oauth-client.spec.ts"],"names":[],"mappings":";;AAAA,6CAAuC;AACvC,0BAAwF;AACxF,2CAA8C;AAC9C,2CAA+C;AAC/C,uCAA0E;AAE1E,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,aAAa,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACjD,OAAO,EAAE;gBACL,qBAAY,CAAC,OAAO,CAAC;oBACnB,WAAW,EAAE,YAAY,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAC/C,QAAQ,EAAE,IAAI;iBACf,CAAC;aACH;YACH,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,2BAAuB;oBAChC,QAAQ,EAAE,sBAAa;iBAC1B;gBACD;oBACI,OAAO,EAAE,oBAAgB;oBACzB,QAAQ,EAAE,eAAW;iBACxB;gBACD;oBACI,OAAO,EAAE,+BAAuB;oBAChC,QAAQ,EAAE,0BAAkB;iBAC/B;aACJ;SACJ,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,WAAW,GAAG,aAAa,CAAC,GAAG,CAAc,oBAAgB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAEvC,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,CAAC,cAAU,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type LogtoConfig = {
|
|
2
|
+
endpoint: string;
|
|
3
|
+
appId: string;
|
|
4
|
+
grantType: GrantType;
|
|
5
|
+
appSecret: string;
|
|
6
|
+
scopes?: string[];
|
|
7
|
+
resources?: string[];
|
|
8
|
+
prompt?: Prompt;
|
|
9
|
+
includeReservedScopes?: boolean;
|
|
10
|
+
redirectUri?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare enum Prompt {
|
|
13
|
+
None = "none",
|
|
14
|
+
Consent = "consent",
|
|
15
|
+
Login = "login"
|
|
16
|
+
}
|
|
17
|
+
export declare enum GrantType {
|
|
18
|
+
AuthorizationCode = "authorization_code",
|
|
19
|
+
ClientCredentials = "client_credentials",
|
|
20
|
+
RefreshToken = "refresh_token"
|
|
21
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GrantType = exports.Prompt = void 0;
|
|
4
|
+
var Prompt;
|
|
5
|
+
(function (Prompt) {
|
|
6
|
+
Prompt["None"] = "none";
|
|
7
|
+
Prompt["Consent"] = "consent";
|
|
8
|
+
Prompt["Login"] = "login";
|
|
9
|
+
})(Prompt || (exports.Prompt = Prompt = {}));
|
|
10
|
+
var GrantType;
|
|
11
|
+
(function (GrantType) {
|
|
12
|
+
GrantType["AuthorizationCode"] = "authorization_code";
|
|
13
|
+
GrantType["ClientCredentials"] = "client_credentials";
|
|
14
|
+
GrantType["RefreshToken"] = "refresh_token";
|
|
15
|
+
})(GrantType || (exports.GrantType = GrantType = {}));
|
|
16
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../client/config.ts"],"names":[],"mappings":";;;AA4DA,IAAY,MAIX;AAJD,WAAY,MAAM;IACd,uBAAa,CAAA;IACb,6BAAmB,CAAA;IACnB,yBAAe,CAAA;AACnB,CAAC,EAJW,MAAM,sBAAN,MAAM,QAIjB;AAUD,IAAY,SAIX;AAJD,WAAY,SAAS;IACjB,qDAAwC,CAAA;IACxC,qDAAwC,CAAA;IACxC,2CAA8B,CAAA;AAClC,CAAC,EAJW,SAAS,yBAAT,SAAS,QAIpB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./config"), exports);
|
|
18
|
+
__exportStar(require("./m2m-client"), exports);
|
|
19
|
+
__exportStar(require("./oauth-client"), exports);
|
|
20
|
+
__exportStar(require("./logto-login-session"), exports);
|
|
21
|
+
__exportStar(require("./types"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,+CAA6B;AAC7B,iDAA+B;AAC/B,wDAAsC;AACtC,0CAAwB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LoggerService } from "@nestjs/common";
|
|
2
|
+
import { ConfigService } from "@nestjs/config";
|
|
3
|
+
import { AxiosResponse } from "axios";
|
|
4
|
+
import { OAuthClient, SignInType } from "./oauth-client";
|
|
5
|
+
export declare const LogtoLoginSessionToken: unique symbol;
|
|
6
|
+
export declare class LogtoLoginSession {
|
|
7
|
+
private readonly logger;
|
|
8
|
+
private readonly configService;
|
|
9
|
+
private readonly oauthClient;
|
|
10
|
+
private readonly apiRestTemplate;
|
|
11
|
+
constructor(logger: LoggerService, configService: ConfigService, oauthClient: OAuthClient);
|
|
12
|
+
createSignInSession(signInType: SignInType): Promise<{
|
|
13
|
+
response: AxiosResponse | undefined;
|
|
14
|
+
state: string;
|
|
15
|
+
}>;
|
|
16
|
+
experienceSignIn(cookie: string): Promise<any>;
|
|
17
|
+
verificationPassword(cookie: string, dto: {
|
|
18
|
+
identifier: {
|
|
19
|
+
type: string;
|
|
20
|
+
value: string;
|
|
21
|
+
};
|
|
22
|
+
password: string;
|
|
23
|
+
}): Promise<any>;
|
|
24
|
+
identify(cookie: string, verificationId: string): Promise<any>;
|
|
25
|
+
submit(cookie: string): Promise<any>;
|
|
26
|
+
redirectToConsent(redirectTo: string, cookie: string): Promise<AxiosResponse>;
|
|
27
|
+
consent(cookie: string): Promise<any>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.LogtoLoginSession = exports.LogtoLoginSessionToken = void 0;
|
|
19
|
+
const common_1 = require("@nestjs/common");
|
|
20
|
+
const config_1 = require("@nestjs/config");
|
|
21
|
+
const axios_1 = __importDefault(require("axios"));
|
|
22
|
+
const oauth_client_1 = require("./oauth-client");
|
|
23
|
+
const types_1 = require("./types");
|
|
24
|
+
exports.LogtoLoginSessionToken = Symbol.for("LogtoLoginSession");
|
|
25
|
+
let LogtoLoginSession = class LogtoLoginSession {
|
|
26
|
+
constructor(logger, configService, oauthClient) {
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.configService = configService;
|
|
29
|
+
this.oauthClient = oauthClient;
|
|
30
|
+
const baseURL = this.configService.get("LOGTO_M2M_API_URL");
|
|
31
|
+
this.apiRestTemplate = new types_1.LogtoOAuthRESTTemplate(this.logger, baseURL);
|
|
32
|
+
}
|
|
33
|
+
async createSignInSession(signInType) {
|
|
34
|
+
const { uri, state } = this.oauthClient.getSignInURI(signInType);
|
|
35
|
+
const response = await axios_1.default.get(uri, {
|
|
36
|
+
maxRedirects: 0,
|
|
37
|
+
validateStatus: (status) => status >= 200 && status <= 400,
|
|
38
|
+
withCredentials: true,
|
|
39
|
+
});
|
|
40
|
+
return { response, state };
|
|
41
|
+
}
|
|
42
|
+
async experienceSignIn(cookie) {
|
|
43
|
+
try {
|
|
44
|
+
const response = await this.apiRestTemplate.put(`/experience`, { interactionEvent: 'SignIn' }, {
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
Cookie: cookie,
|
|
48
|
+
},
|
|
49
|
+
withCredentials: true,
|
|
50
|
+
});
|
|
51
|
+
return response.data;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
this.logger.error('Failed to start login experience');
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async verificationPassword(cookie, dto) {
|
|
59
|
+
try {
|
|
60
|
+
const response = await this.apiRestTemplate.post(`/experience/verification/password`, {
|
|
61
|
+
identifier: dto.identifier,
|
|
62
|
+
password: dto.password,
|
|
63
|
+
}, {
|
|
64
|
+
headers: { Cookie: cookie },
|
|
65
|
+
withCredentials: true,
|
|
66
|
+
});
|
|
67
|
+
return response.data;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async identify(cookie, verificationId) {
|
|
74
|
+
try {
|
|
75
|
+
const response = await this.apiRestTemplate.post(`/experience/identification`, { verificationId }, {
|
|
76
|
+
headers: { Cookie: cookie },
|
|
77
|
+
withCredentials: true,
|
|
78
|
+
});
|
|
79
|
+
return response.data;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async submit(cookie) {
|
|
86
|
+
try {
|
|
87
|
+
const response = await this.apiRestTemplate.post(`/experience/submit`, {}, {
|
|
88
|
+
headers: { Cookie: cookie },
|
|
89
|
+
withCredentials: true,
|
|
90
|
+
});
|
|
91
|
+
return response.data;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async redirectToConsent(redirectTo, cookie) {
|
|
98
|
+
const response = await axios_1.default.get(redirectTo, {
|
|
99
|
+
maxRedirects: 0,
|
|
100
|
+
validateStatus: (status) => status >= 200 && status <= 400,
|
|
101
|
+
withCredentials: true,
|
|
102
|
+
headers: { Cookie: cookie },
|
|
103
|
+
});
|
|
104
|
+
return response;
|
|
105
|
+
}
|
|
106
|
+
async consent(cookie) {
|
|
107
|
+
try {
|
|
108
|
+
const response = await this.apiRestTemplate.post(`/interaction/consent`, {}, {
|
|
109
|
+
headers: { Cookie: cookie },
|
|
110
|
+
withCredentials: true,
|
|
111
|
+
});
|
|
112
|
+
return response.data;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
exports.LogtoLoginSession = LogtoLoginSession;
|
|
120
|
+
exports.LogtoLoginSession = LogtoLoginSession = __decorate([
|
|
121
|
+
(0, common_1.Injectable)(),
|
|
122
|
+
__param(0, (0, common_1.Inject)(types_1.LogtoLoggerServiceToken)),
|
|
123
|
+
__param(1, (0, common_1.Inject)(config_1.ConfigService)),
|
|
124
|
+
__param(2, (0, common_1.Inject)(oauth_client_1.OAuthClientToken)),
|
|
125
|
+
__metadata("design:paramtypes", [Object, config_1.ConfigService,
|
|
126
|
+
oauth_client_1.OAuthClient])
|
|
127
|
+
], LogtoLoginSession);
|
|
128
|
+
//# sourceMappingURL=logto-login-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logto-login-session.js","sourceRoot":"","sources":["../../client/logto-login-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { LoggerService } from "@nestjs/common";
|
|
2
|
+
import { ConfigService } from "@nestjs/config";
|
|
3
|
+
import { LogtoTokenVerifier } from "../token";
|
|
4
|
+
import { LogtoRole, LogtoRoleResponse, LogtoUser, LogtoUserResponse } from "./types";
|
|
5
|
+
import { p3Values } from "point3-common-tool";
|
|
6
|
+
export declare const LogtoM2MClientToken: unique symbol;
|
|
7
|
+
export declare class LogtoM2MClient {
|
|
8
|
+
private readonly configService;
|
|
9
|
+
private readonly tokenVerifier;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private logtoConfig;
|
|
12
|
+
private accessToken?;
|
|
13
|
+
private readonly authRestTemplate;
|
|
14
|
+
private readonly apiRestTemplate;
|
|
15
|
+
constructor(configService: ConfigService, tokenVerifier: LogtoTokenVerifier, logger: LoggerService);
|
|
16
|
+
fetchAccessToken(): Promise<void>;
|
|
17
|
+
private getAccessToken;
|
|
18
|
+
getRoles(): Promise<LogtoRoleResponse[]>;
|
|
19
|
+
getRoleByName(name: string): Promise<LogtoRoleResponse>;
|
|
20
|
+
createRole(role: LogtoRole): Promise<LogtoRoleResponse>;
|
|
21
|
+
assignRoleToUser(userId: string, roleId: string): Promise<void>;
|
|
22
|
+
createUser(user: LogtoUser): Promise<string>;
|
|
23
|
+
updateUserClientInfo(userId: string, clientId?: string): Promise<void>;
|
|
24
|
+
getUser(id: string): Promise<LogtoUserResponse>;
|
|
25
|
+
getUsersByEmailAndPhone(email: string, phone: string): Promise<LogtoUserResponse>;
|
|
26
|
+
getUserByUsername(username: string): Promise<LogtoUserResponse>;
|
|
27
|
+
suspendUser(userId: string): Promise<LogtoUserResponse>;
|
|
28
|
+
deleteUser(userId: string): Promise<void>;
|
|
29
|
+
unsuspendUser(userId: string): Promise<LogtoUserResponse>;
|
|
30
|
+
sendVerificationCode(identifier: p3Values.PhoneNumber | p3Values.Email): Promise<void>;
|
|
31
|
+
verifyCode(identifier: p3Values.PhoneNumber | p3Values.Email, code: string): Promise<void>;
|
|
32
|
+
updateUserPassword(userId: string, password: string): Promise<LogtoUserResponse>;
|
|
33
|
+
}
|
|
34
|
+
export declare function generatePhoneNumberWithCountryCode(countryCode: string, phoneNumber: string): string;
|