Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
supongo que si, yo no he hecho ninguna app con eso del correo con Tokens pero imagino que se obtiene en la propia cuenta de Google o quien sea el proveedor (en algun sitio debe estar)

y si, lo de la contraseña y eso debe pedirsela al usuario en algun panel de configuracion o algo y que la guarde en algun sitio para no estar pidiendosela siempre.

ChatGPT me informo de esto (sorry por poner codigo en C++):

Cita:
Para enviar correos usando OAuth con Google Mail (Gmail), el token de acceso se obtiene como parte del proceso de autenticación de OAuth. No se almacena directamente en un lugar fijo, sino que es generado dinámicamente durante el proceso de autenticación. A continuación te explico los pasos principales para obtener el token de acceso:

1. Crear el proyecto en Google Cloud:
Debes crear un proyecto en Google Cloud Console, y habilitar la API de Gmail para tu proyecto.
Luego, configura las credenciales OAuth 2.0. Para ello, crea un ID de cliente OAuth. Este ID estará asociado a tu aplicación, y será el punto inicial para obtener los tokens necesarios.

2. Proceso de OAuth 2.0:
Usa las credenciales que has configurado (client ID y client secret) para solicitar a los usuarios que autoricen tu aplicación a acceder a su cuenta de Gmail.
En este paso, el usuario interactúa con una página de autorización de Google. Si el usuario concede acceso, Google te devolverá un código de autorización.

3. Intercambiar el código de autorización por un token de acceso:
Usa el código de autorización que obtuviste para intercambiarlo por un token de acceso. Este token es el que permite a tu aplicación realizar solicitudes a la API de Gmail en nombre del usuario.
Este intercambio lo haces mediante una solicitud HTTP POST a los servidores de Google.

4. Refrescar el token de acceso:
El token de acceso tiene una vida útil limitada. Una vez que expire, deberás usar un token de actualización para solicitar un nuevo token de acceso sin necesidad de que el usuario vuelva a autorizar la aplicación.
Código ejemplo para obtener el token de acceso:

Código:
// Paso 1: Crear las credenciales en Google Cloud Console
// Paso 2: Obtener el código de autorización usando el endpoint de autorización de Google
// Paso 3: Intercambiar el código de autorización por un token de acceso

#include <curl/curl.h>
#include <json/json.h>

// Requiere libcurl y una biblioteca de JSON
void getAccessToken(std::string clientID, std::string clientSecret, std::string authCode) {
    CURL* curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");

        std::string postFields = "code=" + authCode +
                                 "&client_id=" + clientID +
                                 "&client_secret=" + clientSecret +
                                 "&redirect_uri=urn:ietf:wg:oauth:2.0:oob" +
                                 "&grant_type=authorization_code";

        curl_easy_setopt(curl, CURLOPT_URL, "https://oauth2.googleapis.com/token");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postFields.c_str());

        // Enviar la solicitud y obtener el token de acceso
        res = curl_easy_perform(curl);
        
        // Si el resultado es CURLE_OK, el token se habrá recibido
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

        curl_easy_cleanup(curl);
    }
}
Dónde se usa el token de acceso:
El token de acceso es utilizado para autenticar cualquier solicitud que haga tu aplicación a la API de Gmail. Debes incluirlo en el encabezado HTTP de la solicitud como un "Bearer token":

Código:
Authorization: Bearer YOUR_ACCESS_TOKEN
Si no tienes experiencia previa con OAuth y APIs, puede ser útil revisar la documentación oficial de OAuth 2.0 en Google y también consultar ejemplos en otros lenguajes para familiarizarte con el flujo completo.

CODIGO DELPHI:

Código:
uses
  IdHTTP, IdSSLOpenSSL, System.SysUtils, System.Classes;

procedure GetAccessToken(const ClientID, ClientSecret, AuthCode: string);
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Params: TStringList;
  Response: TStringStream;
begin
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  Params := TStringList.Create;
  Response := TStringStream.Create;
  
  try
    HTTP.IOHandler := SSLHandler;

    // Configurar los parámetros para la solicitud POST
    Params.Add('code=' + AuthCode);
    Params.Add('client_id=' + ClientID);
    Params.Add('client_secret=' + ClientSecret);
    Params.Add('redirect_uri=urn:ietf:wg:oauth:2.0:oob');
    Params.Add('grant_type=authorization_code');

    // Hacer la solicitud POST para obtener el token de acceso
    try
      HTTP.Post('https://oauth2.googleapis.com/token', Params, Response);
      ShowMessage('Response: ' + Response.DataString);  // Aquí obtienes el token de acceso en formato JSON
    except
      on E: Exception do
        ShowMessage('Error: ' + E.Message);
    end;

  finally
    HTTP.Free;
    SSLHandler.Free;
    Params.Free;
    Response.Free;
  end;
end;
Explicación del código:
TIdHTTP se utiliza para hacer la solicitud HTTP POST a la URL de Google (https://oauth2.googleapis.com/token).
Los parámetros necesarios para la solicitud POST se agregan al TStringList, como el código de autorización, el client ID y el client secret.
El SSLHandler (de Indy) se utiliza para manejar la conexión segura a los servidores de Google.
El resultado de la solicitud se guarda en un TStringStream (en formato JSON), que contiene el token de acceso.

Uso del token de acceso:
Una vez que obtengas el token de acceso (en formato JSON), podrás extraer el campo access_token y utilizarlo en futuras solicitudes HTTP a la API de Gmail, enviándolo en el encabezado de autenticación como un "Bearer token".


Ejemplo de uso del token de acceso en otra solicitud:

Código:
procedure SendAuthenticatedRequest(const AccessToken: string);
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Response: TStringStream;
begin
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  Response := TStringStream.Create;
  
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + AccessToken;

    try
      HTTP.Get('https://www.googleapis.com/gmail/v1/users/me/messages', Response);
      ShowMessage('Response: ' + Response.DataString);
    except
      on E: Exception do
        ShowMessage('Error: ' + E.Message);
    end;

  finally
    HTTP.Free;
    SSLHandler.Free;
    Response.Free;
  end;
end;
Este ejemplo hace una solicitud GET autenticada a la API de Gmail para obtener los mensajes de correo del usuario autenticado.

Consideraciones adicionales:
Recuerda que el token de acceso tiene un tiempo de vida limitado (normalmente 1 hora). Después, deberás usar un token de actualización para solicitar un nuevo token de acceso.
Necesitarás el paquete OpenSSL para Delphi si no lo tienes instalado.

Última edición por navbuoy fecha: 14-10-2024 a las 11:53:35.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con SMTP en smtp.office365.com gguerrini Internet 5 14-10-2021 16:28:26
Envio de correos SIN SSL Rc96 Internet 4 15-09-2017 19:42:58
?Envio de correos ? jasmad Lazarus, FreePascal, Kylix, etc. 16 02-10-2012 15:45:02
servidor de correos SMTP metroyd Varios 0 21-10-2007 23:57:36
Envio de Correos Masivo Esau Internet 2 10-04-2007 01:46:11


La franja horaria es GMT +2. Ahora son las 23:57:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi