# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import requests import json from odoo import http from odoo.http import request class GoogleOAuthController(http.Controller): @http.route('/web/google_oauth_callback', type='http', auth='public', website=True) def google_oauth_callback(self, **kw): """Handle Google OAuth callback and exchange code for token""" # Get the authorization code from the callback code = kw.get('code') state = kw.get('state') error = kw.get('error') if error: return f"""
Error: {error}
""" if not code: return """No authorization code received
""" try: # Get configuration client_id = request.env['ir.config_parameter'].sudo().get_param('google_api.client_id') client_secret = request.env['ir.config_parameter'].sudo().get_param('google_api.client_secret') redirect_uri = request.env['ir.config_parameter'].sudo().get_param('google_api.manual_redirect_uri') if not all([client_id, client_secret, redirect_uri]): raise Exception("Missing OAuth configuration") # Exchange code for token token_url = "https://oauth2.googleapis.com/token" token_data = { 'client_id': client_id, 'client_secret': client_secret, 'code': code, 'grant_type': 'authorization_code', 'redirect_uri': redirect_uri, } response = requests.post(token_url, data=token_data, timeout=30) if response.status_code != 200: raise Exception(f"Token exchange failed: {response.status_code} - {response.text}") token_info = response.json() # Store the token information access_token = token_info.get('access_token') refresh_token = token_info.get('refresh_token') if not access_token: raise Exception("No access token received") # Store tokens in config parameters (for now, in production you'd want a more secure storage) request.env['ir.config_parameter'].sudo().set_param('google_api.access_token', access_token) if refresh_token: request.env['ir.config_parameter'].sudo().set_param('google_api.refresh_token', refresh_token) # Test the token by making a simple API call headers = {'Authorization': f'Bearer {access_token}'} test_response = requests.get( 'https://www.googleapis.com/drive/v3/about?fields=user', headers=headers, timeout=10 ) if test_response.status_code == 200: user_info = test_response.json() user_email = user_info.get('user', {}).get('emailAddress', 'Unknown') return f"""Successfully connected to Google Drive as: {user_email}
Access token has been stored and is ready to use.
""" else: raise Exception(f"Token validation failed: {test_response.status_code}") except Exception as e: return f"""Error: {str(e)}
"""