Update OAuth callback code

This commit is contained in:
Justin Spahr-Summers
2025-02-11 17:42:49 +00:00
parent eb6af47b21
commit e9a50adde7
3 changed files with 11 additions and 13 deletions

View File

@@ -1,6 +1,7 @@
import { useEffect, useRef } from "react"; import { useEffect, useRef } from "react";
import { handleOAuthCallback } from "../lib/auth"; import { authProvider } from "../lib/auth";
import { SESSION_KEYS } from "../lib/constants"; import { SESSION_KEYS } from "../lib/constants";
import { auth } from "@modelcontextprotocol/sdk/client/auth.js";
const OAuthCallback = () => { const OAuthCallback = () => {
const hasProcessedRef = useRef(false); const hasProcessedRef = useRef(false);
@@ -24,15 +25,11 @@ const OAuthCallback = () => {
} }
try { try {
const tokens = await handleOAuthCallback(serverUrl, code); const result = await auth(authProvider, { serverUrl, authorizationCode: code });
// Store both access and refresh tokens if (result !== "AUTHORIZED") {
sessionStorage.setItem(SESSION_KEYS.ACCESS_TOKEN, tokens.access_token); throw new Error(`Expected to be authorized after providing auth code, got: ${result}`);
if (tokens.refresh_token) {
sessionStorage.setItem(
SESSION_KEYS.REFRESH_TOKEN,
tokens.refresh_token,
);
} }
// Redirect back to the main app with server URL to trigger auto-connect // Redirect back to the main app with server URL to trigger auto-connect
window.location.href = `/?serverUrl=${encodeURIComponent(serverUrl)}`; window.location.href = `/?serverUrl=${encodeURIComponent(serverUrl)}`;
} catch (error) { } catch (error) {

View File

@@ -1,7 +1,7 @@
import { OAuthClientInformation, OAuthClientInformationSchema, OAuthClientProvider, OAuthTokens, OAuthTokensSchema } from "@modelcontextprotocol/sdk/client/auth.js"; import { OAuthClientInformation, OAuthClientInformationSchema, OAuthClientProvider, OAuthTokens, OAuthTokensSchema } from "@modelcontextprotocol/sdk/client/auth.js";
import { SESSION_KEYS } from "./constants"; import { SESSION_KEYS } from "./constants";
export class InspectorOAuthClientProvider implements OAuthClientProvider { class InspectorOAuthClientProvider implements OAuthClientProvider {
get redirectUrl() { get redirectUrl() {
return window.location.origin + "/oauth/callback"; return window.location.origin + "/oauth/callback";
} }
@@ -69,3 +69,5 @@ export class InspectorOAuthClientProvider implements OAuthClientProvider {
return verifier; return verifier;
} }
} }
export const authProvider = new InspectorOAuthClientProvider();

View File

@@ -19,7 +19,7 @@ import { z } from "zod";
import { SESSION_KEYS } from "../constants"; import { SESSION_KEYS } from "../constants";
import { Notification, StdErrNotificationSchema } from "../notificationTypes"; import { Notification, StdErrNotificationSchema } from "../notificationTypes";
import { auth } from "@modelcontextprotocol/sdk/client/auth.js"; import { auth } from "@modelcontextprotocol/sdk/client/auth.js";
import { InspectorOAuthClientProvider } from "../auth"; import { authProvider } from "../auth";
const DEFAULT_REQUEST_TIMEOUT_MSEC = 10000; const DEFAULT_REQUEST_TIMEOUT_MSEC = 10000;
@@ -122,12 +122,11 @@ export function useConnection({
} }
}; };
const authProvider = new InspectorOAuthClientProvider();
const handleAuthError = async (error: unknown) => { const handleAuthError = async (error: unknown) => {
if (error instanceof SseError && error.code === 401) { if (error instanceof SseError && error.code === 401) {
sessionStorage.setItem(SESSION_KEYS.SERVER_URL, sseUrl); sessionStorage.setItem(SESSION_KEYS.SERVER_URL, sseUrl);
const result = await auth(authProvider, { serverUrl: sseUrl }) const result = await auth(authProvider, { serverUrl: sseUrl });
return result === "AUTHORIZED"; return result === "AUTHORIZED";
} }