@nauth-toolkit/social-google 0.1.14 → 0.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/dist/nestjs/google-social-auth.module.d.ts +38 -0
- package/dist/nestjs/google-social-auth.module.d.ts.map +1 -1
- package/dist/nestjs/google-social-auth.module.js +54 -3
- package/dist/nestjs/google-social-auth.module.js.map +1 -1
- package/dist/nestjs/index.d.ts +5 -0
- package/dist/nestjs/index.d.ts.map +1 -1
- package/dist/nestjs/index.js +6 -0
- package/dist/nestjs/index.js.map +1 -1
- package/dist/src/dto/social-login.dto.d.ts +219 -0
- package/dist/src/dto/social-login.dto.d.ts.map +1 -1
- package/dist/src/dto/social-login.dto.js +219 -0
- package/dist/src/dto/social-login.dto.js.map +1 -1
- package/dist/src/google-oauth.client.d.ts +59 -0
- package/dist/src/google-oauth.client.d.ts.map +1 -1
- package/dist/src/google-oauth.client.js +62 -0
- package/dist/src/google-oauth.client.js.map +1 -1
- package/dist/src/google-social-auth.service.d.ts +43 -1
- package/dist/src/google-social-auth.service.d.ts.map +1 -1
- package/dist/src/google-social-auth.service.js +63 -1
- package/dist/src/google-social-auth.service.js.map +1 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/token-verifier.service.d.ts +45 -0
- package/dist/src/token-verifier.service.d.ts.map +1 -1
- package/dist/src/token-verifier.service.js +44 -1
- package/dist/src/token-verifier.service.js.map +1 -1
- package/dist/src/verified-token-profile.interface.d.ts +24 -0
- package/dist/src/verified-token-profile.interface.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -11,14 +11,45 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.SocialAccountsResponseDTO = exports.SocialLoginResponseDTO = exports.UnlinkSocialAccountDTO = exports.LinkSocialAccountDTO = exports.SocialCallbackDTO = exports.SocialLoginDTO = exports.SocialProvider = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
|
+
/**
|
|
15
|
+
* Social provider enum
|
|
16
|
+
*/
|
|
14
17
|
var SocialProvider;
|
|
15
18
|
(function (SocialProvider) {
|
|
16
19
|
SocialProvider["GOOGLE"] = "google";
|
|
17
20
|
SocialProvider["APPLE"] = "apple";
|
|
18
21
|
SocialProvider["FACEBOOK"] = "facebook";
|
|
19
22
|
})(SocialProvider || (exports.SocialProvider = SocialProvider = {}));
|
|
23
|
+
/**
|
|
24
|
+
* DTO for initiating social login
|
|
25
|
+
* Used to generate OAuth URLs for social providers
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Generate Google OAuth URL
|
|
30
|
+
* const dto = new SocialLoginDTO();
|
|
31
|
+
* dto.provider = 'google';
|
|
32
|
+
* dto.state = 'random-state-string';
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
20
35
|
class SocialLoginDTO {
|
|
36
|
+
/**
|
|
37
|
+
* Social provider name
|
|
38
|
+
* Must be one of the configured providers
|
|
39
|
+
*
|
|
40
|
+
* Validation:
|
|
41
|
+
* - Must be a valid SocialProvider enum value
|
|
42
|
+
*/
|
|
21
43
|
provider;
|
|
44
|
+
/**
|
|
45
|
+
* Optional state parameter for OAuth flow
|
|
46
|
+
* Used to prevent CSRF attacks and maintain state
|
|
47
|
+
* If not provided, a random state will be generated
|
|
48
|
+
*
|
|
49
|
+
* Validation:
|
|
50
|
+
* - Must be a string if present
|
|
51
|
+
* - Max 500 characters (typical OAuth state length)
|
|
52
|
+
*/
|
|
22
53
|
state;
|
|
23
54
|
}
|
|
24
55
|
exports.SocialLoginDTO = SocialLoginDTO;
|
|
@@ -32,11 +63,63 @@ __decorate([
|
|
|
32
63
|
(0, class_validator_1.MaxLength)(500, { message: 'State must not exceed 500 characters' }),
|
|
33
64
|
__metadata("design:type", String)
|
|
34
65
|
], SocialLoginDTO.prototype, "state", void 0);
|
|
66
|
+
/**
|
|
67
|
+
* DTO for handling OAuth callback
|
|
68
|
+
* Used to process the authorization code from OAuth providers
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* // Handle Google OAuth callback
|
|
73
|
+
* const dto = new SocialCallbackDTO();
|
|
74
|
+
* dto.provider = 'google';
|
|
75
|
+
* dto.code = 'authorization-code-from-google';
|
|
76
|
+
* dto.state = 'state-from-initial-request';
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
35
79
|
class SocialCallbackDTO {
|
|
80
|
+
/**
|
|
81
|
+
* Social provider name
|
|
82
|
+
* Must match the provider used in the initial request
|
|
83
|
+
*
|
|
84
|
+
* Validation:
|
|
85
|
+
* - Must be a valid SocialProvider enum value
|
|
86
|
+
*/
|
|
36
87
|
provider;
|
|
88
|
+
/**
|
|
89
|
+
* Authorization code from OAuth provider
|
|
90
|
+
* This code is exchanged for access token and user info
|
|
91
|
+
*
|
|
92
|
+
* Validation:
|
|
93
|
+
* - Must be a string
|
|
94
|
+
* - Max 1000 characters (typical OAuth code length)
|
|
95
|
+
*/
|
|
37
96
|
code;
|
|
97
|
+
/**
|
|
98
|
+
* State parameter from OAuth flow
|
|
99
|
+
* Must match the state sent in the initial request
|
|
100
|
+
*
|
|
101
|
+
* Validation:
|
|
102
|
+
* - Must be a string
|
|
103
|
+
* - Max 500 characters (typical OAuth state length)
|
|
104
|
+
*/
|
|
38
105
|
state;
|
|
106
|
+
/**
|
|
107
|
+
* Optional error parameter from OAuth provider
|
|
108
|
+
* Used when user denies permission or other errors occur
|
|
109
|
+
*
|
|
110
|
+
* Validation:
|
|
111
|
+
* - Must be a string if present
|
|
112
|
+
* - Max 100 characters
|
|
113
|
+
*/
|
|
39
114
|
error;
|
|
115
|
+
/**
|
|
116
|
+
* Optional error description from OAuth provider
|
|
117
|
+
* Provides more details about the error
|
|
118
|
+
*
|
|
119
|
+
* Validation:
|
|
120
|
+
* - Must be a string if present
|
|
121
|
+
* - Max 500 characters
|
|
122
|
+
*/
|
|
40
123
|
error_description;
|
|
41
124
|
}
|
|
42
125
|
exports.SocialCallbackDTO = SocialCallbackDTO;
|
|
@@ -68,9 +151,45 @@ __decorate([
|
|
|
68
151
|
(0, class_validator_1.MaxLength)(500, { message: 'Error description must not exceed 500 characters' }),
|
|
69
152
|
__metadata("design:type", String)
|
|
70
153
|
], SocialCallbackDTO.prototype, "error_description", void 0);
|
|
154
|
+
/**
|
|
155
|
+
* DTO for linking social account to existing user
|
|
156
|
+
* Used when an authenticated user wants to link a social provider
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* // Link Google account to current user
|
|
161
|
+
* const dto = new LinkSocialAccountDTO();
|
|
162
|
+
* dto.provider = 'google';
|
|
163
|
+
* dto.code = 'authorization-code-from-google';
|
|
164
|
+
* dto.state = 'state-from-initial-request';
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
71
167
|
class LinkSocialAccountDTO {
|
|
168
|
+
/**
|
|
169
|
+
* Social provider name
|
|
170
|
+
* Must be one of the configured providers
|
|
171
|
+
*
|
|
172
|
+
* Validation:
|
|
173
|
+
* - Must be a valid SocialProvider enum value
|
|
174
|
+
*/
|
|
72
175
|
provider;
|
|
176
|
+
/**
|
|
177
|
+
* Authorization code from OAuth provider
|
|
178
|
+
* This code is exchanged for access token and user info
|
|
179
|
+
*
|
|
180
|
+
* Validation:
|
|
181
|
+
* - Must be a string
|
|
182
|
+
* - Max 1000 characters (typical OAuth code length)
|
|
183
|
+
*/
|
|
73
184
|
code;
|
|
185
|
+
/**
|
|
186
|
+
* State parameter from OAuth flow
|
|
187
|
+
* Must match the state sent in the initial request
|
|
188
|
+
*
|
|
189
|
+
* Validation:
|
|
190
|
+
* - Must be a string
|
|
191
|
+
* - Max 500 characters (typical OAuth state length)
|
|
192
|
+
*/
|
|
74
193
|
state;
|
|
75
194
|
}
|
|
76
195
|
exports.LinkSocialAccountDTO = LinkSocialAccountDTO;
|
|
@@ -90,7 +209,25 @@ __decorate([
|
|
|
90
209
|
(0, class_validator_1.MaxLength)(500, { message: 'State must not exceed 500 characters' }),
|
|
91
210
|
__metadata("design:type", String)
|
|
92
211
|
], LinkSocialAccountDTO.prototype, "state", void 0);
|
|
212
|
+
/**
|
|
213
|
+
* DTO for unlinking social account
|
|
214
|
+
* Used when an authenticated user wants to remove a social provider
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```typescript
|
|
218
|
+
* // Unlink Google account from current user
|
|
219
|
+
* const dto = new UnlinkSocialAccountDTO();
|
|
220
|
+
* dto.provider = 'google';
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
93
223
|
class UnlinkSocialAccountDTO {
|
|
224
|
+
/**
|
|
225
|
+
* Social provider name to unlink
|
|
226
|
+
* Must be one of the currently linked providers
|
|
227
|
+
*
|
|
228
|
+
* Validation:
|
|
229
|
+
* - Must be a valid SocialProvider enum value
|
|
230
|
+
*/
|
|
94
231
|
provider;
|
|
95
232
|
}
|
|
96
233
|
exports.UnlinkSocialAccountDTO = UnlinkSocialAccountDTO;
|
|
@@ -98,11 +235,71 @@ __decorate([
|
|
|
98
235
|
(0, class_validator_1.IsEnum)(SocialProvider, { message: 'Provider must be one of: google, apple, facebook' }),
|
|
99
236
|
__metadata("design:type", String)
|
|
100
237
|
], UnlinkSocialAccountDTO.prototype, "provider", void 0);
|
|
238
|
+
/**
|
|
239
|
+
* Response DTO for social login
|
|
240
|
+
* Contains authentication tokens and user information
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* // Response after successful social login
|
|
245
|
+
* {
|
|
246
|
+
* "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
247
|
+
* "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
248
|
+
* "expiresIn": 900,
|
|
249
|
+
* "user": {
|
|
250
|
+
* "sub": "user-uuid",
|
|
251
|
+
* "email": "user@example.com",
|
|
252
|
+
* "firstName": "John",
|
|
253
|
+
* "lastName": "Doe",
|
|
254
|
+
* "isEmailVerified": true,
|
|
255
|
+
* "socialProviders": ["google"]
|
|
256
|
+
* }
|
|
257
|
+
* }
|
|
258
|
+
* ```
|
|
259
|
+
*/
|
|
101
260
|
class SocialLoginResponseDTO {
|
|
261
|
+
/**
|
|
262
|
+
* JWT access token for API authentication
|
|
263
|
+
*
|
|
264
|
+
* Validation:
|
|
265
|
+
* - Must be a string
|
|
266
|
+
* - Max 2048 characters (typical JWT length)
|
|
267
|
+
*/
|
|
102
268
|
accessToken;
|
|
269
|
+
/**
|
|
270
|
+
* JWT refresh token for token renewal
|
|
271
|
+
*
|
|
272
|
+
* Validation:
|
|
273
|
+
* - Must be a string
|
|
274
|
+
* - Max 2048 characters (typical JWT length)
|
|
275
|
+
*/
|
|
103
276
|
refreshToken;
|
|
277
|
+
/**
|
|
278
|
+
* Access token expiration timestamp (Unix timestamp in seconds)
|
|
279
|
+
*
|
|
280
|
+
* Validation:
|
|
281
|
+
* - Must be a number
|
|
282
|
+
*/
|
|
104
283
|
accessTokenExpiresAt;
|
|
284
|
+
/**
|
|
285
|
+
* Refresh token expiration timestamp (Unix timestamp in seconds)
|
|
286
|
+
*
|
|
287
|
+
* Validation:
|
|
288
|
+
* - Must be a number
|
|
289
|
+
*/
|
|
105
290
|
refreshTokenExpiresAt;
|
|
291
|
+
/**
|
|
292
|
+
* User information
|
|
293
|
+
*
|
|
294
|
+
* Validation:
|
|
295
|
+
* - Nested fields validated in service layer:
|
|
296
|
+
* - sub: UUID v4 format, max 36 chars
|
|
297
|
+
* - email: Valid email format, max 255 chars
|
|
298
|
+
* - firstName: String, max 100 chars
|
|
299
|
+
* - lastName: String, max 100 chars
|
|
300
|
+
* - isEmailVerified: Boolean
|
|
301
|
+
* - socialProviders: Array of strings, each max 50 chars
|
|
302
|
+
*/
|
|
106
303
|
user;
|
|
107
304
|
}
|
|
108
305
|
exports.SocialLoginResponseDTO = SocialLoginResponseDTO;
|
|
@@ -124,7 +321,29 @@ __decorate([
|
|
|
124
321
|
(0, class_validator_1.IsNumber)({}, { message: 'Refresh token expiration must be a number' }),
|
|
125
322
|
__metadata("design:type", Number)
|
|
126
323
|
], SocialLoginResponseDTO.prototype, "refreshTokenExpiresAt", void 0);
|
|
324
|
+
/**
|
|
325
|
+
* Response DTO for social account information
|
|
326
|
+
* Contains details about linked social accounts
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* // Response for user's linked social accounts
|
|
331
|
+
* {
|
|
332
|
+
* "accounts": [
|
|
333
|
+
* {
|
|
334
|
+
* "provider": "google",
|
|
335
|
+
* "providerEmail": "user@gmail.com",
|
|
336
|
+
* "linkedAt": "2023-01-01T00:00:00Z",
|
|
337
|
+
* "lastUsedAt": "2023-01-15T12:00:00Z"
|
|
338
|
+
* }
|
|
339
|
+
* ]
|
|
340
|
+
* }
|
|
341
|
+
* ```
|
|
342
|
+
*/
|
|
127
343
|
class SocialAccountsResponseDTO {
|
|
344
|
+
/**
|
|
345
|
+
* Array of linked social accounts
|
|
346
|
+
*/
|
|
128
347
|
accounts;
|
|
129
348
|
}
|
|
130
349
|
exports.SocialAccountsResponseDTO = SocialAccountsResponseDTO;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social-login.dto.js","sourceRoot":"","sources":["../../../src/dto/social-login.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAgG;
|
|
1
|
+
{"version":3,"file":"social-login.dto.js","sourceRoot":"","sources":["../../../src/dto/social-login.dto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,74 @@
|
|
|
1
1
|
import { OAuthClient, OAuthConfig, OAuthUserProfile } from '@nauth-toolkit/core';
|
|
2
|
+
/**
|
|
3
|
+
* Google OAuth Client Implementation (Platform-Agnostic)
|
|
4
|
+
*
|
|
5
|
+
* Handles OAuth flow with Google's OpenID Connect API
|
|
6
|
+
* Uses Google's userinfo endpoint for profile data
|
|
7
|
+
*
|
|
8
|
+
* This is a plain TypeScript class with no framework dependencies.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const client = new GoogleOAuthClient({
|
|
13
|
+
* clientId: 'google_client_id',
|
|
14
|
+
* clientSecret: 'google_client_secret',
|
|
15
|
+
* redirectUri: 'https://myapp.com/auth/google/callback'
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* const profile = await client.getUserProfile(accessToken);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
2
21
|
export declare class GoogleOAuthClient implements OAuthClient {
|
|
3
22
|
private readonly config;
|
|
4
23
|
private readonly tokenEndpoint;
|
|
5
24
|
private readonly userInfoEndpoint;
|
|
6
25
|
constructor(config: OAuthConfig);
|
|
26
|
+
/**
|
|
27
|
+
* Exchange authorization code for access token
|
|
28
|
+
*
|
|
29
|
+
* @param code - Authorization code from Google OAuth callback
|
|
30
|
+
* @param redirectUri - Redirect URI used in OAuth flow
|
|
31
|
+
* @returns Access token and optional refresh token
|
|
32
|
+
* @throws {Error} When token exchange fails
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const tokens = await client.exchangeCodeForToken(code, redirectUri);
|
|
37
|
+
* console.log(tokens.accessToken); // access_token_here
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
7
40
|
exchangeCodeForToken(code: string, redirectUri: string): Promise<{
|
|
8
41
|
accessToken: string;
|
|
9
42
|
refreshToken?: string;
|
|
10
43
|
expiresIn?: number;
|
|
11
44
|
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Get user profile from Google using access token
|
|
47
|
+
*
|
|
48
|
+
* @param accessToken - OAuth access token
|
|
49
|
+
* @returns User profile data
|
|
50
|
+
* @throws {Error} When API call fails or token is invalid
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const profile = await client.getUserProfile(accessToken);
|
|
55
|
+
* console.log(profile.email); // user@gmail.com
|
|
56
|
+
* console.log(profile.firstName); // John
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
12
59
|
getUserProfile(accessToken: string): Promise<OAuthUserProfile>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate Google OAuth authorization URL
|
|
62
|
+
*
|
|
63
|
+
* @param state - Optional state parameter for CSRF protection
|
|
64
|
+
* @returns Authorization URL for redirecting user to Google
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const authUrl = client.getAuthorizationUrl('random-state');
|
|
69
|
+
* // Redirect user to authUrl
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
13
72
|
getAuthorizationUrl(state?: string): string;
|
|
14
73
|
}
|
|
15
74
|
//# sourceMappingURL=google-oauth.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-oauth.client.d.ts","sourceRoot":"","sources":["../../src/google-oauth.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAiC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"google-oauth.client.d.ts","sourceRoot":"","sources":["../../src/google-oauth.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAiC,MAAM,qBAAqB,CAAC;AAEhH;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;gBAExE,MAAM,EAAE,WAAW;IAO/B;;;;;;;;;;;;;OAaG;IACG,oBAAoB,CACxB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAyCF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsCpE;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;CAiB5C"}
|
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GoogleOAuthClient = void 0;
|
|
4
4
|
const core_1 = require("@nauth-toolkit/core");
|
|
5
|
+
/**
|
|
6
|
+
* Google OAuth Client Implementation (Platform-Agnostic)
|
|
7
|
+
*
|
|
8
|
+
* Handles OAuth flow with Google's OpenID Connect API
|
|
9
|
+
* Uses Google's userinfo endpoint for profile data
|
|
10
|
+
*
|
|
11
|
+
* This is a plain TypeScript class with no framework dependencies.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const client = new GoogleOAuthClient({
|
|
16
|
+
* clientId: 'google_client_id',
|
|
17
|
+
* clientSecret: 'google_client_secret',
|
|
18
|
+
* redirectUri: 'https://myapp.com/auth/google/callback'
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* const profile = await client.getUserProfile(accessToken);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
5
24
|
class GoogleOAuthClient {
|
|
6
25
|
config;
|
|
7
26
|
tokenEndpoint = 'https://oauth2.googleapis.com/token';
|
|
@@ -12,6 +31,20 @@ class GoogleOAuthClient {
|
|
|
12
31
|
...config,
|
|
13
32
|
};
|
|
14
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Exchange authorization code for access token
|
|
36
|
+
*
|
|
37
|
+
* @param code - Authorization code from Google OAuth callback
|
|
38
|
+
* @param redirectUri - Redirect URI used in OAuth flow
|
|
39
|
+
* @returns Access token and optional refresh token
|
|
40
|
+
* @throws {Error} When token exchange fails
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const tokens = await client.exchangeCodeForToken(code, redirectUri);
|
|
45
|
+
* console.log(tokens.accessToken); // access_token_here
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
15
48
|
async exchangeCodeForToken(code, redirectUri) {
|
|
16
49
|
const params = new URLSearchParams({
|
|
17
50
|
client_id: this.config.clientId,
|
|
@@ -46,6 +79,20 @@ class GoogleOAuthClient {
|
|
|
46
79
|
throw new core_1.NAuthException(core_1.AuthErrorCode.SOCIAL_TOKEN_INVALID, 'Google token exchange failed: Unknown error');
|
|
47
80
|
}
|
|
48
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Get user profile from Google using access token
|
|
84
|
+
*
|
|
85
|
+
* @param accessToken - OAuth access token
|
|
86
|
+
* @returns User profile data
|
|
87
|
+
* @throws {Error} When API call fails or token is invalid
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const profile = await client.getUserProfile(accessToken);
|
|
92
|
+
* console.log(profile.email); // user@gmail.com
|
|
93
|
+
* console.log(profile.firstName); // John
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
49
96
|
async getUserProfile(accessToken) {
|
|
50
97
|
try {
|
|
51
98
|
const response = await fetch(this.userInfoEndpoint, {
|
|
@@ -60,6 +107,7 @@ class GoogleOAuthClient {
|
|
|
60
107
|
throw new core_1.NAuthException(core_1.AuthErrorCode.INTERNAL_ERROR, `Google API call failed: ${response.status} ${response.statusText}`);
|
|
61
108
|
}
|
|
62
109
|
const data = (await response.json());
|
|
110
|
+
// Map Google's response to our standardized format
|
|
63
111
|
return {
|
|
64
112
|
id: data.id,
|
|
65
113
|
email: data.email || null,
|
|
@@ -77,6 +125,18 @@ class GoogleOAuthClient {
|
|
|
77
125
|
throw new core_1.NAuthException(core_1.AuthErrorCode.INTERNAL_ERROR, 'Google profile fetch failed: Unknown error');
|
|
78
126
|
}
|
|
79
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate Google OAuth authorization URL
|
|
130
|
+
*
|
|
131
|
+
* @param state - Optional state parameter for CSRF protection
|
|
132
|
+
* @returns Authorization URL for redirecting user to Google
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const authUrl = client.getAuthorizationUrl('random-state');
|
|
137
|
+
* // Redirect user to authUrl
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
80
140
|
getAuthorizationUrl(state) {
|
|
81
141
|
const params = new URLSearchParams({
|
|
82
142
|
client_id: this.config.clientId,
|
|
@@ -84,6 +144,8 @@ class GoogleOAuthClient {
|
|
|
84
144
|
scope: this.config.scopes?.join(' ') || 'openid email profile',
|
|
85
145
|
response_type: 'code',
|
|
86
146
|
access_type: 'offline',
|
|
147
|
+
// Don't specify prompt - let Google decide when to show consent screen
|
|
148
|
+
// Google will show it on first login and skip it for returning users
|
|
87
149
|
});
|
|
88
150
|
if (state) {
|
|
89
151
|
params.append('state', state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-oauth.client.js","sourceRoot":"","sources":["../../src/google-oauth.client.ts"],"names":[],"mappings":";;;AAAA,8CAAgH;
|
|
1
|
+
{"version":3,"file":"google-oauth.client.js","sourceRoot":"","sources":["../../src/google-oauth.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,37 @@
|
|
|
1
1
|
import { AuthService, SocialAuthService, ClientInfoService, NAuthConfig, NAuthLogger, OAuthUserProfile, ISocialAuthProviderService, ITokenVerifierService, PhoneVerificationService, BaseUser } from '@nauth-toolkit/core';
|
|
2
|
-
import { BaseSocialAuthProviderService, JwtService, SessionService, AuthChallengeHelperService, AuthAuditService,
|
|
2
|
+
import { BaseSocialAuthProviderService, JwtService, SessionService, AuthChallengeHelperService, AuthAuditService, // Internal version with recordEvent()
|
|
3
|
+
TrustedDeviceService } from '@nauth-toolkit/core/internal';
|
|
3
4
|
import { Repository } from 'typeorm';
|
|
5
|
+
/**
|
|
6
|
+
* Google Social Authentication Service (Platform-Agnostic)
|
|
7
|
+
*
|
|
8
|
+
* Handles Google OAuth flow including:
|
|
9
|
+
* - OAuth web flow (redirect-based)
|
|
10
|
+
* - Native mobile token verification
|
|
11
|
+
* - Account linking
|
|
12
|
+
*
|
|
13
|
+
* This is a plain TypeScript class with no framework dependencies.
|
|
14
|
+
* Use `@nauth-toolkit/social-google/nestjs` for NestJS integration.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Direct instantiation (platform-agnostic)
|
|
19
|
+
* const googleAuth = new GoogleSocialAuthService(
|
|
20
|
+
* config,
|
|
21
|
+
* logger,
|
|
22
|
+
* authService,
|
|
23
|
+
* socialAuthService,
|
|
24
|
+
* jwtService,
|
|
25
|
+
* sessionService,
|
|
26
|
+
* challengeHelper,
|
|
27
|
+
* clientInfoService,
|
|
28
|
+
* auditService,
|
|
29
|
+
* stateStore,
|
|
30
|
+
* phoneVerificationService,
|
|
31
|
+
* tokenVerifier
|
|
32
|
+
* );
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
4
35
|
export declare class GoogleSocialAuthService extends BaseSocialAuthProviderService implements ISocialAuthProviderService {
|
|
5
36
|
readonly providerName = "google";
|
|
6
37
|
private readonly oauthClient;
|
|
@@ -9,8 +40,19 @@ export declare class GoogleSocialAuthService extends BaseSocialAuthProviderServi
|
|
|
9
40
|
timestamp: number;
|
|
10
41
|
provider: string;
|
|
11
42
|
}>, userRepository: Repository<BaseUser>, phoneVerificationService?: PhoneVerificationService, auditService?: AuthAuditService, trustedDeviceService?: TrustedDeviceService, tokenVerifier?: ITokenVerifierService);
|
|
43
|
+
/**
|
|
44
|
+
* Generate OAuth authorization URL for Google
|
|
45
|
+
*/
|
|
12
46
|
getAuthUrl(state?: string): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Get OAuth user profile from callback
|
|
49
|
+
*
|
|
50
|
+
* Exchanges authorization code for access token and fetches user profile.
|
|
51
|
+
*/
|
|
13
52
|
protected getOAuthProfile(code: string, _state: string): Promise<OAuthUserProfile>;
|
|
53
|
+
/**
|
|
54
|
+
* Verify Google ID token from native mobile apps
|
|
55
|
+
*/
|
|
14
56
|
protected verifyNativeToken(idToken: string, _accessToken?: string, profileData?: unknown): Promise<OAuthUserProfile>;
|
|
15
57
|
}
|
|
16
58
|
//# sourceMappingURL=google-social-auth.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-social-auth.service.d.ts","sourceRoot":"","sources":["../../src/google-social-auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAGhB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"google-social-auth.service.d.ts","sourceRoot":"","sources":["../../src/google-social-auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAGhB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAAE,sCAAsC;AACxD,oBAAoB,EACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,uBAAwB,SAAQ,6BAA8B,YAAW,0BAA0B;IAC9G,QAAQ,CAAC,YAAY,YAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAG3D,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,0BAA0B,EAC3C,iBAAiB,EAAE,iBAAiB,EAEpC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EAChE,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,EAEpC,wBAAwB,CAAC,EAAE,wBAAwB,EAEnD,YAAY,CAAC,EAAE,gBAAgB,EAE/B,oBAAoB,CAAC,EAAE,oBAAoB,EAE3C,aAAa,CAAC,EAAE,qBAAqB;IAmDvC;;OAEG;IACG,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASjD;;;;OAIG;cACa,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiBxF;;OAEG;cACa,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,gBAAgB,CAAC;CAkC7B"}
|