@dotpress/auth 1.0.1 → 1.1.1
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/lib/handlers.js +17 -1
- package/dist/lib/tokens.d.ts +4 -2
- package/dist/lib/tokens.js +4 -3
- package/dist/types/types.d.ts +5 -0
- package/package.json +1 -1
package/dist/lib/handlers.js
CHANGED
|
@@ -14,6 +14,7 @@ export const registerHandlers = (plugin) => {
|
|
|
14
14
|
username: z.string(),
|
|
15
15
|
password: z.string(),
|
|
16
16
|
client: z.string().optional(),
|
|
17
|
+
aud: settings.aud?.required ? z.string() : z.string().optional(),
|
|
17
18
|
}),
|
|
18
19
|
response: z.object({
|
|
19
20
|
userId: z.string(),
|
|
@@ -22,7 +23,7 @@ export const registerHandlers = (plugin) => {
|
|
|
22
23
|
}),
|
|
23
24
|
}),
|
|
24
25
|
handler: async ({ req }) => {
|
|
25
|
-
const { username, password, client } = req.body;
|
|
26
|
+
const { username, password, client, aud } = req.body;
|
|
26
27
|
const ipAddress = getRequestIp(req);
|
|
27
28
|
const user = await settings.dataProvider.findUserIdentifiers(username);
|
|
28
29
|
if (!user) {
|
|
@@ -48,9 +49,24 @@ export const registerHandlers = (plugin) => {
|
|
|
48
49
|
}
|
|
49
50
|
return unauthorizedError('INVALID_LOGIN');
|
|
50
51
|
}
|
|
52
|
+
if (aud && typeof settings.aud?.isUserRoleAllowed === 'function') {
|
|
53
|
+
const isAllowed = settings.aud.isUserRoleAllowed(user.role || '', aud);
|
|
54
|
+
if (!isAllowed) {
|
|
55
|
+
if (settings.onLoginFailed) {
|
|
56
|
+
await settings.onLoginFailed({
|
|
57
|
+
username,
|
|
58
|
+
errorType: 'invalid_role',
|
|
59
|
+
client: client || '',
|
|
60
|
+
ipAddress: ipAddress || '',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return unauthorizedError('INVALID_LOGIN');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
51
66
|
const { accessToken, refreshToken } = await generateTokensForUser({
|
|
52
67
|
username,
|
|
53
68
|
userId: user.userId,
|
|
69
|
+
aud,
|
|
54
70
|
});
|
|
55
71
|
if (settings.onLoginSuccess) {
|
|
56
72
|
await settings.onLoginSuccess({
|
package/dist/lib/tokens.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ type CreateTokenPayload = {
|
|
|
3
3
|
sub: string;
|
|
4
4
|
username: string;
|
|
5
5
|
auth_time: number;
|
|
6
|
+
aud?: string;
|
|
6
7
|
};
|
|
7
8
|
type CreatedAccessToken = {
|
|
8
9
|
jwtId: string;
|
|
@@ -15,14 +16,15 @@ type CreatedRefreshToken = {
|
|
|
15
16
|
type UserIdentifiers = {
|
|
16
17
|
userId: string;
|
|
17
18
|
username: string;
|
|
19
|
+
aud?: string;
|
|
18
20
|
};
|
|
19
21
|
export declare const createAccessTokenFromPayload: (payload: CreateTokenPayload) => CreatedAccessToken;
|
|
20
22
|
export declare const generateRefreshToken: () => CreatedRefreshToken;
|
|
21
23
|
/**
|
|
22
24
|
* Generate a pair of access and refresh tokens for a given user
|
|
23
25
|
*/
|
|
24
|
-
export declare const generateTokensForUser: ({ userId, username, }: UserIdentifiers) => Promise<TokenPair>;
|
|
25
|
-
export declare const generateAccessToken: ({ userId, username, }: UserIdentifiers) => CreatedAccessToken;
|
|
26
|
+
export declare const generateTokensForUser: ({ userId, username, aud, }: UserIdentifiers) => Promise<TokenPair>;
|
|
27
|
+
export declare const generateAccessToken: ({ userId, username, aud, }: UserIdentifiers) => CreatedAccessToken;
|
|
26
28
|
/**
|
|
27
29
|
* Regenerate a pair of token using a refresh token
|
|
28
30
|
* Expired access token must be provided in order to validate userId and jwtId
|
package/dist/lib/tokens.js
CHANGED
|
@@ -27,9 +27,9 @@ export const generateRefreshToken = () => {
|
|
|
27
27
|
/**
|
|
28
28
|
* Generate a pair of access and refresh tokens for a given user
|
|
29
29
|
*/
|
|
30
|
-
export const generateTokensForUser = async ({ userId, username, }) => {
|
|
30
|
+
export const generateTokensForUser = async ({ userId, username, aud, }) => {
|
|
31
31
|
const settings = getSettings();
|
|
32
|
-
const { jwtId, accessToken } = generateAccessToken({ userId, username });
|
|
32
|
+
const { jwtId, accessToken } = generateAccessToken({ userId, username, aud });
|
|
33
33
|
const { token: refreshToken, tokenHash: refreshTokenHash } = generateRefreshToken();
|
|
34
34
|
await settings.dataProvider.storeRefreshToken({
|
|
35
35
|
token: refreshToken,
|
|
@@ -43,11 +43,12 @@ export const generateTokensForUser = async ({ userId, username, }) => {
|
|
|
43
43
|
refreshToken,
|
|
44
44
|
};
|
|
45
45
|
};
|
|
46
|
-
export const generateAccessToken = ({ userId, username, }) => {
|
|
46
|
+
export const generateAccessToken = ({ userId, username, aud, }) => {
|
|
47
47
|
return createAccessTokenFromPayload({
|
|
48
48
|
sub: userId,
|
|
49
49
|
username,
|
|
50
50
|
auth_time: Math.floor(Date.now() / 1000),
|
|
51
|
+
aud,
|
|
51
52
|
});
|
|
52
53
|
};
|
|
53
54
|
const addDaysFromNow = (days) => {
|
package/dist/types/types.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export type AuthSettings = {
|
|
|
16
16
|
issuer: string;
|
|
17
17
|
onLoginFailed?: (e: LoginFailedEvent) => Promise<void>;
|
|
18
18
|
onLoginSuccess?: (e: LoginSuccessEvent) => Promise<void>;
|
|
19
|
+
aud?: {
|
|
20
|
+
required?: boolean;
|
|
21
|
+
isUserRoleAllowed: (role: string, aud: string) => boolean;
|
|
22
|
+
};
|
|
19
23
|
};
|
|
20
24
|
type LoginFailedEvent = {
|
|
21
25
|
username: string;
|
|
@@ -69,6 +73,7 @@ export type DataProvider = {
|
|
|
69
73
|
findUserIdentifiers: (username: string) => Promise<{
|
|
70
74
|
userId: string;
|
|
71
75
|
passwordHash: string;
|
|
76
|
+
role?: string;
|
|
72
77
|
} | undefined>;
|
|
73
78
|
};
|
|
74
79
|
export {};
|