forked from XiaoLFeng/XF_Index
126 lines
3.0 KiB
PHP
126 lines
3.0 KiB
PHP
|
<?php
|
||
|
/*
|
||
|
* Copyright © 2016 - 2023 筱锋xiao_lfeng. All Rights Reserved.
|
||
|
* 开发开源遵循 MIT 许可,若需商用请联系开发者
|
||
|
* https://www.x-lf.com/
|
||
|
*/
|
||
|
|
||
|
namespace Mailer\PHPMailer;
|
||
|
|
||
|
use League\OAuth2\Client\Grant\RefreshToken;
|
||
|
use League\OAuth2\Client\Provider\AbstractProvider;
|
||
|
use League\OAuth2\Client\Token\AccessToken;
|
||
|
|
||
|
/**
|
||
|
* OAuth - OAuth2 authentication wrapper class.
|
||
|
* Uses the oauth2-client package from the League of Extraordinary Packages.
|
||
|
*
|
||
|
* @see http://oauth2-client.thephpleague.com
|
||
|
*
|
||
|
* @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
|
||
|
*/
|
||
|
class OAuth implements OAuthTokenProvider
|
||
|
{
|
||
|
/**
|
||
|
* An instance of the League OAuth Client Provider.
|
||
|
*
|
||
|
* @var AbstractProvider
|
||
|
*/
|
||
|
protected $provider;
|
||
|
|
||
|
/**
|
||
|
* The current OAuth access token.
|
||
|
*
|
||
|
* @var AccessToken
|
||
|
*/
|
||
|
protected $oauthToken;
|
||
|
|
||
|
/**
|
||
|
* The user's email address, usually used as the login ID
|
||
|
* and also the from address when sending email.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $oauthUserEmail = '';
|
||
|
|
||
|
/**
|
||
|
* The client secret, generated in the app definition of the service you're connecting to.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $oauthClientSecret = '';
|
||
|
|
||
|
/**
|
||
|
* The client ID, generated in the app definition of the service you're connecting to.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $oauthClientId = '';
|
||
|
|
||
|
/**
|
||
|
* The refresh token, used to obtain new AccessTokens.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $oauthRefreshToken = '';
|
||
|
|
||
|
/**
|
||
|
* OAuth constructor.
|
||
|
*
|
||
|
* @param array $options Associative array containing
|
||
|
* `provider`, `userName`, `clientSecret`, `clientId` and `refreshToken` elements
|
||
|
*/
|
||
|
public function __construct($options)
|
||
|
{
|
||
|
$this->provider = $options['provider'];
|
||
|
$this->oauthUserEmail = $options['userName'];
|
||
|
$this->oauthClientSecret = $options['clientSecret'];
|
||
|
$this->oauthClientId = $options['clientId'];
|
||
|
$this->oauthRefreshToken = $options['refreshToken'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a new RefreshToken.
|
||
|
*
|
||
|
* @return RefreshToken
|
||
|
*/
|
||
|
protected function getGrant()
|
||
|
{
|
||
|
return new RefreshToken();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a new AccessToken.
|
||
|
*
|
||
|
* @return AccessToken
|
||
|
*/
|
||
|
protected function getToken()
|
||
|
{
|
||
|
return $this->provider->getAccessToken(
|
||
|
$this->getGrant(),
|
||
|
['refresh_token' => $this->oauthRefreshToken]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generate a base64-encoded OAuth token.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getOauth64()
|
||
|
{
|
||
|
//Get a new token if it's not available or has expired
|
||
|
if (null === $this->oauthToken || $this->oauthToken->hasExpired()) {
|
||
|
$this->oauthToken = $this->getToken();
|
||
|
}
|
||
|
|
||
|
return base64_encode(
|
||
|
'user=' .
|
||
|
$this->oauthUserEmail .
|
||
|
"\001auth=Bearer " .
|
||
|
$this->oauthToken .
|
||
|
"\001\001"
|
||
|
);
|
||
|
}
|
||
|
}
|