摘要:注冊(cè)成功后,下次用戶再進(jìn)入當(dāng)前平臺(tái)時(shí),就可以使用第三方平臺(tái)賬號(hào)登錄了。上圖是的授權(quán)流程。當(dāng)前平臺(tái)跳轉(zhuǎn)到第三方平臺(tái)的授權(quán)請(qǐng)求,在中攜帶當(dāng)前平臺(tái)在第三方平臺(tái)注冊(cè)的應(yīng)用應(yīng)用以及回調(diào)地址信息。第三方平臺(tái)返回受保護(hù)的內(nèi)容。
在網(wǎng)上寫(xiě) OAuth 授權(quán)的文章有很多,不過(guò)其中內(nèi)容質(zhì)量很高的較少,以至于我自己在學(xué)習(xí)的過(guò)程中也走了不少?gòu)澛? =。借著這次發(fā)博客的機(jī)會(huì),也做一個(gè)小結(jié)吧。
什么是 OAuth近幾年來(lái),很多網(wǎng)站都默默地在自己的登錄鏈接旁邊加上了一個(gè)“用XXX平臺(tái)賬號(hào)登錄”的鏈接,比如
使用第三方平臺(tái)賬號(hào)登錄,當(dāng)前平臺(tái)并不會(huì)獲取到用戶的密碼,登錄的動(dòng)作在第三方平臺(tái)下完成。
在登錄完成后,會(huì)跳出一個(gè)頁(yè)面,由當(dāng)前平臺(tái)請(qǐng)求對(duì)第三方平臺(tái)的操作授權(quán)。
用戶同意之后,一般情況下,當(dāng)前平臺(tái)還會(huì)要求用戶注冊(cè)一個(gè)在當(dāng)前平臺(tái)使用的獨(dú)立賬號(hào)。
注冊(cè)成功后,下次用戶再進(jìn)入當(dāng)前平臺(tái)時(shí),就可以使用第三方平臺(tái)賬號(hào)登錄了。登錄后,當(dāng)前平臺(tái)及第三方平臺(tái)的賬號(hào)都會(huì)進(jìn)入在線狀態(tài)。
OAuth 2.0流程簡(jiǎn)介OAuth 就是為了提供跨平臺(tái)訪問(wèn)而產(chǎn)生的一種標(biāo)準(zhǔn)。
OAuth 1.0 的標(biāo)準(zhǔn)在 2007 年發(fā)布,2.0 的標(biāo)準(zhǔn)則在 2011 年發(fā)布。其中 2.0 的標(biāo)準(zhǔn)取消了 Request token 和所有 Token 的加密過(guò)程,但因?yàn)閺?qiáng)制使用 Https 協(xié)議,因此被認(rèn)為安全性高于 1.0 的標(biāo)準(zhǔn)。顯而易見(jiàn)的是,第三方平臺(tái)授權(quán)有非常大的優(yōu)點(diǎn)。
首先,用戶可以只使用一個(gè)社交賬號(hào)來(lái)登錄眾多平臺(tái),這就避免了對(duì)于很多非重度使用的平臺(tái),注冊(cè)后忘記用戶名和密碼的情況。
其次,對(duì)于一些小的平臺(tái)來(lái)說(shuō),通過(guò) OAuth 授權(quán),可以依托大平臺(tái)的賬號(hào)帶來(lái)用戶,對(duì)于服務(wù)提供方來(lái)說(shuō),因?yàn)橘~號(hào)會(huì)在授權(quán)雙方平臺(tái)同時(shí)在線,也會(huì)為己方平臺(tái)帶來(lái)可觀的流量。
最后,對(duì)于用戶來(lái)說(shuō),簡(jiǎn)化的注冊(cè)環(huán)節(jié)以及跨平臺(tái)訪問(wèn),則帶來(lái)了相當(dāng)多的便利。
因?yàn)?1.0 標(biāo)準(zhǔn)的 OAuth 在流程中有非常多的參數(shù)傳遞以及程序加密步驟。如今各大平臺(tái)幾乎已經(jīng)全部切換到了 2.0 的授權(quán)標(biāo)準(zhǔn)。
上圖是 OAuth 2.0 的授權(quán)流程。(下文編號(hào)與圖中編號(hào)對(duì)應(yīng))
用戶在當(dāng)前平臺(tái)發(fā)送一個(gè)通過(guò)第三方登錄的請(qǐng)求。
當(dāng)前平臺(tái)跳轉(zhuǎn)到第三方平臺(tái)的授權(quán)請(qǐng)求 URL,在 Request 中攜帶當(dāng)前平臺(tái)在第三方平臺(tái)注冊(cè)的應(yīng)用 id, 應(yīng)用 secret 以及回調(diào)地址信息。
第三方平臺(tái)在確認(rèn) Request 中包含的應(yīng)用 id, 應(yīng)用 secret,回調(diào)地址與此前注冊(cè)的一致后,給當(dāng)前用戶提供登錄界面。
用戶在第三方平臺(tái)完成登錄及對(duì)當(dāng)前平臺(tái)的授權(quán)。
>授權(quán)內(nèi)容通常包括通過(guò)當(dāng)前平臺(tái)訪問(wèn)第三方平臺(tái)的用戶信息,以及操作第三方平臺(tái)內(nèi)容的權(quán)限。
第三方平臺(tái)攜帶驗(yàn)證碼回調(diào)當(dāng)前平臺(tái)。
當(dāng)前平臺(tái)攜帶驗(yàn)證碼獲取 Access token。
第三方平臺(tái)驗(yàn)證碼通過(guò),生成 Access token 回傳給當(dāng)前平臺(tái)。
當(dāng)前平臺(tái)攜帶 Access token 訪問(wèn)第三方平臺(tái)的受保護(hù)內(nèi)容鏈接。
第三方平臺(tái)返回受保護(hù)的內(nèi)容。
當(dāng)前平臺(tái)保存受保護(hù)的內(nèi)容。
>通常會(huì)讓用戶在當(dāng)前平臺(tái)注冊(cè)一個(gè)新賬號(hào),然后將新賬號(hào)與第三方平臺(tái)的賬號(hào)綁定,綁定過(guò)后,用戶在當(dāng)前平臺(tái)會(huì)成功登錄。
Scribe是一個(gè)用 Java 開(kāi)發(fā)的 OAuth 開(kāi)源庫(kù),支持 OAuth 1.0a / OAuth 2.0 標(biāo)準(zhǔn)。
項(xiàng)目地址
在 Maven 的 pom.xml 中加入庫(kù)依賴:
scribe-java-mvn-repo https://raw.github.com/fernandezpablo85/scribe-java/mvn-repo/ true always org.scribe scribe 1.3.6
初始化依賴之后,就可以使用 Scribe 庫(kù)了。
此外,為了從當(dāng)前平臺(tái)訪問(wèn)第三方平臺(tái),我們還需要構(gòu)建服務(wù)配置類(lèi)(OAuthServiceConfig)以及服務(wù)提供類(lèi)(OAuthServiceProvider)。
/** * 服務(wù)配置類(lèi),配置向第三方平臺(tái)請(qǐng)求的服務(wù)配置項(xiàng) */ public class OAuthServiceConfig { //以下信息在消費(fèi)平臺(tái)配置的與第三方平臺(tái)注冊(cè)的要保持完全一致 private String apiKey; //在第三方平臺(tái)注冊(cè)后生成的消費(fèi)平臺(tái)應(yīng)用id private String apiSecret;//在第三方平臺(tái)注冊(cè)后生成的消費(fèi)平臺(tái)應(yīng)用secret private String callback;//第三方平臺(tái)在用戶登錄及授權(quán)操作通過(guò)后,消費(fèi)平臺(tái)的回調(diào)地址。 private String scope;//申請(qǐng)的權(quán)限范圍,可選 private Class apiClass;//記載獲取第三方校驗(yàn)信息api地址的類(lèi),大平臺(tái)的api類(lèi)多在scribe中有封裝 /** * getters & setters */ public OAuthServiceConfig() { } public OAuthServiceConfig(String apiKey, String apiSecret, String callback, String scope, Class apiClass) { super(); this.apiKey = apiKey; this.apiSecret = apiSecret; this.callback = callback; this.apiClass = apiClass; this.scope = scope; } }
/** * 服務(wù)提供類(lèi),通過(guò)獲取服務(wù)配置類(lèi)中的配置,生成發(fā)送給第三方平臺(tái)的Request */ public class OAuthServiceProvider { private final static Logger logger = LoggerFactory.getLogger(OAuthServiceProvider.class); private OAuthServiceConfig config; public OAuthServiceProvider() { } public OAuthServiceProvider(OAuthServiceConfig config) { this.config = config; } public OAuthService getService() { return new ServiceBuilder().provider(config.getApiClass()) .apiKey(config.getApiKey()) .apiSecret(config.getApiSecret()) .callback(config.getCallback()) .scope(config.getScope()) .build(); } }
將服務(wù)配置的參數(shù)初始化配入 Spring 配置文件。
最后是訪問(wèn)接口類(lèi)。/callback接口為用戶同意授權(quán)后,Weibo回調(diào)當(dāng)前平臺(tái)的接口
/** * Controller類(lèi) */ @Controller public class WeiboController { @Autowired @Qualifier("weiboServiceProvider") private OAuthServiceProvider weiboServiceProvider; //獲取受保護(hù)內(nèi)容的地址(例如某用戶信息) private static final String PROTECTED_RESOURCE_URL = "https://api.weibo.com/2/users/show.json"; //以下代碼和授權(quán)流程中的步驟編碼對(duì)應(yīng) //1.接收來(lái)自客戶端的第三方登錄請(qǐng)求 @RequestMapping(value = "/oauth/weibo/login", method = RequestMethod.GET) public String loginByWeibo() { OAuthService service = weiboServiceProvider.getService(); //2.重定向到第三方平臺(tái)的授權(quán)請(qǐng)求URL,其中URL已經(jīng)在OauthServiceConfig類(lèi)中配置 return "redirect:" + service.getAuthorizationUrl(EMPTY_TOKEN); } //5.攜帶驗(yàn)證碼回調(diào)當(dāng)前平臺(tái),code參數(shù)為驗(yàn)證碼 @RequestMapping(value = "/oauth/weibo/callback", method = RequestMethod.GET) public String callback( @RequestParam(value = "code") String oauthVerifier) throws CoreException { OAuthService service = weiboServiceProvider.getService(); Verifier verifier = new Verifier(oauthVerifier); //6.7.攜帶驗(yàn)證碼獲取access token Token accessToken = service.getAccessToken(requestToken, verifier); OAuthRequest oauthRequest = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL); //8.access token作為參數(shù)發(fā)送獲取受保護(hù)內(nèi)容的request service.signRequest(accessToken, oauthRequest); //9.第三方平臺(tái)response返回受保護(hù)的內(nèi)容 Response oauthResponse = oauthRequest.send(); oauthResponse.getBody(); //...處理從response獲取的信息 } } }最后……
感謝耐心觀看。
鄙人才疏學(xué)淺,一點(diǎn)點(diǎn)經(jīng)驗(yàn),如有謬誤,歡迎指正。
Zhao XiaoxiCoding 官方技術(shù)博客:http://blog.coding.net/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64166.html
摘要:那些瑣碎的知識(shí)點(diǎn)作者記錄的的很奇特很難記的知識(shí)點(diǎn)。易錯(cuò)知識(shí)點(diǎn)整理注意和的區(qū)別中和都是輸出的作用,但是兩者之間還是有細(xì)微的差別。今天手頭不忙,總結(jié)一下,分享過(guò)程中掌握的知識(shí)點(diǎn)。 深入理解 PHP 之:Nginx 與 FPM 的工作機(jī)制 這篇文章從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。 PHP 那些瑣碎的知識(shí)...
摘要:本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。它的特點(diǎn)就是通過(guò)客戶端的后臺(tái)服務(wù)器,與服務(wù)提供商的認(rèn)證服務(wù)器進(jìn)行互動(dòng)能夠滿足絕大多數(shù)開(kāi)放平臺(tái)認(rèn)證授權(quán)的需求。 本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。 什么是開(kāi)放平臺(tái) 通過(guò)開(kāi)放自己平臺(tái)產(chǎn)品服務(wù)的各種API接口,讓其他第三方開(kāi)發(fā)者在開(kāi)發(fā)應(yīng)用時(shí)根據(jù)需求直接調(diào)用,例如微信登錄、QQ登錄、微信支付、微博登錄...
摘要:本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。它的特點(diǎn)就是通過(guò)客戶端的后臺(tái)服務(wù)器,與服務(wù)提供商的認(rèn)證服務(wù)器進(jìn)行互動(dòng)能夠滿足絕大多數(shù)開(kāi)放平臺(tái)認(rèn)證授權(quán)的需求。 本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。 什么是開(kāi)放平臺(tái) 通過(guò)開(kāi)放自己平臺(tái)產(chǎn)品服務(wù)的各種API接口,讓其他第三方開(kāi)發(fā)者在開(kāi)發(fā)應(yīng)用時(shí)根據(jù)需求直接調(diào)用,例如微信登錄、QQ登錄、微信支付、微博登錄...
摘要:什么是第三方評(píng)論系統(tǒng)博客或系統(tǒng),一般都是有內(nèi)容和評(píng)論兩部分組成。而且垃圾評(píng)論和過(guò)濾非法關(guān)鍵字難度較大,所以在國(guó)內(nèi)外都有第三評(píng)論系統(tǒng)。三評(píng)論系統(tǒng)實(shí)現(xiàn)預(yù)備工作創(chuàng)建。 本文只是介紹如何基于 github issues 實(shí)現(xiàn)第三方評(píng)論系統(tǒng),對(duì)于 Hexo 介紹,本文并不打算詳述,如果有童鞋之前還沒(méi)有了解 Hexo 的,可以先看一下之前文章《靜態(tài)博客框架 Hexo 入門(mén) 》,或者直接訪問(wèn) Hex...
閱讀 1503·2021-11-22 09:34
閱讀 3320·2021-09-29 09:35
閱讀 562·2021-09-04 16:40
閱讀 2912·2019-08-30 15:53
閱讀 2582·2019-08-30 15:44
閱讀 2584·2019-08-30 14:10
閱讀 1328·2019-08-29 18:43
閱讀 2205·2019-08-29 13:26