using UnityEngine;
using Glitch9.AIDevKit.Agents;
using Cysharp.Threading.Tasks;
using System.Net;
public class OAuthManager : MonoBehaviour
{
[SerializeField] private AgentBehaviour agent;
private MCPController mcpController;
private Dictionary<string, OAuthToken> tokens = new();
async void Start()
{
await SetupOAuth();
}
async UniTask SetupOAuth()
{
mcpController = agent.MCPController;
// Register providers
RegisterGitHubProvider();
RegisterGoogleProvider();
// Listen for OAuth events
mcpController.onOAuthRequired.AddListener(HandleOAuthRequired);
mcpController.onOAuthCompleted.AddListener(HandleOAuthCompleted);
mcpController.onOAuthError.AddListener(HandleOAuthError);
// Load saved tokens
LoadSavedTokens();
Debug.Log("✓ OAuth manager ready");
}
void RegisterGitHubProvider()
{
mcpController.RegisterOAuthProvider(new OAuthProviderConfig
{
ProviderId = "github",
ClientId = GetConfig("GITHUB_CLIENT_ID"),
ClientSecret = GetConfig("GITHUB_CLIENT_SECRET"),
AuthorizationEndpoint = "https://github.com/login/oauth/authorize",
TokenEndpoint = "https://github.com/login/oauth/access_token",
Scopes = new[] { "repo", "read:user" },
RedirectUri = "http://localhost:8080/callback"
});
Debug.Log("✓ GitHub OAuth provider registered");
}
void RegisterGoogleProvider()
{
mcpController.RegisterOAuthProvider(new OAuthProviderConfig
{
ProviderId = "google",
ClientId = GetConfig("GOOGLE_CLIENT_ID"),
ClientSecret = GetConfig("GOOGLE_CLIENT_SECRET"),
AuthorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth",
TokenEndpoint = "https://oauth2.googleapis.com/token",
Scopes = new[] { "https://www.googleapis.com/auth/drive.readonly" },
RedirectUri = "http://localhost:8080/callback"
});
Debug.Log("✓ Google OAuth provider registered");
}
async void HandleOAuthRequired(OAuthRequest request)
{
Debug.Log($"🔐 OAuth required: {request.ProviderId}");
// Open browser
Application.OpenURL(request.AuthorizationUrl);
Debug.Log($"Opening: {request.AuthorizationUrl}");
// Wait for callback
string authCode = await WaitForAuthorizationCallback();
if (!string.IsNullOrEmpty(authCode))
{
await mcpController.CompleteOAuthAsync(request.ProviderId, authCode);
}
}
async UniTask<string> WaitForAuthorizationCallback()
{
var listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();
Debug.Log("⏳ Waiting for OAuth callback...");
try
{
var context = await listener.GetContextAsync();
var code = context.Request.QueryString["code"];
// Send success page
var response = context.Response;
string html = "<html><body><h1>✓ Authorization Successful</h1><p>You can close this window.</p></body></html>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(html);
response.ContentLength64 = buffer.Length;
await response.OutputStream.WriteAsync(buffer, 0, buffer.Length);
response.Close();
return code;
}
finally
{
listener.Stop();
}
}
void HandleOAuthCompleted(string providerId, OAuthToken token)
{
Debug.Log($"✓ OAuth completed: {providerId}");
// Save token
tokens[providerId] = token;
SaveToken(providerId, token);
}
void HandleOAuthError(string providerId, string error)
{
Debug.LogError($"OAuth error ({providerId}): {error}");
}
void SaveToken(string providerId, OAuthToken token)
{
string json = JsonUtility.ToJson(token);
PlayerPrefs.SetString($"oauth_token_{providerId}", json);
PlayerPrefs.Save();
}
void LoadSavedTokens()
{
string[] providers = { "github", "google" };
foreach (var providerId in providers)
{
string key = $"oauth_token_{providerId}";
if (PlayerPrefs.HasKey(key))
{
string json = PlayerPrefs.GetString(key);
var token = JsonUtility.FromJson<OAuthToken>(json);
tokens[providerId] = token;
Debug.Log($"✓ Loaded token for {providerId}");
}
}
}
string GetConfig(string key)
{
return PlayerPrefs.GetString(key, "");
}
}