OAuth2的一個例子
OAuth(開放授權(quán))是一個關(guān)于授權(quán)的開放標準,允許用戶讓第三方應用訪問該用戶在某一網(wǎng)站上存儲的私密的資源(如照片苹威,視頻撞叨,聯(lián)系人列表)实辑,而無需將用戶名和密碼提供給第三方應用漱病。目前的版本是2.0版
假設我們要使用OAuth2.0協(xié)議搭建一個網(wǎng)站买雾,利用Github作為授權(quán)和資源服務器,實現(xiàn)第三方登錄功能杨帽。
1) 網(wǎng)站和Github之間的協(xié)商
Github會對用戶的權(quán)限做分類比如讀取倉庫信息的權(quán)限漓穿、寫入倉庫的權(quán)限、讀取用戶信息的權(quán)限注盈、修改用戶信息的權(quán)限等等晃危。如果我想獲取用戶的信息,Github會要求我老客,先在它的平臺上注冊一個應用僚饭,在申請的時候標明需要獲取用戶信息的哪些權(quán)限,并且在申請的時候填寫你的網(wǎng)站域名胧砰,Github只允許在這個域名中獲取用戶信息浪慌。
此時我的網(wǎng)站已經(jīng)和Github之間達成了共識,Github也給我發(fā)了兩張門票朴则,一張門票叫做Client Id,另一張門票叫做Client Secret。
2)用戶和Github之間的協(xié)商
用戶進入我的網(wǎng)站乌妒,點擊github登錄按鈕的時候汹想,我的網(wǎng)站會將Github給我的Client Id交給用戶,讓他進入Github授權(quán)界面撤蚊,如果此時用戶沒有登錄古掏,Github會提示登錄(當然這不是OAuth2.0客戶端部分應該關(guān)注的)。假設用戶已經(jīng)登錄Github侦啸,那么Github看到用戶手中的門票槽唾,就知道是我的網(wǎng)站讓他過來的,于是就把我的網(wǎng)站獲取的權(quán)限擺出來光涂,并詢問用戶是否允許網(wǎng)站獲取這些權(quán)限庞萍。
// 用戶登錄 github,協(xié)商
GET //github.com/login/oauth/authorize
// 協(xié)商憑證
params = {
client_id: "xxxx",
redirect_uri: "http://my-website.com"
}
如果用戶同意忘闻,在授權(quán)頁面點擊了確認授權(quán)后钝计,頁面會跳轉(zhuǎn)到我預先設定的 redirect_uri并附帶一個蓋了章的門票code。
// 協(xié)商成功后帶著蓋了章的 code
Location: http://my-website.com?code=xxx
這個時候齐佳,用戶和 Github 之間的協(xié)商就已經(jīng)完成私恬,Github 也會在自己的系統(tǒng)中記錄這次協(xié)商,表示該用戶已經(jīng)允許在我的網(wǎng)站訪問上直接操作和使用他的部分資源炼吴。
3)告訴Github我的網(wǎng)站要來訪問
第二步中本鸣,我們已經(jīng)拿到了蓋過章的門票code,但這個code 只能表明硅蹦,用戶允許我的網(wǎng)站從github上獲取該用戶的數(shù)據(jù)荣德,如果我直接拿這個code去github訪問數(shù)據(jù)一定會被拒絕,因為任何人都可以持有code提针,github并不知道code持有方就是我本人命爬。
還記得之前申請應用的時候github給我的兩張門票么,Client Id在上一步中已經(jīng)用過了辐脖,接下來輪到另一張門票Client Secret饲宛。
// 網(wǎng)站和 github 之間的協(xié)商
POST //github.com/login/oauth/access_token
// 協(xié)商憑證包括 github 給用戶蓋的章和 github 發(fā)給我的門票
params = {
code: "xxx",
client_id: "xxx",
client_secret: "xxx",
redirect_uri: "http://my-website.com"
}
拿著用戶蓋過章的code和能夠標識個人身份的client_id、client_secret去拜訪 github嗜价,拿到最后的綠卡access_token艇抠。
// 拿到最后的綠卡
response = {
access_token: "e72e16c7e42f292c6912e7710c838347ae178b4a"
scope: "user,gist"
token_type: "bearer",
refresh_token: "xxxx"
}
4)用戶開始使用Github賬號在我的網(wǎng)站上留言
// 訪問用戶數(shù)據(jù)
GET //api.github.com/user?access_token=e72e16c7e42f292c6912e7710c838347ae178b4a
上一步github已經(jīng)把最后的綠卡access_token給我了,通過github提供的 API 加綠卡就能夠訪問用戶的信息了久锥,能獲取用戶的哪些權(quán)限在response 中也給了明確的說明家淤,scope為user和gist,也就是只能獲取user組和gist組兩個小組的權(quán)限瑟由,user組中就包含了用戶的名字和郵箱等信息了絮重。
// 告訴我用戶的名字和郵箱
response = {
username: "barretlee",
email: "barret.china@gmail.com"
}