2017-01-07 3 views
1

При попытке получить доступ к phpmailer/get_outh_token.php, чтобы получить отдачу refresh token сервера:сервер возвращает 500 ошибку на PHPMailer получить outh маркер файла

HTTP ERROR 500

Client ID, Secret key и redirect Uri являются правильными, и я использую его уже в Wordpress.

Я загрузил последнюю версию phpmailer, также проверен на старую версию с таким же результатом.

Я нашел то, что причиной этого, именно эта часть:

namespace League\OAuth2\Client\Provider; 

Когда я удалить его, то скрипт загружает с ошибками, конечно, потому что

Provider namespace is not loaded.

Сайт работает на PHP 7.

Это полный код get_outh_token.php, и он является оригинальным (только учетные данные разные, конечно):

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 'On'); 
/** 
* Get an OAuth2 token from Google. 
* * Install this script on your server so that it's accessible 
* as [https/http]://<yourdomain>/<folder>/get_oauth_token.php 
* e.g.: http://localhost/phpmail/get_oauth_token.php 
* * Ensure dependencies are installed with 'composer install' 
* * Set up an app in your Google developer console 
* * 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 
* using link: https://accounts.google.com/b/0/IssuedAuthSubTokens and run the script again. 
* This script requires PHP 5.4 or later 
* PHP Version 5.4 
*/ 

namespace League\OAuth2\Client\Provider; //when i remove this line, than page load without 500, but with errors. 

require 'vendor/autoload.php'; 

use League\OAuth2\Client\Provider\Exception\IdentityProviderException; 
use League\OAuth2\Client\Token\AccessToken; 
use League\OAuth2\Client\Tool\BearerAuthorizationTrait; 
use Psr\Http\Message\ResponseInterface; 

session_start(); 

//If this automatic URL doesn't work, set it yourself manually 
$redirectUri = 'https://www.secret.co/phpmailer/get_oauth_token.php'; 

//These details obtained are by setting up app in Google developer console. 
$clientId = 'secret.apps.googleusercontent.com'; 
$clientSecret = 'secret'; 

class Google extends AbstractProvider 
{ 
    use BearerAuthorizationTrait; 

    const ACCESS_TOKEN_RESOURCE_OWNER_ID = 'id'; 

    /** 
    * @var string If set, this will be sent to google as the "access_type" parameter. 
    * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline 
    */ 
    protected $accessType; 

    /** 
    * @var string If set, this will be sent to google as the "hd" parameter. 
    * @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param 
    */ 
    protected $hostedDomain; 

    /** 
    * @var string If set, this will be sent to google as the "scope" parameter. 
    * @link https://developers.google.com/gmail/api/auth/scopes 
    */ 
    protected $scope; 

    public function getBaseAuthorizationUrl() 
    { 
     return 'https://accounts.google.com/o/oauth2/auth'; 
    } 

    public function getBaseAccessTokenUrl(array $params) 
    { 
     return 'https://accounts.google.com/o/oauth2/token'; 
    } 

    public function getResourceOwnerDetailsUrl(AccessToken $token) 
    { 
    return ' '; 
    } 

    protected function getAuthorizationParameters(array $options) 
    { 
    if (is_array($this->scope)) { 
      $separator = $this->getScopeSeparator(); 
      $this->scope = implode($separator, $this->scope); 
     } 

     $params = array_merge(
      parent::getAuthorizationParameters($options), 
      array_filter([ 
       'hd'   => $this->hostedDomain, 
       'access_type' => $this->accessType, 
     'scope'  => $this->scope, 
       // if the user is logged in with more than one account ask which one to use for the login! 
       'authuser' => '-1' 
      ]) 
     ); 
     return $params; 
    } 

    protected function getDefaultScopes() 
    { 
     return [ 
      'email', 
      'openid', 
      'profile', 
     ]; 
    } 

    protected function getScopeSeparator() 
    { 
     return ' '; 
    } 

    protected function checkResponse(ResponseInterface $response, $data) 
    { 
     if (!empty($data['error'])) { 
      $code = 0; 
      $error = $data['error']; 

      if (is_array($error)) { 
       $code = $error['code']; 
       $error = $error['message']; 
      } 

      throw new IdentityProviderException($error, $code, $data); 
     } 
    } 

    protected function createResourceOwner(array $response, AccessToken $token) 
    { 
     return new GoogleUser($response); 
    } 
} 


//Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php 

$provider = new Google(
    array(
     'clientId' => $clientId, 
     'clientSecret' => $clientSecret, 
     'redirectUri' => $redirectUri, 
     'scope' => array('https://mail.google.com/'), 
    'accessType' => 'offline' 
    ) 
); 

if (!isset($_GET['code'])) { 
    // If we don't have an authorization code then get one 
    $authUrl = $provider->getAuthorizationUrl(); 
    $_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']); 
    exit('Invalid state'); 
} else { 
    // Try to get an access token (using the authorization code grant) 
    $token = $provider->getAccessToken(
     'authorization_code', 
     array(
      'code' => $_GET['code'] 
     ) 
    ); 

    // Use this to get a new access token if the old one expires 
    echo 'Refresh Token: ' . $token->getRefreshToken(); 
} 
+0

вы должны удалить строку 'namespace'. они не нуждаются в этом. также ваши переменные состояния имеют неправильные значения. похоже, что вы копируете и вставляете этот код и не читаете его. Также почему вы начинаете сеанс в верхней части файла? Вы должны начать сеанс только после того, как что-то произойдет, то есть в функции. Комментарии тоже не помогают, они в основном говорят то же самое, что и код, за исключением того, что код гораздо проще читать. – Rafael

+0

@Rafael Это оригинальный файл phpmailer get_oauth_token.php из последнего phpmailer, я просто вставляю свои учетные данные. – DocNet

+0

@Rafael Когда я его удаляю, я получаю: Неустранимая ошибка: require() pear ') в /home/xx/zzazfhvsnt/public_html/phpmailer/get_oauth_token.php в строке 20 – DocNet

ответ

1

Я знаю, что этот вопрос старый, но у меня была такая же проблема. Все, что я сделал, чтобы установить лиги/oauth2-Google с помощью композитора

composer require league/oauth2-google 

This helped me figure it out

Надеется, что это поможет некоторым еще.

Смежные вопросы