OAuth2 (XOAUTH2) beállítása Gmail-fiókkal történő levélküldéshez OJS 3 rendszerben

  • Linux
  • 2026. március 16.

A Gmail hagyományosan az egyik legnépszerűbb és legegyszerűbb megoldás volt a rendszerekből történő automatikus e-mail küldésre. A fejlesztők korábban egyszerűen csak megadták a fiókhoz tartozó e-mail címet és jelszót a levelezési beállításokban. Ez a módszer azonban komoly biztonsági kockázatokat rejtett magában, hiszen a jelszavakat gyakran egyszerű szöveges formátumban vagy környezeti változókban kellett tárolni.

2024-ben a Google fokozatosan átállt a hagyományos jelszavas hitelesítésről az OAuth2 protokollra. Emiatt a fejlesztőknek is frissíteniük kell a rendszereiket, a korábban használt „Kevésbé biztonságos alkalmazások” (Less secure apps) funkció ugyanis már nem elérhető.

Mivel az Open Journal Systems (OJS) eredetileg a hagyományos levélküldési módszert használta, sok felhasználó tapasztalhatta, hogy a rendszerük hirtelen nem tudott automatikus értesítő e-maileket küldeni. Ebben az útmutatóban bemutatom, hogyan módosíthatod az OJS beállításait úgy, hogy az OAuth2 segítségével ismét zökkenőmentesen működjön a Gmailen keresztüli levélküldés.

Előfeltételek

Ez a megoldás akkor működik számodra, ha:

  • A szervezeted Google Workspace-t használ, így a küldésre szánt Gmail-fiók is ezen keresztül jött létre.
  • Rendelkezel adminisztrátori hozzáféréssel a szervezeted Google Cloud erőforrásaihoz, valamint a használni kívánt Gmail-fiókhoz.
  • Az OJS rendszered valamilyen szerveren fut (akár a Google Cloudban, akár egy másik szolgáltatónál).
  • OJS 3-as verziót használsz.
  • Rendelkezel alapvető PHP ismeretekkel és szerverhozzáféréssel.

1. lépés: A Google Cloud Console megnyitása

Látogass el a szervezeted Google Cloud Console felületére. Győződj meg róla, hogy a megfelelő projektben vagy. Ha az OJS nem a Google Cloudban fut, akkor is létre kell itt hoznod egy projektet (bár virtuális gépet nem kell indítanod hozzá).

2. lépés: OAuth kliens azonosító (Client ID) létrehozása

Feltételezzük, hogy már konfiguráltad az OAuth hozzájárulási képernyőt (OAuth consent screen). Ha nem, ezt meg kell tenned az alapvető adatok kitöltésével.

  1. Navigálj az APIs & Services > Credentials (API-k és szolgáltatások > Hitelesítési adatok) menüpontba.

  2. Kattints a + Create credentials gombra, majd válaszd az OAuth client ID opciót.

  3. Az alkalmazás típusánál (Application type) válaszd a Web application lehetőséget.

  4. Adj neki egy azonosító nevet, például „OJS”.

  5. Az Authorized redirect URIs résznél kattints a + Add URI gombra, és add meg az OJS PHPMailer OAuth kezelő szkriptjének pontos elérhetőségét. Ennek valahogy így kell kinéznie:

    https://[YOUR OJS DOMAIN]/lib/pkp/lib/vendor/phpmailer/phpmailer/get_oauth_token.php

  6. Kattints a Create (Létrehozás) gombra.

Ezután a rendszer generál számodra egy Client ID-t és egy Client secret-et. Ezeket másold ki magadnak, mert később szükséged lesz rájuk.

3. lépés: A get_oauth_token.php fájl módosítása

Keresd meg az előző pontban említett útvonalon található get_oauth_token.php fájlt a szervereden. Mielőtt bármit módosítanál, feltétlenül készíts róla biztonsági másolatot! Ezt követően frissítsd a tartalmát az alábbi kód alapján, de ne felejtsd el behelyettesíteni a saját adataidat (Client ID, Client Secret, Domain):

PHP

