教程:如何实现Java OAuth 2.0以使用GitHub和Google登录
將Google和GitHub OAuth登錄添加到Java應(yīng)用程序的指南
我們添加到Takipi的最新功能之一是3rd party登錄。 如果您像我一樣懶惰,那么我想您也希望跳過填寫表單和輸入新密碼的操作 。 只要有權(quán)限,許多人都希望使用第三方登錄,只要他們要求的權(quán)限是非侵入性的-沒有人真正希望在Facebook墻上顯示隨機帖子,因此這種訪問方式僅包括用戶的基本信息,例如姓名和電子郵件地址。 在本文中,您將初步了解我們?nèi)绾卧赥akipi中實現(xiàn)此功能,如何在應(yīng)用程序中使用3rd party登錄,以及我們獲得的一些見解,如果您決定集成,將為您節(jié)省寶貴的時間使用您自己的應(yīng)用程序。
新帖:如何實現(xiàn)Java OAuth 2.0以使用GitHub和Google登錄http://t.co/20Hn59dCtf pic.twitter.com/3tNNwPKjET
— Takipi(@takipid) 2015年5月14日
在我們自己的小宇宙中,事實證明我并不孤單,我們的許多用戶也有同樣的感覺。 由于我們是開發(fā)人員工具初創(chuàng)公司,因此使用GitHub和Google的第3方登錄非常合理。 除了為用戶提供便利之外,使用第三方服務(wù)還可以增強其安全性。 由于Google和GitHub使用雙重身份驗證(2FA),因此您的應(yīng)用程序可以“免費”享受這種安全級別。 在我們的案例中,我們已經(jīng)啟用了2FA,所以我想這使我們……3FA��
帶有第3個聚會登錄按鈕的新首頁的樣機預(yù)覽
要查看其在實際中的工作方式,您可以查看我們內(nèi)部用于測試的頁面 。 它完全可以正常運行,但是該更新尚未在該站點上發(fā)布。 您在這里有一個難得的機會成為第一個使用它的人:)
因此,提醒我OAuth 2.0又如何發(fā)展?
OAuth登錄流程如下:用戶轉(zhuǎn)到您的站點,單擊“使用任何方式登錄”按鈕,然后重定向到權(quán)限頁面。 權(quán)限頁面來自Whatever?,當他們批準您要求的權(quán)限時,Whatever?向他們發(fā)送一個令牌,令牌將由他的瀏覽器發(fā)送到您的應(yīng)用程序的后端。 擁有令牌后,將其發(fā)送回Whatever?進行驗證并假設(shè)它已通過驗證–您可以訪問被授予權(quán)限的數(shù)據(jù)。
Google OAuth2.0庫
為了在我們的網(wǎng)站上實現(xiàn)第三方登錄,我們使用了Google APIs Client Java for Java。 在GitHub頂級Java項目使用的前100個庫中 ,還包含Jackson2,ProtoBuf和所有其他方便的實用程序。 對于我們來說,這是一個非常簡單的選擇,因為我們已經(jīng)將該庫用于其他目的,而且,老實說,谷歌庫只是出現(xiàn)在……谷歌上的第一個結(jié)果。 準備好您的錫箔帽子 。
使用Google實施登錄
這是旅途中的輕松部分; Google方面的文檔清晰明確。 由于它是他們自己的庫,因此他們還抽象了過程的一部分并在后臺進行處理,從而使其更易于實現(xiàn)。 第一步是在Google開發(fā)人員控制臺上創(chuàng)建一個項目,您可以在其中注冊您的應(yīng)用程序并自定義權(quán)限頁面。
Google的權(quán)限頁面–為Takipi定制
現(xiàn)在回到Java。 從本質(zhì)上講,該過程可以歸納為幾個簡單的步驟,毫不奇怪。 首先,我們構(gòu)建并執(zhí)行一個獲取GoogleTokenResponse的請求,以便我們可以驗證從用戶那里獲得的令牌。 然后,我們使用此響應(yīng)來創(chuàng)建一個GoogleCredential ,讓我們對其調(diào)用getAccessToken()并以JSON格式返回用戶的信息:
JsonFactory jsonFactory = new JacksonFactory(); HttpTransport httpTransport = new NetHttpTransport();GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(httpTransport, jsonFactory,/* Client ID and Secret */,code, "postmessage").execute();GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory).setTransport(httpTransport).setClientSecrets(/* Client ID and Secret */).build().setFromTokenResponse(tokenResponse);Oauth2 oauth2 = new Oauth2.Builder(httpTransport, jsonFactory, credential).setApplicationName("YourAppName").build(); Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(credential.getAccessToken()).execute();return oauth2.userinfo().get().execute();繁榮。 而已。 最好的建議是僅遵循官方文檔。 在GitHub的一端,實現(xiàn)有些棘手。
使用GitHub實施登錄
現(xiàn)在,我們意識到Google幫助我們在OAuth方面走了一些彎路,并在GoogleTokenResponse和GoogleCredential中使用了抽象。 使用GitHub,我們必須更接近原始協(xié)議。 與Google類似,在GitHub的開發(fā)人員應(yīng)用程序屏幕上注冊我們的應(yīng)用程序時,我們可以自定義權(quán)限屏幕 。
GitHub的權(quán)限頁面–為Takipi定制
當我們到達實際的代碼時,有3個主要問題使我們放慢了速度,而在文檔中找不到。 解決方法如下:
1.建立自己的請求流程
在Google的情況下,只有5行代碼,變成了19行,因此我們可以生成GitHub tokenResponse。 以下是您自己建立請求的方法:
JsonFactory jsonFactory = new JacksonFactory(); HttpTransport httpTransport = new NetHttpTransport();AuthorizationCodeFlow flow = new AuthorizationCodeFlow.Builder(BearerToken.authorizationHeaderAccessMethod(),httpTransport, jsonFactory,new GenericUrl("https://github.com/login/oauth/access_token"),new ClientParametersAuthentication(/* Client ID and Secret */),/* Client ID */"https://github.com/login/oauth/authorize").build();TokenResponse tokenResponse = flow.newTokenRequest(code).setScopes(Collections.singletonList("user:email")).setRequestInitializer(new HttpRequestInitializer() {@Overridepublic void initialize(HttpRequest request) throws IOException {request.getHeaders().setAccept("application/json");}}).execute();由于某些原因,字符串是默認值
注意到setAccept的更早的初始化方法嗎? 這有點令人驚訝。 事實證明,您需要明確要求GitHub以JSON格式返回響應(yīng),否則您將以字符串格式獲取響應(yīng)。 如果我們提前知道的話,可以節(jié)省一些時間,例如:
但值得慶幸的是,我們找到了一些膠帶和回形針來處理事情
3.處理用于GitHub登錄的用戶電子郵件
現(xiàn)在,一個GitHub用戶可能有多個電子郵件地址,然后您必須選擇用于自己目的的電子郵件地址。 因此,我們創(chuàng)建了一個getBestEmail方法,該方法可以對電子郵件數(shù)組進行排序(注意,它應(yīng)該擴展ArrayList才能起作用)。 在對電子郵件數(shù)組進行排序之后,我們選擇了可以找到的最佳選項:
public class GithubEmails extends ArrayList<GithubEmail> {public GithubEmail getBestEmail() {if (isEmpty()) {return null;}Collections.sort(this, GithubEmail.bestEmailComparator);return get(0);} }那么最好的選擇是什么? 我們從GitHub的響應(yīng)中獲得的此電子郵件數(shù)組中的每個字段都有一封電子郵件,一個經(jīng)過驗證的字段和一個主字段。 這是我們實現(xiàn)的排序比較器:
public static final Comparator<? super GithubEmail> bestEmailComparator =new Comparator<GithubEmail>() {@Overridepublic int compare(GithubEmail o1, GithubEmail o2) {if (o1.verified != o2.verified) {return (o1.verified ? -1 : 1);}if (o1.primary != o2.primary) {return (o1.primary ? -1 : 1);}return o1.email.compareTo(o2.email);} };因此,基本上您可以看到我們更喜歡驗證和主要電子郵件。
結(jié)論
我們希望本文有助于您全神貫注如何通過Google和GitHub的登錄方法來訪問OAuth和Java。 雖然這是我們決定實現(xiàn)的方法,但是您可以使用其他方法和庫來實現(xiàn)類似的結(jié)果。 我們很高興聽到您采用哪種方法,更喜歡哪種庫并回答有關(guān)此實現(xiàn)的任何問題。 如果您對我們的決定方式有任何意見或建議,請在下面的評論部分中告知我。 而且,如果您遇到麻煩,請分享您遇到的困難,我們將很樂于幫助和分享更多代碼。
翻譯自: https://www.javacodegeeks.com/2015/05/tutorial-how-to-implement-java-oauth-2-0-to-sign-in-with-github-and-google.html
總結(jié)
以上是生活随笔為你收集整理的教程:如何实现Java OAuth 2.0以使用GitHub和Google登录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带有Hibernate OGM的NoSQ
- 下一篇: Java REST JAX-RS 2.0