寫(xiě)在前面
OAuth2.0用簡(jiǎn)練的話來(lái)解釋,就是一個(gè)授權(quán)框架,它能使第三方應(yīng)用在不需要用戶憑證的情況下突勇,獲得被保護(hù)的資源装盯。
當(dāng)然這里還是得解釋兩句,想象一下甲馋,微信讀書(shū)App希望獲得微信的用戶頭像埂奈、昵稱等信息。最暴利的方式定躏,就是微信讀書(shū)App直接拿著微信的登錄名/密碼去訪問(wèn)微信账磺,從而得到相關(guān)信息。這里的微信登錄名/密碼就是上面說(shuō)的用戶憑證痊远。這種實(shí)現(xiàn)既不優(yōu)雅也不現(xiàn)實(shí)垮抗。因此得有一種方法,vx可以提供臨時(shí)性的認(rèn)證方式碧聪,讓這一次第三方應(yīng)用的訪問(wèn)需求可以實(shí)現(xiàn)冒版。
這種臨時(shí)性的方案需要做到兩點(diǎn):
- 非用戶憑證
- 具有臨時(shí)性,也就是說(shuō)僅在一段時(shí)間內(nèi)有效
因此OAuth2.0的解決方案就是通過(guò)頒發(fā)訪問(wèn)令牌的方式實(shí)現(xiàn)逞姿。
下面的解釋我們都已[微信讀書(shū)]通過(guò)[微信]第三方登錄來(lái)進(jìn)行解釋和描述辞嗡。
應(yīng)用注冊(cè)
在使用OAuth之前,需要對(duì)服務(wù)進(jìn)行注冊(cè)哼凯,也就是說(shuō)[微信讀書(shū)]需要[微信]提供第三方登錄的功能欲间,需要提前在[微信]掛號(hào),[微信]需要對(duì)這類App提前進(jìn)行資格審查断部,從而在正式使用中猎贴,[微信]知道是誰(shuí)向其提交的第三方登錄的申請(qǐng)。
在[微信開(kāi)放平臺(tái)]的官方文檔中蝴光,涉及到微信登錄功能也提到這一點(diǎn):
可以看到她渴,經(jīng)過(guò)應(yīng)用注冊(cè),[微信讀書(shū)]最終會(huì)獲得AppId和AppSecret蔑祟。
授權(quán)碼模式
OAuth2.0有多種授權(quán)方式趁耗,其中,授權(quán)碼模式應(yīng)用最為廣泛疆虚,因?yàn)樗槍?duì)服務(wù)器端的應(yīng)用進(jìn)行了優(yōu)化苛败,上文我們說(shuō)到的AppSecret被安全的維護(hù)在應(yīng)用程序的服務(wù)端([微信讀書(shū)])。但是這種模式径簿,是基于重定向的流程罢屈,這意味著應(yīng)用程序必須能夠與用戶代理(即用戶的網(wǎng)絡(luò)瀏覽器)進(jìn)行交互,并接收通過(guò)用戶代理路由的API授權(quán)代碼篇亭。
step1: 應(yīng)用服務(wù)請(qǐng)求第三方授權(quán)
這個(gè)過(guò)程中缠捌,請(qǐng)求中會(huì)帶上上文提到的app_id以表明身份;redirect_url當(dāng)授權(quán)成功后重定向地址译蒂;response_type=code曼月,表明請(qǐng)求對(duì)象是授權(quán)碼谊却;scope標(biāo)識(shí),標(biāo)識(shí)請(qǐng)求的權(quán)限范圍哑芹,在[微信開(kāi)放平臺(tái)]的官方文檔中炎辨,這個(gè)字段要求固定為某字段:
step2:在應(yīng)用程序申請(qǐng)第三方授權(quán)后,第三方服務(wù)收到請(qǐng)求绩衷,并在已登錄的情況下蹦魔,對(duì)這次請(qǐng)求進(jìn)行接受或拒絕操作激率。如果接受咳燕,如圖中第三步所示。
step3:通過(guò)第一步指定的redirect_url返回code(授權(quán)碼)
step4:通過(guò)code乒躺、app_id招盲、"app_secret"三元組向第三方服務(wù)[微信]申請(qǐng)access_token;
獲取access_token的過(guò)程為什么非得需要前置獲取code呢嘉冒,筆者認(rèn)為主要是從安全性考慮曹货,防止app_id、"app_secret"泄露讳推。每個(gè)code都是user在一定時(shí)間內(nèi)主動(dòng)接受授權(quán)請(qǐng)求的情況下產(chǎn)生的顶籽,因此能保證時(shí)效性和風(fēng)險(xiǎn)的最小化。
step5:權(quán)限服務(wù)([微信])返回access_token給應(yīng)用服務(wù)([微信讀書(shū)])银觅。
通過(guò)上面的5步操作礼饱,應(yīng)用程序就獲得了第三方服務(wù)的access_token。需要注意的是究驴,這個(gè)token是對(duì)于第三方服務(wù)的token镊绪,它意味著應(yīng)用服務(wù)([微信讀書(shū)])可以通過(guò)access_token訪問(wèn)第三方服務(wù)([微信]),獲得第三方服務(wù)的相關(guān)數(shù)據(jù)信息,比如用戶信息等洒忧。