2017-04-04 172 views
2

我安裝league/oauth2-client與作曲家和它composer.json致命錯誤 -

"league/oauth2-client": "2.2.0" enter image description here

創造了這個線的時候我刷新get_oauth_token.php頁面級聯賽\ OAuth2用戶\客戶端\供應商\ AbstractProvider'未找到(PHPMailer的),這個錯誤還是出來了:

Fatal error: Class 'League\OAuth2\Client\Provider\AbstractProvider' not found in C:\xampp\htdocs...\PHPMailer\get_oauth_token.php on line 35

這裏的get_oauth_token.php

<?php 
/** 
* 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; 

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 = isset($_SERVER['HTTPS']) ? 'https://' : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
//$redirectUri = 'http://localhost/phpmailer/get_oauth_token.php'; 

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

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(
     'myClientId' => $clientId, //already inserted 
     'myClientSecret' => $clientSecret, //already inserted 
     'myRedirectUri' => $redirectUri, //already inserted 
     '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(); 
} 

你能否詳細解釋一下在通過composer require league/oauth2-client安裝league/oauth2-client後應該怎麼做? 謝謝。

+0

你嘗試'作曲家dumpautoload'? – aynber

+0

@aynber那是什麼? –

+0

這是您在命令行上運行的命令。它可以幫助您的程序找到任何新的類和包,並且應該在您安裝新包時隨時運行。 – aynber

回答

0

有一個類似的問題,並發現它沒有在官方教程here明確說明。 圖書館聯盟/ oauth2-client需要您安裝您需要單獨提供的提供商,因爲有多個提供商都是官方和第三方here

對於谷歌提供你需要

composer require league/oauth2-google 

,並參考它像這樣

use League\OAuth2\Client\Provider\Google;