使用OAuth Server PHP實現OAuth2服務
在現在的網路服務中,OAuth2.0服務已經很普遍了,無論是facebook或者微博的第三方登入,還是手機APP登入,都有很廣泛的應用。
它主要的目的如下:
如果使用者的照片在A網站,他想要在B網站使用A網站的頭像,並不需要向B網站提供自己在A網站的使用者名稱和密碼,而直接給B一個Access Token來獲取A站的照片
具體流程如下:
1)使用者訪問網站B
2)B需要驗證使用者的身份
3)B將使用者定向到A網站,使用者輸入帳號密碼登入A網站
4)A網站詢問是否要將Authentication的權利給B網站
5)使用者告訴A站可以將認證權給B站
6)A網站把Authorization Code發給B站
7)B站用Autorization Code向A站換取Access Token
8)當B站擁有Access Token時,就擁有了使用者在A站的一些訪問許可權
這是典型的Authorization Code Grant,常常運用於網路應用之中
還有Implicit Grant認證方式,這個則省去了Auth Code,開放平臺直接返回access_token和有效期,使用者ID等資料
這種經常運用於手機客戶端或者瀏覽器外掛等沒有線上伺服器的應用
最後一種是Resource Owner Password Credentials Grant
這種是直接在應用中輸入帳號密碼,然後由應用XAuth技術將其提交給開放平臺並得到Access Token
它經常用於PC可執行程式和手機應用,但由於存在一些爭議,開發難度也較大,這裡我就先不討論他
安裝
你可以在github上下載OAuth Server PHP,也可以用下列命令下載,不過內容都是一樣的
1 2 3 |
mkdir my-oauth2-walkthrough
cd
my-oauth2-walkthrough
git clone https: //github.com/bshaffer/oauth2-server-php.git
-b master
|
在這之後配置資料庫
?1 2 3 4 5 6 7 |
CREATE
TABLE oauth_clients (client_id VARCHAR( 80 )
NOT NULL, client_secret VARCHAR( 80 )
NOT NULL, redirect_uri VARCHAR( 2000 )
NOT NULL, grant_types VARCHAR( 80 ),
scope VARCHAR( 100 ),
user_id VARCHAR( 80 ),
CONSTRAINT clients_client_id_pk PRIMARY KEY (client_id));
CREATE
TABLE oauth_access_tokens (access_token VARCHAR( 40 )
NOT NULL, client_id VARCHAR( 80 )
NOT NULL, user_id VARCHAR( 255 ),
expires TIMESTAMP NOT NULL, scope VARCHAR( 2000 ),
CONSTRAINT access_token_pk PRIMARY KEY (access_token));
CREATE
TABLE oauth_authorization_codes (authorization_code VARCHAR( 40 )
NOT NULL, client_id VARCHAR( 80 )
NOT NULL, user_id VARCHAR( 255 ),
redirect_uri VARCHAR( 2000 ),
expires TIMESTAMP NOT NULL, scope VARCHAR( 2000 ),
CONSTRAINT auth_code_pk PRIMARY KEY (authorization_code));
CREATE
TABLE oauth_refresh_tokens (refresh_token VARCHAR( 40 )
NOT NULL, client_id VARCHAR( 80 )
NOT NULL, user_id VARCHAR( 255 ),
expires TIMESTAMP NOT NULL, scope VARCHAR( 2000 ),
CONSTRAINT refresh_token_pk PRIMARY KEY (refresh_token));
CREATE
TABLE oauth_users (username VARCHAR( 255 )
NOT NULL, password VARCHAR( 2000 ),
first_name VARCHAR( 255 ),
last_name VARCHAR( 255 ),
CONSTRAINT username_pk PRIMARY KEY (username));
CREATE
TABLE oauth_scopes (scope TEXT, is_default BOOLEAN);
CREATE
TABLE oauth_jwt (client_id VARCHAR( 80
|