You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
import json
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from google.oauth2.credentials import Credentials
|
|
from google_auth_oauthlib.flow import Flow
|
|
|
|
from app.core.config import settings
|
|
|
|
def build_flow(state: Optional[str] = None) -> Flow:
|
|
flow = Flow.from_client_secrets_file(
|
|
settings.GOOGLE_CLIENT_SECRET_FILE,
|
|
scopes=settings.scopes_list(),
|
|
state=state,
|
|
)
|
|
flow.redirect_uri = settings.GOOGLE_REDIRECT_URI
|
|
return flow
|
|
|
|
def creds_from_token_json(token_json: str) -> Credentials:
|
|
data = json.loads(token_json)
|
|
# google.oauth2.credentials.Credentials acepta kwargs del token JSON
|
|
return Credentials(**data)
|
|
|
|
def token_json_from_creds(creds: Credentials) -> str:
|
|
# Convertimos a dict estándar
|
|
data = {
|
|
"token": creds.token,
|
|
"refresh_token": creds.refresh_token,
|
|
"token_uri": creds.token_uri,
|
|
"client_id": creds.client_id,
|
|
"client_secret": creds.client_secret,
|
|
"scopes": creds.scopes,
|
|
"id_token": getattr(creds, "id_token", None),
|
|
}
|
|
# Algunos campos pueden ser None; igual está ok.
|
|
return json.dumps(data, ensure_ascii=False)
|