<?php
/**
 * PHPMailer - PHP email creation and transport class.
 * PHP Version 5.5
 * @package PHPMailer
 * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
 * @author Marcus Bointon (Synchro/coolbru) <[email protected]>
 * @author Jim Jagielski (jimjag) <[email protected]>
 * @author Andy Prevost (codeworxtech) <[email protected]>
 * @author Brent R. Matzelle (original founder)
 * @copyright 2012 - 2020 Marcus Bointon
 * @copyright 2010 - 2012 Jim Jagielski
 * @copyright 2004 - 2009 Andy Prevost
 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 * @note This program is distributed in the hope that it will be useful - WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 */

/**
 * Get an OAuth2 token from an OAuth2 provider.
 *
 * Install this script on your server so that it's accessible
 * as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
 * e.g.: http://localhost/phpmailer/get_oauth_token.php
 *
 * Ensure dependencies are installed with 'composer install'
 *
 * Set up an app in your Google/Yahoo/Microsoft account
 *
 * Set the script address as the app's redirect URL
 * If no refresh token is obtained when running this file,
 * revoke access to your app and run the script again.
 */

namespace PHPMailer\PHPMailer;

/**
 * Aliases for League Provider Classes
 * Make sure you have added these to your composer.json and run `composer install`
 * Plenty to choose from here:
 * @see http://oauth2-client.thephpleague.com/providers/thirdparty/
 */

// @see https://github.com/thephpleague/oauth2-google
use League\OAuth2\Client\Provider\Google;
// @see https://packagist.org/packages/hayageek/oauth2-yahoo
use Hayageek\OAuth2\Client\Provider\Yahoo;
// @see https://github.com/stevenmaguire/oauth2-microsoft
use Stevenmaguire\OAuth2\Client\Provider\Microsoft;

if (!isset($_GET['code']) && !isset($_GET['provider'])) {
    ?>
<html>
<body>Select Provider:<br/>
<a href='?provider=Google'>Google</a><br/>
<a href='?provider=Yahoo'>Yahoo</a><br/>
<a href='?provider=Microsoft'>Microsoft/Outlook/Hotmail/Live/Office365</a><br/>
</body>
</html>
    <?php
    exit;
}

// require 'vendor/autoload.php';
// require($_SERVER['DOCUMENT_ROOT'] . '/lib/pkp/lib/vendor/autoload.php');

// Below is the new location of autoload
require('/var/www/lib/vendor/autoload.php');

session_start();

$providerName = '';

if (array_key_exists('provider', $_GET)) {
    $providerName = $_GET['provider'];
    $_SESSION['provider'] = $providerName;
} elseif (array_key_exists('provider', $_SESSION)) {
    $providerName = $_SESSION['provider'];
}

if (!in_array($providerName, ['Google', 'Microsoft', 'Yahoo'])) {
    exit('Only Google, Microsoft and Yahoo OAuth2 providers are currently supported in this script.');
}

//These details are obtained by setting up an app in the Google developer console,
//or whichever provider you're using.
$clientId = '[YOUR CLIENT ID HERE]';
$clientSecret = '[YOUR CLIENT SECRET HERE]';

//If this automatic URL doesn't work, set it yourself manually to the URL of this script
//$redirectUri = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$redirectUri = 'https://[YOUR OJS DOMAIN]/lib/pkp/lib/vendor/phpmailer/phpmailer/get_oauth_token.php';

$params = [
    'clientId' => $clientId,
    'clientSecret' => $clientSecret,
    'redirectUri' => $redirectUri,
    'accessType' => 'offline'
];

$options = [];
$provider = null;

switch ($providerName) {
    case 'Google':
        $provider = new Google($params);
        $options = [
            'scope' => [
                'https://mail.google.com/'
            ]
        ];
        break;
    case 'Yahoo':
        $provider = new Yahoo($params);
        break;
    case 'Microsoft':
        $provider = new Microsoft($params);
        $options = [
            'scope' => [
                'wl.imap',
                'wl.offline_access'
            ]
        ];
        break;
}

if (null === $provider) {
    exit('Provider missing');
}

if (!isset($_GET['code'])) {
    // If we don't have an authorization code then get one
    $authUrl = $provider->getAuthorizationUrl($options);
    $_SESSION['oauth2state'] = $provider->getState();
    header('Location: ' . $authUrl);
    exit;
// Check given state against previously stored one to mitigate CSRF attack
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
    unset($_SESSION['oauth2state']);
    unset($_SESSION['provider']);
    exit('Invalid state');
} else {
    unset($_SESSION['provider']);
    // Try to get an access token (using the authorization code grant)
    $token = $provider->getAccessToken(
        'authorization_code',
        [
            'code' => $_GET['code']
        ]
    );
    // Use this to interact with an API on the users behalf
    // Use this to get a new access token if the old one expires
    echo 'Refresh Token: ', $token->getRefreshToken();
}

