2017-01-07 18 views
1

當我嘗試訪問phpmailer/get_outh_token.php得到refresh token服務器返回:服務器返回的PHPMailer的500錯誤得到OUTH令牌文件

HTTP ERROR 500

Client IDSecret keyredirect 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'行。 theres不需要它。你的有狀態變量也有不正確的值。它看起來像你複製並粘貼這段代碼,並沒有讀取它。另外你爲什麼要在文件頂部開始一個會話?只有在發生某種情況後才能開始會話,即在一個函數中。評論也沒有幫助,他們基本上說代碼是一樣的東西...除了代碼更容易閱讀。 – Rafael

+0

@Rafael這是來自上一個phpmailer的原始phpmailer get_oauth_token.php文件,我只是將我的憑據粘貼在那裏。 – DocNet

+0

@Rafael當我刪除它時,我得到: 致命錯誤:require():無法打開所需的'vendor/autoload.php'(include_path ='。:/ usr/share/php:/ usr/share /梨')在/home/xx/zzazfhvsnt/public_html/phpmailer/get_oauth_token.php在線20 – DocNet

回答

1

我知道這個問題是舊的,但我有同樣的問題。 我所做的只是通過作曲家

composer require league/oauth2-google 

This helped me figure it out

希望它可以幫助一些其他安裝聯賽/的oauth2 - 谷歌。

相關問題