mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-02-17 16:08:10 +01:00
🛡️ fix: Secure MCP/Actions OAuth Flows, Resolve Race Condition & Tool Cache Cleanup (#11756)
* 🔧 fix: Update OAuth error message for clarity - Changed the default error message in the OAuth error route from 'Unknown error' to 'Unknown OAuth error' to provide clearer context during authentication failures. * 🔒 feat: Enhance OAuth flow with CSRF protection and session management - Implemented CSRF protection for OAuth flows by introducing `generateOAuthCsrfToken`, `setOAuthCsrfCookie`, and `validateOAuthCsrf` functions. - Added session management for OAuth with `setOAuthSession` and `validateOAuthSession` middleware. - Updated routes to bind CSRF tokens for MCP and action OAuth flows, ensuring secure authentication. - Enhanced tests to validate CSRF handling and session management in OAuth processes. * 🔧 refactor: Invalidate cached tools after user plugin disconnection - Added a call to `invalidateCachedTools` in the `updateUserPluginsController` to ensure that cached tools are refreshed when a user disconnects from an MCP server after a plugin authentication update. This change improves the accuracy of tool data for users. * chore: imports order * fix: domain separator regex usage in ToolService - Moved the declaration of `domainSeparatorRegex` to avoid redundancy in the `loadActionToolsForExecution` function, improving code clarity and performance. * chore: OAuth flow error handling and CSRF token generation - Enhanced the OAuth callback route to validate the flow ID format, ensuring proper error handling for invalid states. - Updated the CSRF token generation function to require a JWT secret, throwing an error if not provided, which improves security and clarity in token generation. - Adjusted tests to reflect changes in flow ID handling and ensure robust validation across various scenarios.
This commit is contained in:
parent
72a30cd9c4
commit
599f4a11f1
14 changed files with 523 additions and 141 deletions
|
|
@ -181,6 +181,11 @@ export const cancelMCPOAuth = (serverName: string) => {
|
|||
return `${BASE_URL}/api/mcp/oauth/cancel/${serverName}`;
|
||||
};
|
||||
|
||||
export const mcpOAuthBind = (serverName: string) => `${BASE_URL}/api/mcp/${serverName}/oauth/bind`;
|
||||
|
||||
export const actionOAuthBind = (actionId: string) =>
|
||||
`${BASE_URL}/api/actions/${actionId}/oauth/bind`;
|
||||
|
||||
export const config = () => `${BASE_URL}/api/config`;
|
||||
|
||||
export const prompts = () => `${BASE_URL}/api/prompts`;
|
||||
|
|
|
|||
|
|
@ -178,6 +178,14 @@ export const reinitializeMCPServer = (serverName: string) => {
|
|||
return request.post(endpoints.mcpReinitialize(serverName));
|
||||
};
|
||||
|
||||
export const bindMCPOAuth = (serverName: string): Promise<{ success: boolean }> => {
|
||||
return request.post(endpoints.mcpOAuthBind(serverName));
|
||||
};
|
||||
|
||||
export const bindActionOAuth = (actionId: string): Promise<{ success: boolean }> => {
|
||||
return request.post(endpoints.actionOAuthBind(actionId));
|
||||
};
|
||||
|
||||
export const getMCPConnectionStatus = (): Promise<q.MCPConnectionStatusResponse> => {
|
||||
return request.get(endpoints.mcpConnectionStatus());
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue