oauth for dummies

oauth for dummies

Postby dtussman » Thu Dec 12, 2024 4:46 pm

I have an application where I send multiple emails that are generated without user input and am horrified that gmail will no longer allow less secure apps to send using a gmail account. I am very illiterate in this area and I'm wondering if there is any really simple explanation of how one can implement oauth in a harbour application, or is that just not possible?
dtussman
 
Posts: 99
Joined: Sat Jun 06, 2015 6:57 pm

Re: oauth for dummies

Postby Antonio Linares » Thu Dec 12, 2024 6:05 pm

Dear David,

Understanding OAuth in a Nutshell

OAuth allows apps to access email services like Gmail securely by asking users for permission, instead of relying on username/password combinations. With Gmail:

1. You register your app with Google.
2. Google provides a client ID and secret for your app.
3. Your app uses these credentials to request an "access token" from Google.
4. The token is then used to send emails via Gmail.

Steps to Implement OAuth in a Harbour Application

1. Register Your App with Google
Go to the Google Cloud Console.
Create a new project or use an existing one.
Enable the Gmail API for your project.
Set up OAuth consent screen (fill in basic details about your app).
Create OAuth 2.0 client credentials (choose "Desktop app" or similar).

Once done, you'll get:

A Client ID
A Client Secret

Pseudo-code
Code: Select all  Expand view  RUN
PROCEDURE Main()
   LOCAL clientId := "YOUR_CLIENT_ID"
   LOCAL clientSecret := "YOUR_CLIENT_SECRET"
   LOCAL token := AuthorizeWithGoogle(clientId, clientSecret)
   IF !Empty(token)
      SendEmail(token)
   ELSE
      ? "Authorization failed."
   ENDIF
RETURN

FUNCTION AuthorizeWithGoogle(clientId, clientSecret)
   LOCAL authUrl := "https://accounts.google.com/o/oauth2/auth?...&client_id=" + clientId
   LOCAL tokenUrl := "https://oauth2.googleapis.com/token"
   LOCAL authorizationCode
   LOCAL accessToken

   // Open authUrl in browser and get authorizationCode
   RunBrowser(authUrl)
   authorizationCode := GetCodeFromUser()

   // Exchange authorizationCode for accessToken
   accessToken := RequestAccessToken(tokenUrl, clientId, clientSecret, authorizationCode)
RETURN accessToken

FUNCTION SendEmail(token)
   LOCAL smtpServer := "smtp.gmail.com"
   LOCAL smtpPort := 587
   LOCAL fromEmail := "youremail@gmail.com"
   LOCAL toEmail := "recipient@gmail.com"
   LOCAL subject := "Test Email"
   LOCAL body := "This is a test email sent via OAuth."

   hb_smtpConnect(smtpServer, smtpPort, fromEmail, token) // Authenticate with token
   hb_smtpSend(fromEmail, toEmail, subject, body)
RETURN
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: oauth for dummies

Postby dtussman » Fri Dec 13, 2024 2:11 am

Thank you so much Antonio! I think you just saved my life.
dtussman
 
Posts: 99
Joined: Sat Jun 06, 2015 6:57 pm


Re: oauth for dummies

Postby Antonio Linares » Sat Dec 14, 2024 5:11 am

Code: Select all  Expand view  RUN
FUNCTION RequestAccessToken(tokenUrl, clientId, clientSecret, authorizationCode)
   LOCAL postData, response, jsonResponse, accessToken := ""

   // Prepare the POST data as a plain string
   postData := "code=" + authorizationCode + "&" + ;
               "client_id=" + clientId + "&" + ;
               "client_secret=" + clientSecret + "&" + ;
               "redirect_uri=urn:ietf:wg:oauth:2.0:oob&" + ;
               "grant_type=authorization_code"

   // Make a POST request to the token URL
   response := hb_curlPost(tokenUrl, postData, { "Content-Type: application/x-www-form-urlencoded" })

   IF !Empty(response)
      // Parse the JSON response to extract the access token
      jsonResponse := hb_jsonDecode(response)
      IF hb_IsObject(jsonResponse)
         accessToken := hb_jsonGet(jsonResponse, "access_token")
      ELSE
         ? "Error parsing JSON response."
      ENDIF
   ELSE
      ? "Error: No response from the token endpoint."
   ENDIF

RETURN accessToken
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: Enrico Maria Giordano and 94 guests