Просмотр исходного кода

feat: implement extractBearerToken function for token extraction from Authorization header

Shun Miyazawa 7 месяцев назад
Родитель
Сommit
53d05860c9

+ 4 - 1
apps/app/src/server/middlewares/access-token-parser/access-token.ts

@@ -5,14 +5,17 @@ import type { Response } from 'express';
 import { AccessToken } from '~/server/models/access-token';
 import { AccessToken } from '~/server/models/access-token';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
+import { extractBearerToken } from './extract-bearer-token';
 import type { AccessTokenParserReq } from './interfaces';
 import type { AccessTokenParserReq } from './interfaces';
 
 
 const logger = loggerFactory('growi:middleware:access-token-parser:access-token');
 const logger = loggerFactory('growi:middleware:access-token-parser:access-token');
 
 
 export const parserForAccessToken = (scopes: Scope[]) => {
 export const parserForAccessToken = (scopes: Scope[]) => {
   return async(req: AccessTokenParserReq, res: Response): Promise<void> => {
   return async(req: AccessTokenParserReq, res: Response): Promise<void> => {
+    // Extract token from Authorization header first
+    const bearerToken = extractBearerToken(req.headers.authorization);
 
 
-    const accessToken = req.query.access_token ?? req.body.access_token;
+    const accessToken = bearerToken ?? req.query.access_token ?? req.body.access_token;
     if (accessToken == null || typeof accessToken !== 'string') {
     if (accessToken == null || typeof accessToken !== 'string') {
       return;
       return;
     }
     }

+ 2 - 13
apps/app/src/server/middlewares/access-token-parser/api-token.ts

@@ -1,27 +1,16 @@
 import type { IUser, IUserHasId } from '@growi/core/dist/interfaces';
 import type { IUser, IUserHasId } from '@growi/core/dist/interfaces';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
-import type { NextFunction, Response } from 'express';
+import type { Response } from 'express';
 import type { HydratedDocument } from 'mongoose';
 import type { HydratedDocument } from 'mongoose';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
 
 
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
+import { extractBearerToken } from './extract-bearer-token';
 import type { AccessTokenParserReq } from './interfaces';
 import type { AccessTokenParserReq } from './interfaces';
 
 
 const logger = loggerFactory('growi:middleware:access-token-parser:api-token');
 const logger = loggerFactory('growi:middleware:access-token-parser:api-token');
 
 
-const extractBearerToken = (authHeader: string | undefined): string | null => {
-  if (authHeader == null) {
-    return null;
-  }
-
-  if (!authHeader.startsWith('Bearer ')) {
-    return null;
-  }
-
-  return authHeader.substring(7); // Remove 'Bearer ' prefix
-};
-
 
 
 export const parserForApiToken = async(req: AccessTokenParserReq, res: Response): Promise<void> => {
 export const parserForApiToken = async(req: AccessTokenParserReq, res: Response): Promise<void> => {
   // Extract token from Authorization header first
   // Extract token from Authorization header first

+ 11 - 0
apps/app/src/server/middlewares/access-token-parser/extract-bearer-token.ts

@@ -0,0 +1,11 @@
+export const extractBearerToken = (authHeader: string | undefined): string | null => {
+  if (authHeader == null) {
+    return null;
+  }
+
+  if (!authHeader.startsWith('Bearer ')) {
+    return null;
+  }
+
+  return authHeader.substring(7); // Remove 'Bearer ' prefix
+};