4. lépés: A külső (vendor) csomagok manuális frissítése

Mivel a fenti szkript elavult csomagokat használ, frissíteni kell a PHPMailer függőségeit. Hozz létre egy üres könyvtárat a saját gépeden, és futtasd le benne a következő Composer parancsot:

Bash

composer require league/oauth2-google

Ezután tömörítsd be a létrejött vendor mappát, töltsd fel az OJS szerveredre, és csomagold ki egy olyan könyvtárba, ami független az OJS alap kódjától (pl. a fenti kódban is szereplő /var/www/lib mappába).

5. lépés: A Mail.inc.php frissítése

Szúrd be az alábbi kódsort a lib/pkp/classes/mail/Mail.inc.php fájl legelejére (közvetlenül a PHP nyitótag után), hogy a levelező osztály be tudja tölteni az újonnan létrehozott függőségeket:

PHP

require('/var/www/lib/vendor/autoload.php');

6. lépés: A Refresh Token (frissítési token) lekérése

Ha mindennel megvagy, nyisd meg a böngészőben a módosított fájl URL-jét:

https://[YOUR OJS DOMAIN]/lib/pkp/lib/vendor/phpmailer/phpmailer/get_oauth_token.php

Az oldalon kattints a Google linkre. A rendszer átirányít a Google bejelentkezési oldalára, ahol be kell lépned azzal a Gmail-fiókkal, amit a levélküldésre szeretnél használni. Sikeres bejelentkezés és engedélyezés után a képernyőn megjelenik egy hosszú szöveg: a Refresh Token. Ezt másold ki és mentsd el!

7. lépés: Az XOAUTH2 beállítása a config.inc.php fájlban

Nyisd meg az OJS gyökérkönyvtárában található config.inc.php fájlt, és keresd meg az [email] szekciót. Módosítsd a konfigurációt az alábbi minta alapján, behelyettesítve a saját értékeidet:

Ini, TOML

[email]

; Use SMTP for sending mail instead of mail()
smtp = On

; SMTP server settings
smtp_server = smtp.gmail.com
smtp_port = 587

; Enable SMTP authentication
; Supported mechanisms: ssl, tls
smtp_auth = tls
smtp_username = [YOUR GMAIL ADDRESS HERE]
smtp_password = [YOUR GMAIL PASSWORD HERE]

smtp_authtype = XOAUTH2
smtp_oauth_provider = Google
smtp_oauth_email = [YOUR GMAIL ADDRESS HERE]
smtp_oauth_clientid = [YOUR OAUTH2 CLIENT ID HERE]
smtp_oauth_clientsecret = [YOUR OAUTH2 CLIENT SECRET HERE]
smtp_oauth_refreshtoken = '[YOUR OAUTH2 REFRESH TOKEN HERE]'

; Allow envelope sender to be specified
; (may not be possible with some server configurations)
allow_envelope_sender = On

; Default envelope sender to use if none is specified elsewhere
default_envelope_sender = [YOUR GMAIL ADDRESS HERE]

; Force the default envelope sender (if present)
; This is useful if setting up a site-wide no-reply address
; The reply-to field will be set with the reply-to or from address.
force_default_envelope_sender = On

8. lépés: A levélküldés tesztelése

Végül érdemes letesztelni a módosításokat. Készíts egy teszt beküldést az OJS weboldalán, adj hozzá egy új felhasználót, vagy indíts el bármilyen más folyamatot, aminek automatikus e-mail értesítést kellene generálnia. Ha mindent jól állítottál be, az üzenet rendben meg fog érkezni a megadott e-mail címekre.

Összegzés

A Google egyre szigorodó biztonsági követelményei és az OAuth2-re való átállás miatt a régebbi rendszerek – mint amilyen az OJS is – módosításra szorulnak, ha továbbra is Gmailen keresztül szeretnének leveleket küldeni. Bár a hivatalos frissítési folyamat elsőre bonyolultnak tűnhet, a fenti lépések követésével áthidalható a probléma, és biztosítható a rendszer zavartalan működése.