@gasboost/auth 0.5.0 → 0.7.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 +53 -5
- package/dist/AppsScriptAuth.d.ts +3 -1
- package/dist/AppsScriptAuth.js +10 -0
- package/dist/api/AppsScriptAuthRegistration.d.ts +19 -0
- package/dist/api/AppsScriptAuthRegistration.js +30 -0
- package/dist/api/AppsScriptAuthSignUp.d.ts +6 -4
- package/dist/api/AppsScriptAuthSignUp.js +3 -1
- package/dist/api/SignUp.d.ts +8 -8
- package/dist/api/SignUp.js +19 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -258,6 +258,51 @@ User 検索
|
|
|
258
258
|
Session 発行
|
|
259
259
|
```
|
|
260
260
|
|
|
261
|
+
## Registration (without Session)
|
|
262
|
+
|
|
263
|
+
`auth.registration` は、Session を発行せずに
|
|
264
|
+
User と Account を登録するサーバー内部APIです。
|
|
265
|
+
|
|
266
|
+
管理者によるユーザー登録など、
|
|
267
|
+
登録対象ユーザーとしてサインインする必要がない場合に使用します。
|
|
268
|
+
|
|
269
|
+
### Email / Password
|
|
270
|
+
|
|
271
|
+
```ts
|
|
272
|
+
const user = await auth.registration.email({
|
|
273
|
+
name: "Taro",
|
|
274
|
+
email: "taro@example.com",
|
|
275
|
+
password: temporaryPassword,
|
|
276
|
+
});
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Apps Script
|
|
280
|
+
|
|
281
|
+
```ts
|
|
282
|
+
const user = await auth.registration.appsScript({
|
|
283
|
+
name: "Taro",
|
|
284
|
+
});
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Apps Script方式では
|
|
288
|
+
`Session.getActiveUser().getEmail()` を使用するため、
|
|
289
|
+
任意の他ユーザーを指定して登録することはできません。
|
|
290
|
+
|
|
291
|
+
### Sign Upとの違い
|
|
292
|
+
|
|
293
|
+
| API | User + Account | Session発行 |
|
|
294
|
+
| -------------------------------- | -------------- | ----------- |
|
|
295
|
+
| `auth.registration.email()` | 作成 | なし |
|
|
296
|
+
| `auth.registration.appsScript()` | 作成 | なし |
|
|
297
|
+
| `auth.signUp.email()` | 作成 | あり |
|
|
298
|
+
| `auth.signUp.appsScript()` | 作成 | あり |
|
|
299
|
+
|
|
300
|
+
`isSignupEnabled: false` でも、
|
|
301
|
+
認証方式自体が `enabled: true` ならRegistrationは利用できます。
|
|
302
|
+
|
|
303
|
+
Registrationはメール送信やRole付与を行いません。
|
|
304
|
+
呼び出し元で認証・認可を実施してください。
|
|
305
|
+
|
|
261
306
|
## Apps Script Sign Up
|
|
262
307
|
|
|
263
308
|
Apps Script 認証では `Session.getActiveUser().getEmail()` を Identity として利用します。
|
|
@@ -294,7 +339,8 @@ Session 発行
|
|
|
294
339
|
|
|
295
340
|
`@gasboost/auth` は、認証成功後に外部処理を実行するための lifecycle hook を提供します。
|
|
296
341
|
|
|
297
|
-
現在は `afterSignIn` を利用できます。
|
|
342
|
+
現在は `afterSignIn` を利用できます。Sign In と、Session を自動発行する Sign Up の
|
|
343
|
+
email / Apps Script 両経路で、Session 保存後に同じ Hook を1回 await します。
|
|
298
344
|
|
|
299
345
|
```ts
|
|
300
346
|
import { AppsScriptAuth, type EmailPasswordAuthOptions } from "@gasboost/auth";
|
|
@@ -339,7 +385,7 @@ hooks: {
|
|
|
339
385
|
},
|
|
340
386
|
```
|
|
341
387
|
|
|
342
|
-
hook の戻り値は Sign In result の `hooks` から取得できます。
|
|
388
|
+
hook の戻り値は Sign In / Sign Up result の `hooks` から取得できます。
|
|
343
389
|
|
|
344
390
|
```ts
|
|
345
391
|
const result = await auth.signIn.email({
|
|
@@ -364,7 +410,7 @@ const auth = new AppsScriptAuth<EmailPasswordAuthOptions, HookResult>({
|
|
|
364
410
|
});
|
|
365
411
|
```
|
|
366
412
|
|
|
367
|
-
hook を設定しない場合、従来どおり Sign In result は `user` と `session` のみを返します。
|
|
413
|
+
hook を設定しない場合、従来どおり Sign In / Sign Up result は `user` と `session` のみを返します。
|
|
368
414
|
|
|
369
415
|
```ts
|
|
370
416
|
const auth = new AppsScriptAuth({
|
|
@@ -403,7 +449,7 @@ hooks: {
|
|
|
403
449
|
|
|
404
450
|
### Hook Failure
|
|
405
451
|
|
|
406
|
-
`afterSignIn` は Sign In 処理の一部として扱われます。
|
|
452
|
+
`afterSignIn` は Sign In / Sign Up 処理の一部として扱われます。
|
|
407
453
|
|
|
408
454
|
処理順序は以下です。
|
|
409
455
|
|
|
@@ -421,9 +467,11 @@ afterSignIn
|
|
|
421
467
|
Sign In result
|
|
422
468
|
```
|
|
423
469
|
|
|
424
|
-
`afterSignIn` で例外が発生した場合、Sign In 全体が失敗します。
|
|
470
|
+
`afterSignIn` で例外が発生した場合、Sign In / Sign Up 全体が失敗します。
|
|
425
471
|
|
|
426
472
|
その際、すでに保存された Session は SessionStorage から削除されます。
|
|
473
|
+
削除が失敗しても元の Hook エラーを返します。Sign Up で作成済みの User / Account は削除しません。
|
|
474
|
+
登録は完了しているため、再認証には Sign In を使い、Sign Up を自動再試行しないでください。
|
|
427
475
|
|
|
428
476
|
```text
|
|
429
477
|
afterSignIn error
|
package/dist/AppsScriptAuth.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AppsScriptAuthPassword } from "./api/AppsScriptAuthPassword";
|
|
2
|
+
import { AppsScriptAuthRegistration } from "./api/AppsScriptAuthRegistration";
|
|
2
3
|
import { AppsScriptAuthSession } from "./api/AppsScriptAuthSession";
|
|
3
4
|
import { AppsScriptAuthSignIn } from "./api/AppsScriptAuthSignIn";
|
|
4
5
|
import { AppsScriptAuthSignOut } from "./api/AppsScriptAuthSignOut";
|
|
@@ -31,10 +32,11 @@ type AppsScriptAuthPasswordApi<TEmailPassword> = TEmailPassword extends {
|
|
|
31
32
|
} ? AppsScriptAuthPassword : undefined;
|
|
32
33
|
export declare class AppsScriptAuth<TEmailPassword extends EmailPasswordAuthOptions | undefined = undefined, THookResult = undefined> {
|
|
33
34
|
readonly signIn: AppsScriptAuthSignIn<THookResult>;
|
|
34
|
-
readonly signUp: AppsScriptAuthSignUp
|
|
35
|
+
readonly signUp: AppsScriptAuthSignUp<THookResult>;
|
|
35
36
|
readonly session: AppsScriptAuthSession;
|
|
36
37
|
readonly signOut: AppsScriptAuthSignOut;
|
|
37
38
|
readonly password: AppsScriptAuthPasswordApi<TEmailPassword>;
|
|
39
|
+
readonly registration: AppsScriptAuthRegistration;
|
|
38
40
|
constructor({ repository, session, runtime, emailPassword, appsScript, hooks, }: AppsScriptAuthConfig<TEmailPassword, THookResult>);
|
|
39
41
|
}
|
|
40
42
|
export {};
|
package/dist/AppsScriptAuth.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AppsScriptAuth = void 0;
|
|
4
4
|
const AppsScriptAuthPassword_1 = require("./api/AppsScriptAuthPassword");
|
|
5
|
+
const AppsScriptAuthRegistration_1 = require("./api/AppsScriptAuthRegistration");
|
|
5
6
|
const AppsScriptAuthSession_1 = require("./api/AppsScriptAuthSession");
|
|
6
7
|
const AppsScriptAuthSignIn_1 = require("./api/AppsScriptAuthSignIn");
|
|
7
8
|
const AppsScriptAuthSignOut_1 = require("./api/AppsScriptAuthSignOut");
|
|
@@ -15,6 +16,7 @@ class AppsScriptAuth {
|
|
|
15
16
|
session;
|
|
16
17
|
signOut;
|
|
17
18
|
password;
|
|
19
|
+
registration;
|
|
18
20
|
constructor({ repository, session, runtime, emailPassword, appsScript, hooks, }) {
|
|
19
21
|
const sessionStorage = (0, sessionStorageFactory_1.sessionStorageFactory)(session.storageType, {
|
|
20
22
|
cacheService: runtime.cacheService,
|
|
@@ -42,6 +44,7 @@ class AppsScriptAuth {
|
|
|
42
44
|
: {}),
|
|
43
45
|
});
|
|
44
46
|
this.signUp = new AppsScriptAuthSignUp_1.AppsScriptAuthSignUp({
|
|
47
|
+
afterSignIn: hooks?.afterSignIn,
|
|
45
48
|
sessionStorage,
|
|
46
49
|
expiresIn,
|
|
47
50
|
repository,
|
|
@@ -61,6 +64,13 @@ class AppsScriptAuth {
|
|
|
61
64
|
emailPassword: emailPasswordConfig,
|
|
62
65
|
})
|
|
63
66
|
: undefined);
|
|
67
|
+
this.registration = new AppsScriptAuthRegistration_1.AppsScriptAuthRegistration({
|
|
68
|
+
emailPassword: emailPasswordConfig,
|
|
69
|
+
appsScript: appsScriptConfig,
|
|
70
|
+
repository,
|
|
71
|
+
utilities: runtime.utilities,
|
|
72
|
+
session: runtime.session,
|
|
73
|
+
});
|
|
64
74
|
}
|
|
65
75
|
}
|
|
66
76
|
exports.AppsScriptAuth = AppsScriptAuth;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AppsScriptAuthenticationConfig } from "../authentication/AppsScriptAuthentication";
|
|
2
|
+
import type { EmailPasswordAuthConfig } from "../authentication/EmailPasswordAuthentication";
|
|
3
|
+
import type { User } from "../domain/User";
|
|
4
|
+
import { type AppsScriptRegistrationInput } from "../registration/AppsScriptRegistration";
|
|
5
|
+
import { type EmailPasswordRegistrationInput } from "../registration/EmailPasswordRegistration";
|
|
6
|
+
import type { AppsScriptAuthRepository } from "../storage/AppsScriptAuthRepository";
|
|
7
|
+
export declare class AppsScriptAuthRegistration {
|
|
8
|
+
private readonly emailPasswordRegistration?;
|
|
9
|
+
private readonly appsScriptRegistration?;
|
|
10
|
+
constructor({ emailPassword, appsScript, repository, utilities, session, }: {
|
|
11
|
+
emailPassword?: EmailPasswordAuthConfig;
|
|
12
|
+
appsScript?: AppsScriptAuthenticationConfig;
|
|
13
|
+
repository: AppsScriptAuthRepository;
|
|
14
|
+
utilities: GoogleAppsScript.Utilities.Utilities;
|
|
15
|
+
session: GoogleAppsScript.Base.Session;
|
|
16
|
+
});
|
|
17
|
+
email(input: EmailPasswordRegistrationInput): Promise<User>;
|
|
18
|
+
appsScript(input: AppsScriptRegistrationInput): Promise<User>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppsScriptAuthRegistration = void 0;
|
|
4
|
+
const AppsScriptRegistration_1 = require("../registration/AppsScriptRegistration");
|
|
5
|
+
const EmailPasswordRegistration_1 = require("../registration/EmailPasswordRegistration");
|
|
6
|
+
class AppsScriptAuthRegistration {
|
|
7
|
+
emailPasswordRegistration;
|
|
8
|
+
appsScriptRegistration;
|
|
9
|
+
constructor({ emailPassword, appsScript, repository, utilities, session, }) {
|
|
10
|
+
if (emailPassword?.enabled) {
|
|
11
|
+
this.emailPasswordRegistration = new EmailPasswordRegistration_1.EmailPasswordRegistration(repository, utilities, emailPassword);
|
|
12
|
+
}
|
|
13
|
+
if (appsScript?.enabled) {
|
|
14
|
+
this.appsScriptRegistration = new AppsScriptRegistration_1.AppsScriptRegistration(utilities, session, repository);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async email(input) {
|
|
18
|
+
if (!this.emailPasswordRegistration) {
|
|
19
|
+
throw new Error("Email and password authentication is disabled");
|
|
20
|
+
}
|
|
21
|
+
return this.emailPasswordRegistration.register(input);
|
|
22
|
+
}
|
|
23
|
+
async appsScript(input) {
|
|
24
|
+
if (!this.appsScriptRegistration) {
|
|
25
|
+
throw new Error("Apps Script authentication is disabled");
|
|
26
|
+
}
|
|
27
|
+
return this.appsScriptRegistration.register(input);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.AppsScriptAuthRegistration = AppsScriptAuthRegistration;
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import type { AppsScriptAuthenticationConfig } from "../authentication/AppsScriptAuthentication";
|
|
2
2
|
import type { EmailPasswordAuthConfig } from "../authentication/EmailPasswordAuthentication";
|
|
3
|
+
import type { AfterSignInHook } from "../hooks/AuthHooks";
|
|
3
4
|
import { type AppsScriptRegistrationInput } from "../registration/AppsScriptRegistration";
|
|
4
5
|
import { type EmailPasswordRegistrationInput } from "../registration/EmailPasswordRegistration";
|
|
5
6
|
import type { AppsScriptAuthRepository } from "../storage/AppsScriptAuthRepository";
|
|
6
7
|
import type { AppsScriptSessionStorage } from "../storage/AppsScriptSessionStorage";
|
|
7
8
|
import { SignUp } from "./SignUp";
|
|
8
|
-
export declare class AppsScriptAuthSignUp {
|
|
9
|
-
email: SignUp<EmailPasswordRegistrationInput>["execute"];
|
|
10
|
-
appsScript: SignUp<AppsScriptRegistrationInput>["execute"];
|
|
11
|
-
constructor({ sessionStorage, expiresIn, repository, emailPassword, appsScript, utilities, session, }: {
|
|
9
|
+
export declare class AppsScriptAuthSignUp<THookResult = undefined> {
|
|
10
|
+
email: SignUp<EmailPasswordRegistrationInput, THookResult>["execute"];
|
|
11
|
+
appsScript: SignUp<AppsScriptRegistrationInput, THookResult>["execute"];
|
|
12
|
+
constructor({ sessionStorage, expiresIn, afterSignIn, repository, emailPassword, appsScript, utilities, session, }: {
|
|
12
13
|
sessionStorage: AppsScriptSessionStorage;
|
|
13
14
|
expiresIn: number;
|
|
15
|
+
afterSignIn?: AfterSignInHook<THookResult>;
|
|
14
16
|
repository: AppsScriptAuthRepository;
|
|
15
17
|
emailPassword?: EmailPasswordAuthConfig;
|
|
16
18
|
appsScript?: AppsScriptAuthenticationConfig;
|
|
@@ -7,7 +7,7 @@ const SignUp_1 = require("./SignUp");
|
|
|
7
7
|
class AppsScriptAuthSignUp {
|
|
8
8
|
email;
|
|
9
9
|
appsScript;
|
|
10
|
-
constructor({ sessionStorage, expiresIn, repository, emailPassword, appsScript, utilities, session, }) {
|
|
10
|
+
constructor({ sessionStorage, expiresIn, afterSignIn, repository, emailPassword, appsScript, utilities, session, }) {
|
|
11
11
|
this.email = async (input) => {
|
|
12
12
|
if (!emailPassword) {
|
|
13
13
|
throw new Error("Email and password authentication is disabled");
|
|
@@ -15,6 +15,7 @@ class AppsScriptAuthSignUp {
|
|
|
15
15
|
emailPassword.ensureSignUpEnabled();
|
|
16
16
|
const emailSignUp = new SignUp_1.SignUp({
|
|
17
17
|
sessionStorage,
|
|
18
|
+
afterSignIn,
|
|
18
19
|
expiresIn,
|
|
19
20
|
registration: new EmailPasswordRegistration_1.EmailPasswordRegistration(repository, utilities, emailPassword),
|
|
20
21
|
utilities,
|
|
@@ -28,6 +29,7 @@ class AppsScriptAuthSignUp {
|
|
|
28
29
|
appsScript.ensureSignUpEnabled();
|
|
29
30
|
const appsScriptSignUp = new SignUp_1.SignUp({
|
|
30
31
|
sessionStorage,
|
|
32
|
+
afterSignIn,
|
|
31
33
|
expiresIn,
|
|
32
34
|
registration: new AppsScriptRegistration_1.AppsScriptRegistration(utilities, session, repository),
|
|
33
35
|
utilities,
|
package/dist/api/SignUp.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { User } from "../domain/User";
|
|
1
|
+
import type { AfterSignInHook } from "../hooks/AuthHooks";
|
|
3
2
|
import type { Registration } from "../registration/Registration";
|
|
4
3
|
import type { AppsScriptSessionStorage } from "../storage/AppsScriptSessionStorage";
|
|
5
|
-
|
|
4
|
+
import type { SignInResult } from "./SignIn";
|
|
5
|
+
export type SignUpResult<THookResult = undefined> = SignInResult<THookResult>;
|
|
6
|
+
export declare class SignUp<T, THookResult = undefined> {
|
|
7
|
+
private readonly afterSignIn;
|
|
6
8
|
private readonly sessionStorage;
|
|
7
9
|
private readonly registration;
|
|
8
10
|
private readonly utilities;
|
|
9
11
|
private readonly expiresIn;
|
|
10
|
-
constructor({ sessionStorage, registration, utilities, expiresIn, }: {
|
|
12
|
+
constructor({ sessionStorage, registration, utilities, expiresIn, afterSignIn, }: {
|
|
11
13
|
sessionStorage: AppsScriptSessionStorage;
|
|
12
14
|
registration: Registration<T>;
|
|
13
15
|
utilities: GoogleAppsScript.Utilities.Utilities;
|
|
14
16
|
expiresIn: number;
|
|
17
|
+
afterSignIn?: AfterSignInHook<THookResult>;
|
|
15
18
|
});
|
|
16
|
-
execute(input: T): Promise<
|
|
17
|
-
user: User;
|
|
18
|
-
session: Session;
|
|
19
|
-
}>;
|
|
19
|
+
execute(input: T): Promise<SignUpResult<THookResult>>;
|
|
20
20
|
}
|
package/dist/api/SignUp.js
CHANGED
|
@@ -3,15 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SignUp = void 0;
|
|
4
4
|
const Session_1 = require("../domain/Session");
|
|
5
5
|
class SignUp {
|
|
6
|
+
afterSignIn;
|
|
6
7
|
sessionStorage;
|
|
7
8
|
registration;
|
|
8
9
|
utilities;
|
|
9
10
|
expiresIn;
|
|
10
|
-
constructor({ sessionStorage, registration, utilities, expiresIn, }) {
|
|
11
|
+
constructor({ sessionStorage, registration, utilities, expiresIn, afterSignIn, }) {
|
|
11
12
|
this.sessionStorage = sessionStorage;
|
|
12
13
|
this.registration = registration;
|
|
13
14
|
this.utilities = utilities;
|
|
14
15
|
this.expiresIn = expiresIn;
|
|
16
|
+
this.afterSignIn = afterSignIn;
|
|
15
17
|
}
|
|
16
18
|
async execute(input) {
|
|
17
19
|
const user = await this.registration.register(input);
|
|
@@ -23,7 +25,22 @@ class SignUp {
|
|
|
23
25
|
expiresAt: new Date(now.getTime() + this.expiresIn),
|
|
24
26
|
});
|
|
25
27
|
await this.sessionStorage.save(session);
|
|
26
|
-
|
|
28
|
+
if (!this.afterSignIn) {
|
|
29
|
+
return { user, session };
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const hooks = await this.afterSignIn({ user, session });
|
|
33
|
+
return { user, session, hooks };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
try {
|
|
37
|
+
await this.sessionStorage.delete(session.id);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Preserve the original hook error. Registration remains intact.
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
27
44
|
}
|
|
28
45
|
}
|
|
29
46
|
exports.SignUp = SignUp;
|
package/package.json
CHANGED