MCP Server Box
by box-community
Verified
"""Handles the call back request from Box OAuth2.0
---
This is a simple HTTP server that listens for a request from Box OAuth2.0.
picking up the code and csrf_token from the query string.
"""
import logging
import urllib.parse
import webbrowser
from http.server import BaseHTTPRequestHandler, HTTPServer
from box_sdk_gen import BoxClient, BoxOAuth
CSRF_TOKEN_ORIG = ""
AUTH = None
class CallbackServer(BaseHTTPRequestHandler):
"""
Creates a mini http request handler to handle a single callback request"""
def do_GET(self): # pylint: disable=invalid-name
"""
Gets the redirect call back from Box OAuth2.0
capturing the code and csrf_token from the query string
and calls for the completion of the OAuth2.0 process.
"""
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
params = urllib.parse.parse_qs(urllib.parse.urlparse(self.path).query)
code = " ".join(params.get("code")) if params.get("code") else None
state = " ".join(params.get("state")) if params.get("state") else None
error = " ".join(params.get("error")) if params.get("error") else None
error_description = (
" ".join(params.get("error_description"))
if params.get("error_description")
else None
)
logging.info("code: %s", code)
logging.info("state: %s", state)
logging.info("error: %s", error)
logging.info("error_description: %s", error_description)
if state != CSRF_TOKEN_ORIG:
error = "Invalid State token"
error_description = (
"The unique state token send is not the same one received."
)
if error:
html_response = f"""
<html>
<head>
<title>Box Authentication Error</title>
<style>
body {{
font-family: Arial, sans-serif;
text-align: center;
padding-top: 50px;
}}
.container {{
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f9f9f9;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}}
h1 {{
color: #c82124;
}}
p {{
font-size: 16px;
line-height: 1.5;
}}
</style>
</head>
<body>
<div class="container">
<h1>Box authorization error</h1>
<p>An error occurred during authorization.</p>
<p>Error: {error}</p>
<p>Error Description: {error_description}</p>
</div>
</body>
</html>
"""
if code:
AUTH.get_tokens_authorization_code_grant(code)
html_response = """
<html>
<head>
<title>Box Authentication Successful</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
padding-top: 50px;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f9f9f9;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h1 {
color: #0061d5;
}
p {
font-size: 16px;
line-height: 1.5;
}
</style>
</head>
<body>
<div class="container">
<h1>Success!</h1>
<p>Authorization completed successfully.</p>
<p>You can now close this window and return to the application.</p>
</div>
</body>
</html>
"""
self.wfile.write(
bytes(html_response, "utf-8"),
)
def callback_handle_request(auth: BoxOAuth, hostname, port, csrf_token: str):
"""
Handles the call back request from Box OAuth2.0
Creates a simple HTTP server that listens for a request from Box OAuth2.0.
"""
global CSRF_TOKEN_ORIG # pylint: disable=global-statement
CSRF_TOKEN_ORIG = csrf_token
global AUTH # pylint: disable=global-statement
AUTH = auth
web_server = HTTPServer((hostname, port), CallbackServer)
logging.info(
"Server started http://%s:%s",
hostname,
port,
)
try:
web_server.handle_request()
finally:
web_server.server_close()
logging.info("Server stopped.")
def open_browser(auth_url: str):
"""
Opens a browser to the auth_url
"""
webbrowser.open(auth_url)