refactor(server/middleware): update current user middleware
- check for titlecased version of auth header - check for token's `sub` field as well as `id` - ensure we don't select sensitive info when querying the user - don't throw if there's no user logged in for that request
This commit is contained in:
		
							parent
							
								
									53409d12da
								
							
						
					
					
						commit
						480655a0ee
					
				| @ -1,26 +1,26 @@ | ||||
| import jwt from "jsonwebtoken"; | ||||
| import { log } from "@server/logger"; | ||||
| import { messages } from "@server/constants"; | ||||
| import { User } from "@models/user"; | ||||
| import { AccessToken } from "@models/oauth"; | ||||
| import { IJwt } from "@server/types/authstuff"; | ||||
| import { IUser, User } from "@models/user"; | ||||
| 
 | ||||
| export default defineEventHandler(async (event) => { | ||||
| 	let ahead = (getHeaders(event).authorization || "")?.replace("Bearer ", ""); | ||||
| 	let ahead = (getHeaders(event).authorization || getHeaders(event).Authorization || getCookie(event, "rockfic_cookie"))?.replace("Bearer ", ""); | ||||
| 	if (ahead) { | ||||
| 		let toktok: jwt.JwtPayload; | ||||
| 		let toktok: any; | ||||
| 		let user: IUser | null = null; | ||||
| 		try { | ||||
| 			toktok = jwt.verify(ahead, useRuntimeConfig().jwt) as IJwt; | ||||
| 			let user = await User.findById(toktok.id as number).exec(); | ||||
| 			if (user && toktok) event.context.currentUser = user; | ||||
| 		} catch (e) { | ||||
| 			const t = await AccessToken.findOne({ token: ahead }); | ||||
| 			if (!t) | ||||
| 				throw createError({ | ||||
| 					statusCode: 401, | ||||
| 					message: messages[401], | ||||
| 				}); | ||||
| 			let user = await User.findById(t.userID); | ||||
| 			toktok = jwt.verify(ahead, useRuntimeConfig().jwt); | ||||
| 			console.log(toktok); | ||||
| 			if (toktok?.sub) { | ||||
| 				user = await User.findById(toktok.sub as number) | ||||
| 					.select("-password -auth -ipLog") | ||||
| 					.exec(); | ||||
| 			} else if (toktok.id) { | ||||
| 				user = await User.findById(toktok.id as number) | ||||
| 					.select("-password -auth -ipLog") | ||||
| 					.exec(); | ||||
| 			} | ||||
| 		} catch (E) { | ||||
| 			console.error(E); | ||||
| 		} finally { | ||||
| 			if (user) event.context.currentUser = user; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user