|
@@ -1,4 +1,8 @@
|
|
|
|
|
+import type { IUser, IUserHasId } from '@growi/core/dist/interfaces';
|
|
|
|
|
+import type { IUserSerializedSecurely } from '@growi/core/dist/models/serializers';
|
|
|
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
|
|
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
|
|
|
|
|
+import type { NextFunction, Request, Response } from 'express';
|
|
|
|
|
+import type { HydratedDocument } from 'mongoose';
|
|
|
import mongoose from 'mongoose';
|
|
import mongoose from 'mongoose';
|
|
|
|
|
|
|
|
import loggerFactory from '~/utils/logger';
|
|
import loggerFactory from '~/utils/logger';
|
|
@@ -6,20 +10,31 @@ import loggerFactory from '~/utils/logger';
|
|
|
|
|
|
|
|
const logger = loggerFactory('growi:middleware:access-token-parser');
|
|
const logger = loggerFactory('growi:middleware:access-token-parser');
|
|
|
|
|
|
|
|
-module.exports = (crowi) => {
|
|
|
|
|
|
|
+type ReqQuery = {
|
|
|
|
|
+ access_token?: string,
|
|
|
|
|
+}
|
|
|
|
|
+type ReqBody = {
|
|
|
|
|
+ access_token?: string,
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- return async(req, res, next) => {
|
|
|
|
|
|
|
+interface Req extends Request<undefined, undefined, ReqBody, ReqQuery> {
|
|
|
|
|
+ user: IUserSerializedSecurely<IUserHasId>,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const middlewareFactory = () => {
|
|
|
|
|
+
|
|
|
|
|
+ return async(req: Req, res: Response, next: NextFunction): Promise<void> => {
|
|
|
// TODO: comply HTTP header of RFC6750 / Authorization: Bearer
|
|
// TODO: comply HTTP header of RFC6750 / Authorization: Bearer
|
|
|
- const accessToken = req.query.access_token || req.body.access_token || null;
|
|
|
|
|
|
|
+ const accessToken = req.query.access_token ?? req.body.access_token;
|
|
|
if (accessToken == null || typeof accessToken !== 'string') {
|
|
if (accessToken == null || typeof accessToken !== 'string') {
|
|
|
return next();
|
|
return next();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const User = mongoose.model('User');
|
|
|
|
|
|
|
+ const User = mongoose.model<HydratedDocument<IUser>, { findUserByApiToken }>('User');
|
|
|
|
|
|
|
|
logger.debug('accessToken is', accessToken);
|
|
logger.debug('accessToken is', accessToken);
|
|
|
|
|
|
|
|
- const user = await User.findUserByApiToken(accessToken).lean();
|
|
|
|
|
|
|
+ const user: IUserHasId = await User.findUserByApiToken(accessToken);
|
|
|
|
|
|
|
|
if (user == null) {
|
|
if (user == null) {
|
|
|
logger.debug('The access token is invalid');
|
|
logger.debug('The access token is invalid');
|
|
@@ -35,3 +50,6 @@ module.exports = (crowi) => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+module.exports = middlewareFactory;
|
|
|
|
|
+// export default middlewareFactory;
|