天天看點

php實作第三方登入

1. oAuth2.0原理

網站為了友善使用者快速的登入系統,都會提供使用知名的第三方平台賬号進行快速登入的功能,第三方登入都是基于oAuth2.0标準來實作的。下面詳細分析【基于賬号密碼授權】和【基于oAuth2.0标準授權】的原理和oAuth2.0授權的優點。

1.1 賬号密碼授權方式

php實作第三方登入

使用者到網站發起使用其他平台賬号登入的指令,第三方平台網站就向使用者索取賬号和密碼,使用者将賬号和密碼提供第三方網站之後,網站使用使用者提供的賬号和密碼去登入服務商,取回使用者的資訊。這就是使用賬号和密碼授權登入的流程。

存在的問題:

一、服務商的賬号和密碼都洩漏給了第三方平台,導緻安全性問題;

分析:假設服務商是微信,沒有人會願意把微信賬号和密碼告訴目前通路的網站,一旦目前網站發生資訊洩漏,微信賬号和密碼都會丢失;

二、使用者要收回授權,隻能通過修改密碼來實作,若是有多個第三方網站都是用

同一個服務商授權登入,那麼所有第三方網站的授權都被收回來了;

分析:假設我們想要收回授權給目前網站的賬号和密碼,又不可能讓第三方主動放棄已給

授權,那麼隻有使用者自己修改微信密碼,但是有多個第三方網站都被微信服務商授權了登入,修改密碼的同時,其它網站的授權也都失效了;

三、很難實作給不同的網站,授予不同的權限;

1.2 oAuth原理和授權流程

為了解決上述傳統的賬号密碼授權方式存在的問題,oAuth項目組制定了oAuth标準,目的在于為API通路授權提供一個開放的标準;oAuth是針對通路授權的一個開放标準,與以往的授權方式不同之處是oAuth的授權不會使第三方觸及到使用者的帳号資訊(如使用者名與密碼),即第三方無需使用使用者的使用者名與密碼就可以申請獲得該使用者資源的授權,是以oAuth是安全的。oAuth是Open Authorization的簡寫。服務商和第三方平台依據oAuth标準來編碼,服務商可以實作一個安全的授權機制,第三方應用調用服務商資源也有了統一性,服務商和第三方依據統一的标準來實作自己的功能。

php實作第三方登入

使用者向第三方網站發起請求,請求使用其它平台授權登入,這個時候第三網站并不是直接的要求使用者提供其它平台的賬号和密碼,而是引導使用者浏覽器跳轉到服務商的授權登入頁面,使用者在服務商的網站頁面進行登入完成授權。是以解決了剛才的第一個問題,使用者不需要給第三方使用者透露賬号和密碼。登入授權之後,服務商就會生成一個一次性的用來通路資源的通路碼,我們叫做令牌,這個令牌包含了使用者、第三方網站、資源權限的資訊。生成這個令牌之後,服務商又引導使用者浏覽器攜帶這個令牌跳回第三方網站的頁面,網站接收這個令牌後,第三方網站就可以攜帶令牌作為憑證通路服務商上面有權限通路的資源。在這個過程中,使用者沒有洩漏賬号和密碼給第三方,成功授權登入,并且限制了第三方通路的服務資源的權限。

下面是oAuth2.0授權流程圖

php實作第三方登入

2. php實作微信授權登入

在微信開放平台注冊開發者帳号,并擁有一個已稽核通過的網站應用,并獲得相應的AppID和AppSecret,申請微信登入且通過稽核後,可開始接入流程。 

php實作第三方登入
php實作第三方登入

第一步:請求CODE

https://open.weixin.qq.com/connect/qrconnect?appid=wxd7ygg9f86e0e&redirect_uri=http://www.rainzfw.tech/third-login/weixin.html&response_type=code&scope=snsapi_login&state=123

若提示“該連結無法通路”,請檢查參數是否填寫錯誤,如redirect_uri的域名與稽核時填寫的授權域名不一緻或scope不為snsapi_login。

php實作第三方登入
php實作第三方登入

使用者允許授權後,将會重定向到redirect_uri的網址上,并且帶上code和state參數

第二步:通過code擷取access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

php實作第三方登入

傳回說明:

{

    "access_token": "OezXcEiiBSKSxW0eoylIeFy2HFC4Bxv9JvC0Sgj4Px4_8TX1ci3jF_QP_6sWjvx2rCAUjXEP1_9edZdJLf3MIwii2N8cnTooDfx7nYpFRmOSZyq4gb2FNdWJr__KUqPtcfVUvg6XBTucZZ4zH6v8VQ",

    "expires_in": 7200,

    "refresh_token": "OezXcEiiBSKSxW0eoylIeFy2HFC4Bxv9JvC0Sgj4Px4_8TX1ci3jF_QP_6sWjvx2lW60INlf6AK1q21rW7mJyc5yG3GZ9p1psANOKTi2EZUQXA6CnwSXxDQlJ3421tEOvCWIrJhkA8oTqjsLKYG-yg",

    "openid": "oJekJs2faTQ47FGjDOEIyOPMN97s",

    "scope": "snsapi_login",

    "unionid": "o4wcnw02YjFUYglZxV0LwcBkVF6Y"

}

php實作第三方登入

第三步:通過access_token調用接口:

1. access_token有效且未逾時;

2. 微信使用者已授權給第三方應用帳号相應接口作用域(scope)。

對于接口作用域(scope),能調用的接口有以下:

php實作第三方登入

其中snsapi_base屬于基礎接口,若應用已擁有其它scope權限,則預設擁有snsapi_base的權限。使用snsapi_base可以讓移動端網頁授權繞過跳轉授權登入頁請求使用者授權的動作,直接跳轉第三方網頁帶上授權臨時票據(code),但會使得使用者已授權作用域(scope)僅為snsapi_base,進而導緻無法擷取到需要使用者授權才允許獲得的資料和基礎功能。接口調用方法可查閱《微信授權關系接口調用指

php