教程:如何实现Java OAuth 2.0以使用GitHub和Google登录
將Google和GitHub OAuth登錄添加到Java應用程序的指南
我們添加到Takipi的最新功能之一是3rd party登錄。 如果您像我一樣懶惰,那么我想您也希望跳過填寫表單和輸入新密碼的操作 。 只要有權限,許多人都希望使用第三方登錄,只要他們要求的權限是非侵入性的-沒有人真正希望在Facebook墻上顯示隨機帖子,因此這種訪問方式僅包括用戶的基本信息,例如姓名和電子郵件地址。 在本文中,您將初步了解我們如何在Takipi中實現此功能,如何在應用程序中使用3rd party登錄,以及我們獲得的一些見解,如果您決定集成,將為您節省寶貴的時間使用您自己的應用程序。
新帖:如何實現Java OAuth 2.0以使用GitHub和Google登錄http://t.co/20Hn59dCtf pic.twitter.com/3tNNwPKjET
— Takipi(@takipid) 2015年5月14日
在我們自己的小宇宙中,事實證明我并不孤單,我們的許多用戶也有同樣的感覺。 由于我們是開發人員工具初創公司,因此使用GitHub和Google的第3方登錄非常合理。 除了為用戶提供便利之外,使用第三方服務還可以增強其安全性。 由于Google和GitHub使用雙重身份驗證(2FA),因此您的應用程序可以“免費”享受這種安全級別。 在我們的案例中,我們已經啟用了2FA,所以我想這使我們……3FA��
帶有第3個聚會登錄按鈕的新首頁的樣機預覽
要查看其在實際中的工作方式,您可以查看我們內部用于測試的頁面 。 它完全可以正常運行,但是該更新尚未在該站點上發布。 您在這里有一個難得的機會成為第一個使用它的人:)
因此,提醒我OAuth 2.0又如何發展?
OAuth登錄流程如下:用戶轉到您的站點,單擊“使用任何方式登錄”按鈕,然后重定向到權限頁面。 權限頁面來自Whatever?,當他們批準您要求的權限時,Whatever?向他們發送一個令牌,令牌將由他的瀏覽器發送到您的應用程序的后端。 擁有令牌后,將其發送回Whatever?進行驗證并假設它已通過驗證–您可以訪問被授予權限的數據。
Google OAuth2.0庫
為了在我們的網站上實現第三方登錄,我們使用了Google APIs Client Java for Java。 在GitHub頂級Java項目使用的前100個庫中 ,還包含Jackson2,ProtoBuf和所有其他方便的實用程序。 對于我們來說,這是一個非常簡單的選擇,因為我們已經將該庫用于其他目的,而且,老實說,谷歌庫只是出現在……谷歌上的第一個結果。 準備好您的錫箔帽子 。
使用Google實施登錄
這是旅途中的輕松部分; Google方面的文檔清晰明確。 由于它是他們自己的庫,因此他們還抽象了過程的一部分并在后臺進行處理,從而使其更易于實現。 第一步是在Google開發人員控制臺上創建一個項目,您可以在其中注冊您的應用程序并自定義權限頁面。
Google的權限頁面–為Takipi定制
現在回到Java。 從本質上講,該過程可以歸納為幾個簡單的步驟,毫不奇怪。 首先,我們構建并執行一個獲取GoogleTokenResponse的請求,以便我們可以驗證從用戶那里獲得的令牌。 然后,我們使用此響應來創建一個GoogleCredential ,讓我們對其調用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的一端,實現有些棘手。
使用GitHub實施登錄
現在,我們意識到Google幫助我們在OAuth方面走了一些彎路,并在GoogleTokenResponse和GoogleCredential中使用了抽象。 使用GitHub,我們必須更接近原始協議。 與Google類似,在GitHub的開發人員應用程序屏幕上注冊我們的應用程序時,我們可以自定義權限屏幕 。
GitHub的權限頁面–為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格式返回響應,否則您將以字符串格式獲取響應。 如果我們提前知道的話,可以節省一些時間,例如:
但值得慶幸的是,我們找到了一些膠帶和回形針來處理事情
3.處理用于GitHub登錄的用戶電子郵件
現在,一個GitHub用戶可能有多個電子郵件地址,然后您必須選擇用于自己目的的電子郵件地址。 因此,我們創建了一個getBestEmail方法,該方法可以對電子郵件數組進行排序(注意,它應該擴展ArrayList才能起作用)。 在對電子郵件數組進行排序之后,我們選擇了可以找到的最佳選項:
public class GithubEmails extends ArrayList<GithubEmail> {public GithubEmail getBestEmail() {if (isEmpty()) {return null;}Collections.sort(this, GithubEmail.bestEmailComparator);return get(0);} }那么最好的選擇是什么? 我們從GitHub的響應中獲得的此電子郵件數組中的每個字段都有一封電子郵件,一個經過驗證的字段和一個主字段。 這是我們實現的排序比較器:
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);} };因此,基本上您可以看到我們更喜歡驗證和主要電子郵件。
結論
我們希望本文有助于您全神貫注如何通過Google和GitHub的登錄方法來訪問OAuth和Java。 雖然這是我們決定實現的方法,但是您可以使用其他方法和庫來實現類似的結果。 我們很高興聽到您采用哪種方法,更喜歡哪種庫并回答有關此實現的任何問題。 如果您對我們的決定方式有任何意見或建議,請在下面的評論部分中告知我。 而且,如果您遇到麻煩,請分享您遇到的困難,我們將很樂于幫助和分享更多代碼。
翻譯自: https://www.javacodegeeks.com/2015/05/tutorial-how-to-implement-java-oauth-2-0-to-sign-in-with-github-and-google.html
總結
以上是生活随笔為你收集整理的教程:如何实现Java OAuth 2.0以使用GitHub和Google登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带有Hibernate OGM的NoSQ
- 下一篇: 橙玫瑰花语 橙玫瑰花语是什么