EvaOAuth - 可能是目前最好的PHP OAuth庫
來社群推薦一下自己的新作品。
EvaOAuth 是一個統一介面設計的PHP OAuth Client庫,相容OAuth1.0與OAuth2.0規範,可以通過10多行程式碼整合到任意專案中。
專案程式碼託管在 https://github.com/AlloVince/EvaOAuth ,歡迎Star及Fork貢獻程式碼。
為什麼選擇EvaOAuth
經過若干專案考驗, EvaOAuth1.0 根據實際需求進行了一次完全重構,主要的一些特性如下:
- 標準介面,無論OAuth1.0或OAuth2.0,同一套程式碼實現不同工作流,並且獲取一致的資料格式,包括使用者資訊和Token。
- 充分測試,所有關鍵程式碼進行單元測試,同時通過CI保證多版本PHP下的可用性。
- 容易除錯,開啟Debug模式後,Log中會記錄OAuth流程中所有的URL、Request、Response,幫助定位問題。
- 開箱即用,專案已經內建了主流的OAuth網址支援,如微博、QQ、Twitter、Facebook等。
- 方便擴充套件,可以通過最少3行程式碼整合新的OAuth服務,工作流程提供事件機制。
快速開始
EvaOAuth可以通過Packagist下載,推薦通過Composer安裝。
編輯composer.json檔案為:
{
"require": {
"evaengine/eva-oauth": "~1.0"
}
}
然後通過Composer進行安裝。
curl -sS https://getcomposer.org/installer | php
php composer.phar install
下面通過一個例項演示如何整合豆瓣登入功能。假設已經在豆瓣開發者建立好一個應用。準備一個request.php如下:
require_once './vendor/autoload.php'; //載入Composer自動生成的autoload
$service = new Eva\EvaOAuth\Service('Douban', [
'key' => 'You Douban App ID', //對應豆瓣應用的API Key
'secret' => 'You Douban App Secret', //對應豆瓣應用的Secret
'callback' => 'http://localhost/EvaOAuth/example/access.php' //回撥地址
]);
$service->requestAuthorize();
在瀏覽器中執行request.php,如果引數正確則會被重定向到豆瓣授權頁面,登入授權後會再次重定向回我們設定的callback
。因此再準備好access.php檔案:
$token = $service->getAccessToken();
這樣就拿到了豆瓣的Access Token,接下來可以使用Token去訪問受保護的資源:
$httpClient = new Eva\EvaOAuth\AuthorizedHttpClient($token);
$response = $httpClient->get('https://api.douban.com/v2/user/~me');
這樣就完成了OAuth的登入功能。更多細節可以參考程式碼的示例以及Wiki頁面。
OAuth網站支援
EvaOAuth將一個OAuth網站稱為一個Provider。目前支援的Provider有:
- OAuth2.0
- 豆瓣(Douban)
- QQ (Tencent)
- 微博 (Weibo)
- OAuth1.0
新增一個Provider僅需數行程式碼,下面演示如何整合Foursquare網站:
namespace YourNamespace;
class Foursquare extends \Eva\EvaOAuth\OAuth2\Providers\AbstractProvider
{
protected $authorizeUrl = 'https://foursquare.com/oauth2/authorize';
protected $accessTokenUrl = 'https://foursquare.com/oauth2/access_token';
}
然後將Provider註冊到EvaOAuth就可以使用了。
use Eva\EvaOAuth\Service;
Service::registerProvider('foursquare', 'YourNamespace\Foursquare');
$service = new Service('foursquare', [
'key' => 'Foursquare App ID',
'secret' => 'Foursquare App Secret',
'callback' => 'http://somecallback/'
]);
資料儲存
在OAuth1.0的流程中,需要將Request Token儲存起來,然後在授權成功後使用Request Token換取Access Token。因此需要資料儲存功能。
EvaOAuth的資料儲存通過Doctrine\Cache實現。預設情況下EvaOAuth會將資料儲存為本地檔案,儲存路徑為EvaOAuth/tmp
。
可以在EvaOAuth初始化前任意更改儲存方式及儲存位置,例如將檔案儲存位置更改為/tmp
:
Service::setStorage(new Doctrine\Common\Cache\FilesystemCache('/tmp'));
或者使用Memcache儲存:
$storage = new \Doctrine\Common\Cache\MemcacheCache();
$storage->setMemcache(new \Memcache());
Service::setStorage($storage);
事件支援
EvaOAuth 定義了若干事件方面更容易的注入邏輯
BeforeGetRequestToken
: 獲取Request Token前觸發。BeforeAuthorize
: 重定向到授權頁面前觸發。BeforeGetAccessToken
: 獲取Access Token前觸發。
比如我們希望在獲取Access Token前向HTTP請求中加一個自定義Header,可以通過以下方式實現:
$service->getEmitter()->on('beforeGetAccessToken', function(\Eva\EvaOAuth\Events\BeforeGetAccessToken $event) {
$event->getRequest()->addHeader('foo', 'bar');
});
技術實現
EvaOAuth 基於強大的HTTP客戶端庫Guzzle,並通過OOP方式對OAuth規範進行了完整的描述。
為了避免對規範的詮釋上出現誤差,底層程式碼優先選擇規範描述中的角色與名詞,規範間差異則在上層程式碼中統一。
因此如果沒有同時支援兩套規範的需求,可以直接使用OAuth1.0、OAuth2.0分別對應的工作流。
詳細用例可以參考Wiki:
Debug與Log
開啟Debug模式將在Log中記錄所有的請求與響應。
$service->debug('/tmp/access.log');
請確保PHP對log檔案有寫入許可權。
API文件
首先通過pear install phpdoc/phpDocumentor
安裝phpDocumentor,然後在專案根目錄下執行phpdoc
,會在docs/
下生成API文件。
問題反饋及貢獻程式碼
專案程式碼託管在 https://github.com/AlloVince/EvaOAuth ,歡迎Star及Fork貢獻程式碼。
有問題歡迎在EvaOAuth Issue提出。
相關文章
- DOClever:可能是目前最好用的介面管理平臺
- 這可能是目前最好的vue程式碼生成工具Vue
- 可能是目前最快的struct複製庫Struct
- BetterScroll:可能是目前最好用的移動端滾動外掛
- Flutter | 可能是目前最好用的仿微信聊天長按彈出框 WPopupMenuFlutter
- BetterScroll:可能是目前最好用的移動端滾動外掛(原始碼分析)原始碼
- 可能是最好用的Android引導層庫Android
- 這可能是全網最好用的Banner輪播庫
- 可能是最好的單例模式單例模式
- Python日誌庫logging總結-可能是目前為止將logging庫總結的最好的一篇文章Python
- Druid-目前最好的連線池UI
- 這可能是目前最輕量級、最支援MVVM、可定製性最好的開源WPF Chart控制元件!MVVM控制元件
- 這可能是最好的效能優化教程(三)優化
- 這可能是最好的效能優化教程(一)優化
- 這可能是最好的效能優化教程(二)優化
- 目前get到最好用的內網穿透軟體內網穿透
- [這可能是最好的Spring教程!]JDBC中資料庫的連線與查詢SpringJDBC資料庫
- 可能是全網最好的MySQL重要知識點MySql
- Halo-可能是最好的Java部落格系統Java
- 目前最好用的雲端儲存?三大品牌推薦!
- 目前最好的雲遊戲,我玩了幾天《雲·原神》,真香!遊戲
- PHP是最好的語言!PHP
- 可能是講解 Android 事件分發最好的文章Android事件
- Amaze UI——可能是最好用的 HTML5 前端框架UIHTML前端框架
- 可能是最好的正規表示式的教程筆記了吧...筆記
- 這可能是目前最透徹的Netty原理架構解析Netty架構
- 可能是目前最完整的前端框架 Vue.js 全面介紹前端框架Vue.js
- 扭曲變換加密 【目前防止軟體被破解最好的方法】加密
- 這可能是最好的RxJava 2.x 教程(完結版)RxJava
- 目前解決移動端1px邊框最好的方法
- 整理目前可用的Maven倉庫Maven
- 可能是東半球最好的多執行緒講義!執行緒
- 這可能是你見過最好的工程師繪圖指北工程師繪圖
- 可能是迄今為止最好的 GitHub 程式碼瀏覽外掛Github
- [譯] 這可能是 2018 年最好的一篇 PHP 效能測評(包含 5.6 到 7.2,以及 HHVM)PHP
- “最好的語言” PHP 如何造就 Facebook?PHP
- PHP實現Google Oauth的登入系統PHPGoOAuth
- Stadia:目前最好的雲遊戲服務釋出了,但還能更好遊戲