Skip to content

Commit 616ab81

Browse files
authored
Merge pull request #70 from auth0-samples/fix-ms-agent-framework-pyton-connected-account
Connected account fix for MS Agent Framework + Python sample project
2 parents bfd582a + e4bfc81 commit 616ab81

5 files changed

Lines changed: 45 additions & 12 deletions

File tree

call-apis-on-users-behalf/others-api/ms-agent-framework-vault-token-py/auth0.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"scope": "openid profile email offline_access",
1313
"prompt": "consent"
1414
},
15+
mount_connected_account_routes=True,
1516
app_base_url=settings.app_base_url,
1617
secret=settings.SESSION_SECRET)
1718

call-apis-on-users-behalf/others-api/ms-agent-framework-vault-token-py/main.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from fastapi import FastAPI, Request, Response, Depends
1+
from fastapi import FastAPI, Request, HTTPException, Response, Depends
22
from fastapi.responses import FileResponse, RedirectResponse
33
from fastapi.staticfiles import StaticFiles
44
from pydantic import BaseModel
55
from messenger_agent import create_and_send_message
66
from starlette.middleware.sessions import SessionMiddleware
77
from auth0_fastapi.server.routes import router, register_auth_routes
8+
from auth0_fastapi.errors import AccessTokenForConnectionError
89
from auth0 import auth0_config, auth0_client
910
from config import Settings
1011
import uvicorn
@@ -43,15 +44,33 @@ async def submit_prompt(
4344
response: Response,
4445
auth_session = Depends(auth0_client.require_session)
4546
):
47+
try:
48+
store_options={"request": request, "response": response}
49+
gmail_token = await auth0_client.client.get_access_token_for_connection(
50+
{"connection": "google-oauth2"},
51+
store_options=store_options
52+
)
4653

47-
store_options={"request": request, "response": response}
48-
gmail_token = await auth0_client.client.get_access_token_for_connection({"connection": "google-oauth2"}, store_options=store_options)
49-
50-
result = await create_and_send_message(
51-
data.prompt,
52-
gmail_token
53-
)
54-
return {"response": result}
54+
result = await create_and_send_message(
55+
data.prompt,
56+
gmail_token
57+
)
58+
return {"response": result}
59+
60+
except AccessTokenForConnectionError:
61+
# User hasn't connected their Google account yet
62+
# Instruct frontend to POST to /auth/connect to initiate Connected Accounts flow
63+
raise HTTPException(
64+
status_code=403,
65+
detail={
66+
"error": "google_account_not_connected",
67+
"message": "Please connect your Google account first",
68+
"connect_endpoint": "/auth/connect",
69+
"connect_params": {
70+
"connection": "google-oauth2"
71+
}
72+
}
73+
)
5574

5675

5776
if __name__ == "__main__":

call-apis-on-users-behalf/others-api/ms-agent-framework-vault-token-py/messenger_agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ async def create_and_send_message(prompt: str, gmail_token: str) -> str:
3838

3939
email_tool = create_email_sender(gmail_token)
4040
response = await agent.run(prompt, tools=[email_tool])
41-
return response.messages[0].contents[0].text
41+
return response.text

call-apis-on-users-behalf/others-api/ms-agent-framework-vault-token-py/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ uvicorn>=0.15.0
33
pydantic>=2.0.0
44
pydantic-settings>=2.0.0
55
agent-framework
6-
auth0-fastapi>=0.3.0
6+
auth0-fastapi>=1.0.0b5
77
starlette
88
itsdangerous

call-apis-on-users-behalf/others-api/ms-agent-framework-vault-token-py/static/app.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,20 @@ async function sendMessage() {
1616
});
1717

1818
const data = await response.json();
19-
messagesContainer.innerHTML += `<div class="alert alert-secondary" style="max-width:80%">${data.response}</div>`;
19+
20+
// Handle connected account error
21+
if (response.status == 403 && data.detail?.error === 'google_account_not_connected') {
22+
messagesContainer.innerHTML += `<div class="alert alert-warning" style="max-width:80%">${data.detail.message}</div>`;
23+
24+
// Redirect to /auth/connect to initiate the Connected Accounts flow
25+
const connection = data.detail.connect_params?.connection || 'google-oauth2';
26+
window.location.href = `/auth/connect?connection=${connection}`;
27+
return;
28+
}
29+
30+
// Display the response or error
31+
const messageText = data.response || data.message || 'An error occurred';
32+
messagesContainer.innerHTML += `<div class="alert alert-secondary" style="max-width:80%">${messageText}</div>`;
2033
}
2134
}
2235

0 commit comments

Comments
 (0)