@danhachuel/thunderbolt 0.5.87 → 0.5.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import hashlib
|
|
4
|
+
import errno
|
|
4
5
|
import json
|
|
5
6
|
import os
|
|
6
7
|
import re
|
|
@@ -39,13 +40,21 @@ def _authorization_error_message(email: str, exc: Exception) -> str:
|
|
|
39
40
|
if "redirect_uri_mismatch" in detail.lower():
|
|
40
41
|
return (
|
|
41
42
|
f"A autorização da conta {email} foi rejeitada pelo Google (redirect_uri_mismatch). "
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
"
|
|
43
|
+
"Este fluxo usa um callback local loopback; crie ou seleccione uma credencial OAuth do tipo "
|
|
44
|
+
"Aplicativo para computador (Desktop app), não Aplicativo da Web. "
|
|
45
|
+
f"A porta predefinida é {loopback_redirect_uri()} e pode mudar automaticamente se estiver ocupada."
|
|
45
46
|
)
|
|
46
47
|
return f"A autorização da conta {email} falhou: {detail}"
|
|
47
48
|
|
|
48
49
|
|
|
50
|
+
def _is_address_in_use_error(exc: BaseException) -> bool:
|
|
51
|
+
"""Return whether an OAuth callback bind failed because its port is busy."""
|
|
52
|
+
if getattr(exc, "winerror", None) == 10048 or getattr(exc, "errno", None) == errno.EADDRINUSE:
|
|
53
|
+
return True
|
|
54
|
+
detail = str(exc).lower()
|
|
55
|
+
return "10048" in detail or "address already in use" in detail or "only one usage" in detail
|
|
56
|
+
|
|
57
|
+
|
|
49
58
|
def _text(value: Any) -> str:
|
|
50
59
|
return str(value or "").strip()
|
|
51
60
|
|
|
@@ -115,15 +124,26 @@ def authorize_account(account: dict[str, Any], storage_root: Path, *, open_brows
|
|
|
115
124
|
except ImportError as exc:
|
|
116
125
|
return IntegrationResult(False, "As dependências Google OAuth ainda não estão instaladas. Execute a instalação do Thunderbolt novamente.", {"status": "missing_dependencies", "error": str(exc)})
|
|
117
126
|
try:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
+
credentials = None
|
|
128
|
+
configured_port = loopback_port()
|
|
129
|
+
for attempt, port in enumerate((configured_port, 0)):
|
|
130
|
+
flow = InstalledAppFlow.from_client_config(_client_config(account), BATCH_SCOPES)
|
|
131
|
+
try:
|
|
132
|
+
credentials = flow.run_local_server(
|
|
133
|
+
host=loopback_host(),
|
|
134
|
+
port=port,
|
|
135
|
+
open_browser=open_browser,
|
|
136
|
+
access_type="offline",
|
|
137
|
+
prompt="consent",
|
|
138
|
+
include_granted_scopes="true",
|
|
139
|
+
)
|
|
140
|
+
break
|
|
141
|
+
except OSError as exc:
|
|
142
|
+
if attempt == 0 and _is_address_in_use_error(exc):
|
|
143
|
+
continue
|
|
144
|
+
raise
|
|
145
|
+
if credentials is None:
|
|
146
|
+
raise RuntimeError("Não foi possível iniciar o callback OAuth local.")
|
|
127
147
|
path = token_path(storage_root, account)
|
|
128
148
|
_save_credentials(path, credentials)
|
|
129
149
|
return IntegrationResult(True, f"Conta Google autorizada para listagem de canais: {email}.", {"status": "authorized", "email": email, "token_path": str(path)})
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ Este tutorial explica como criar um projecto no Google Cloud, activar a YouTube
|
|
|
4
4
|
|
|
5
5
|
## Pré-requisitos
|
|
6
6
|
|
|
7
|
-
Antes de começar, certifique-se de que tem uma conta Google, acesso ao [Google Cloud Console](https://console.cloud.google.com/) e o Thunderbolt instalado e em execução localmente. A aplicação em execução é necessária para
|
|
7
|
+
Antes de começar, certifique-se de que tem uma conta Google, acesso ao [Google Cloud Console](https://console.cloud.google.com/) e o Thunderbolt instalado e em execução localmente. A aplicação em execução é necessária para concluir o callback OAuth local.
|
|
8
8
|
|
|
9
9
|
## Passo 1 — Aceder ao Google Cloud Console
|
|
10
10
|
|
|
@@ -68,30 +68,11 @@ Na página da tela de consentimento OAuth, abra o separador **Público-alvo** e,
|
|
|
68
68
|
|
|
69
69
|
## Passo 6 — Criar as credenciais OAuth
|
|
70
70
|
|
|
71
|
-
No menu lateral, abra **APIs e Serviços → Credenciais** e clique em **+ Criar credenciais → ID do cliente OAuth**. Em **Tipo de aplicativo**, seleccione **Aplicativo
|
|
71
|
+
No menu lateral, abra **APIs e Serviços → Credenciais** e clique em **+ Criar credenciais → ID do cliente OAuth**. Em **Tipo de aplicativo**, seleccione **Aplicativo para computador** (também apresentado como **Desktop app**) e atribua um nome, por exemplo, `Thunderbolt Desktop Client`.
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
> **Importante:** o Thunderbolt usa `InstalledAppFlow` com um callback local loopback. Não seleccione **Aplicativo da Web**. Essa credencial exige URIs fixas e causa `Erro 400: redirect_uri_mismatch` neste fluxo.
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
```text
|
|
78
|
-
http://localhost:3000
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Se existir um ambiente de produção, adicione também a origem HTTPS correspondente, por exemplo `https://seudominio.com`.
|
|
82
|
-
|
|
83
|
-
### URIs de redireccionamento autorizadas
|
|
84
|
-
|
|
85
|
-
Esta é a parte mais crítica. Clique em **Adicionar URI** e introduza a URI exacta utilizada pelo Thunderbolt para o callback OAuth. Exemplos de desenvolvimento local:
|
|
86
|
-
|
|
87
|
-
```text
|
|
88
|
-
http://localhost:3000/api/auth/google/callback
|
|
89
|
-
http://localhost:5173/oauth2callback
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
> **A URI tem de ser exactamente igual à configurada no código do Thunderbolt.** Uma barra final diferente, o uso de `http` em vez de `https` ou uma porta diferente causa o erro `redirect_uri_mismatch`.
|
|
93
|
-
|
|
94
|
-
Se não souber qual é a URI utilizada, consulte a configuração ou o ficheiro de ambiente do Thunderbolt e confirme também os logs da aplicação.
|
|
75
|
+
Uma credencial **Desktop app** não precisa de **Origens JavaScript autorizadas** nem de adicionar manualmente uma URI de redireccionamento. O Thunderbolt inicia o callback local em `http://127.0.0.1:8765/`; se essa porta estiver ocupada, escolhe automaticamente outra porta loopback livre.
|
|
95
76
|
|
|
96
77
|
Clique em **Criar**. Na janela apresentada, copie o **ID do cliente (Client ID)** e a **Chave secreta do cliente (Client Secret)** e guarde-os num local seguro.
|
|
97
78
|
|
|
@@ -99,34 +80,26 @@ Clique em **Criar**. Na janela apresentada, copie o **ID do cliente (Client ID)*
|
|
|
99
80
|
|
|
100
81
|
## Passo 7 — Configurar o Thunderbolt
|
|
101
82
|
|
|
102
|
-
|
|
83
|
+
Na aba **Configurações → Configuração API → API Keys Upload → Contas Google**, crie ou edite a conta Google e cole o **Client ID** e o **Client Secret** da credencial **Desktop app**. Guarde a conta e clique em **Autorizar/Reautorizar**.
|
|
103
84
|
|
|
104
|
-
|
|
105
|
-
GOOGLE_CLIENT_ID=seu_client_id_aqui
|
|
106
|
-
GOOGLE_CLIENT_SECRET=sua_client_secret_aqui
|
|
107
|
-
GOOGLE_REDIRECT_URI=http://localhost:3000/api/auth/google/callback
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Substitua `seu_client_id_aqui` e `sua_client_secret_aqui` pelos valores copiados no passo anterior. Confirme que `GOOGLE_REDIRECT_URI` é exactamente igual à URI registada no Google Cloud Console.
|
|
85
|
+
Não é necessário configurar `GOOGLE_REDIRECT_URI` nem adicionar uma URI de callback de `localhost` no Google Cloud Console: o callback loopback é criado pelo `InstalledAppFlow` durante a autorização.
|
|
111
86
|
|
|
112
87
|
## Passo 8 — Testar a autenticação
|
|
113
88
|
|
|
114
|
-
|
|
89
|
+
Abra a interface do Thunderbolt e tente autorizar a conta Google.
|
|
115
90
|
|
|
116
91
|
O fluxo esperado é:
|
|
117
92
|
|
|
118
93
|
1. O Google apresenta a tela de consentimento com o nome do app e os escopos solicitados.
|
|
119
94
|
2. O utilizador autoriza o acesso.
|
|
120
|
-
3. O Google redirecciona para
|
|
121
|
-
4. A autenticação é concluída
|
|
95
|
+
3. O Google redirecciona para o callback local do Thunderbolt.
|
|
96
|
+
4. A autenticação é concluída e o token é guardado no storage local da conta.
|
|
122
97
|
|
|
123
98
|
## Solução de problemas
|
|
124
99
|
|
|
125
100
|
### Erro `redirect_uri_mismatch`
|
|
126
101
|
|
|
127
|
-
Este erro
|
|
128
|
-
|
|
129
|
-
Verifique a URI utilizada nos logs ou no código do Thunderbolt. Depois, abra **Credenciais**, seleccione o ID do cliente e adicione a URI exacta em **URIs de redireccionamento autorizadas**. Aguarde um a dois minutos para a configuração se propagar, limpe o cache do navegador e tente novamente.
|
|
102
|
+
Este erro ocorre normalmente quando foi criada uma credencial **Aplicativo da Web** para o fluxo local. Abra **APIs e Serviços → Credenciais**, crie uma nova credencial **ID do cliente OAuth → Aplicativo para computador (Desktop app)**, substitua o Client ID e o Client Secret na conta Google do Thunderbolt e tente novamente. Não tente corrigir este fluxo adicionando uma URI de `localhost` numa credencial Web.
|
|
130
103
|
|
|
131
104
|
### Erro `invalid_request` ou `access_denied`
|
|
132
105
|
|
|
@@ -134,7 +107,7 @@ Confirme se o seu e-mail foi adicionado como utilizador de teste no passo 5. Ver
|
|
|
134
107
|
|
|
135
108
|
### Mensagem “Acesso bloqueado: solicitação inválida”
|
|
136
109
|
|
|
137
|
-
|
|
110
|
+
Confirme primeiro que a credencial é **Aplicativo para computador (Desktop app)** e não **Aplicativo da Web**. Depois confirme que a conta Google foi adicionada como utilizador de teste e que a YouTube Data API v3 está activa.
|
|
138
111
|
|
|
139
112
|
## Escopos importantes para o YouTube
|
|
140
113
|
|