日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

国外persona用户画像_使用Mozilla Persona验证用户的指南

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 国外persona用户画像_使用Mozilla Persona验证用户的指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

國外persona用戶畫像

到目前為止,只有Twitter和Facebook身份驗證,我決定將Mozilla Persona添加到我最新項目( 計算機 ,計算機生成的音樂)的列表中。 為什么?

  • 我喜歡嘗試新事物
  • 存儲密碼是一個艱巨的過程,盡管我知道該怎么做,甚至大部分代碼都寫在另一個項目中,但我認為我不應該為每個需要密碼認證的站點做出貢獻
  • Mozilla是一個開放的基金會,迄今為止已經產生了許多出色的產品。 Persona實現了BrowserID協議,將來可能會在Firefox以外的其他瀏覽器中本地支持(目前,您需要包含.js文件)
  • 第三方身份驗證已經嘗試了很多次,這是一件很了不起的事情,但是由于一些原因,它并不是主流。 有所不同,《女神異聞錄》可能會成功地變得更受歡迎。
  • Mozilla的解釋很有意義

因此,我從“快速設置”指南開始。 看起來真的很容易。 比OpenID或OAuth身份驗證容易得多–您無需在任何地方注冊任何內容,不需要第三方庫來處理服務器上的驗證,并且您無需學習復雜的身份驗證流程,因為該流程很簡單:

  • 用戶單擊登錄按鈕
  • 出現一個彈出窗口
  • 如果未通過Persona認證,則提示用戶注冊
  • 如果通過Persona進行了身份驗證,則提示用戶批準對該站點的身份驗證
  • 彈出窗口關閉,頁面重定向/刷新-用戶現在已登錄
  • 當然,它不是那么簡單,但是只有幾件事需要注意,本教程中沒有提到。 因此,讓我們一步一步地遵循官方教程,并在每一點上進行擴展(使用的服務器端語言是Java,但它很簡單,您可以使用任何語言來完成)

    1.包括.js文件-簡單。 建議從Mozilla服務器獲取js文件,而不是將其存儲在本地,因為它可能會更改(例如,為了修復錯誤)。 如果將js文件合并到一個文件中(為了加快頁面加載速度)可能會比較棘手,但是您的機制可能允許加載遠程js文件。

    2.登錄和退出按鈕。 這看起來也很容易。 最好有條件地添加注銷處理程序–僅當用戶已使用Persona登錄時(而不是您的站點支持的其他身份驗證方法)

    3.偵聽身份驗證事件。 建議將監聽事件放在所有頁面上(例如,包含在標題模板中)。 但是這里有一個問題。 如果您的用戶已經在Persona中進行了身份驗證,但是他的會話在您的站點上已過期,則腳本將自動登錄該用戶。 這將需要在頁面加載后的幾秒鐘內重新加載頁面。 這并不一定是您或用戶想要的-例如,在我的情況下,這可能意味著他們剛剛播放的曲目由于頁面刷新而中斷。 當然可以使用AJAX來完成,但是當UI中的某些內容沒有明顯原因發生更改時,肯定會造成混亂。 下面,我將顯示針對此問題的修復程序。 此外,可能并非到處都需要注銷監聽器-據我了解,如果您已注銷Persona,它將自動注銷用戶。 這可能不是您想要的-例如,用戶可能希望保留一些打開的選項卡,其中包含一些注銷后無法訪問的文檔。

    4.驗證服務器上的斷言。 在這里,您可能需要第3方庫來調用驗證端點并解析json結果,但是這些是您可能已經包含的非常標準的庫。

    現在,如何解決自動身份驗證的問題? 聲明一個新變量userRequestedAuthentication ,該變量保存身份驗證是由用戶顯式發起還是由用戶自動發起。 在登錄按鈕中,單擊處理程序,將該變量設置為true 。 這是js代碼的樣子(順便說一句,我認為可以將代碼放在document.ready()中,而不是直接放在script標記中。假設您以后需要在處理程序方法中使用一些DOM資源,頁面已完全加載。另一方面,這可能會減慢該過程的速度)。 請注意,您可以在所有頁面上包括一個空的onlogin處理程序,并且僅在身份驗證頁面上具有完整的處理程序。 但是,鑒于登錄按鈕位于主頁上,或帶有javascript模態窗口顯示,因此可以在任何地方/在多個頁面上都可以使用。

    <script type='text/javascript'>var loggedInUser = ${context.user != null ? ''' + context.user.email + ''' : 'null'};var userRequestedAuthentication = false;navigator.id.watch({loggedInUser : loggedInUser,onlogin : function(assertion) {$.ajax({type : 'POST',url : '${root}/persona/auth',data : {assertion : assertion, userRequestedAuthentication : userRequestedAuthentication},success : function(data) {if (data != '') {window.location.href = '${root}' + data;}},error : function(xhr, status, err) {alert('Authentication failure: ' + err);}});},onlogout : function() {window.locaiton.open('${root}/logout');}}); </script>

    如您所見,參數被傳遞到服務器端代碼。 那里發生了什么?

    @RequestMapping('/persona/auth') @ResponseBody public String authenticateWithPersona(@RequestParam String assertion,@RequestParam boolean userRequestedAuthentication, HttpServletRequest request, Model model)throws IOException {if (context.getUser() != null) {return '';}MultiValueMap<String, String> params = new LinkedMultiValueMap<>();params.add('assertion', assertion);params.add('audience', request.getScheme() + '://' + request.getServerName() + ':' + (request.getServerPort() == 80 ? '' : request.getServerPort()));PersonaVerificationResponse response = restTemplate.postForObject('https://verifier.login.persona.org/verify', params, PersonaVerificationResponse.class);if (response.getStatus().equals('okay')) {User user = userService.getUserByEmail(response.getEmail());if (user == null && userRequestedAuthentication) {return '/signup?email=' + response.getEmail();} else if (user != null){if (userRequestedAuthentication || user.isLoginAutomatically()) {context.setUser(user);return '/';} else {return '';}} else {return ''; //in case this is not a user-requested operation, do nothing}} else {logger.warn('Persona authentication failed due to reason: ' + response.getReason());throw new IllegalStateException('Authentication failed');} }

    邏輯看起來比您希望的更復雜,但是讓我解釋一下:

    • 正如您在javascript代碼中看到的那樣,空字符串表示“不執行任何操作”。 如果返回任何其他內容,則javascript將打開該頁面。 如果不使用spring-mvc,則無需將其從方法中返回@ResponseBody字符串,而是將其寫入響應輸出流(或用php術語–將其回顯)。
    • 首先,您檢查系統中是否已經有經過身份驗證的用戶。 如果有,則什么也不做。 我不確定是否存在Persona在已通過身份驗證的用戶上調用“ onlogin”的情況,但是如果您使用其他身份驗證選項,Persona將不會知道您的用戶已使用Twitter登錄。
    • 然后,您調用驗證URL并將結果解析為JSON。 我已經使用過RestTemplate ,但是任何東西都可以使用RestTemplate ,URLConnection。 對于JSON解析,spring在后臺使用了Jackson。 您只需要編寫一個值對象,即可保存Persona可能返回的所有屬性。 到目前為止,我只包括:狀態,電子郵件和原因(杰克遜詳細信息:ignoreUnknown = true,spring-mvc詳細信息:您需要將FormHttpMessageConverter設置為RestTemplate )。 重要的是,“受眾”參數必須是用戶當前所在的域。 無論是否使用www,它都會有所不同,因此請對其進行重構,而不是對其進行硬編碼或從屬性中加載它。 即使您從www重定向到no-www(反之亦然),您仍應為測試而動態獲取該URL –測試環境的URL與生產環境的URL不同。
    • 如果Persona身份驗證為“可以”,則您嘗試在數據庫中查找具有該電子郵件的用戶。
    • 如果沒有這樣的用戶,并且身份驗證操作已手動觸發,則將用戶發送到注冊頁面并提供電子郵件作為參數(您也可以在http會話中進行設置,以使用戶無法對其進行修改)。 然后,注冊頁面會詢問其他詳細信息-名稱,用戶名,出生日期或您認為合適的任何信息(但請盡量減少-最好僅是全名)。 如果僅需要電子郵件地址,而無需其他任何內容,則可以跳過注冊頁面并強制注冊用戶。 注冊完成后,您登錄用戶。 請注意,如果您已將電子郵件存儲在會話中(即用戶無法從注冊頁面修改它),則可以跳過確認電子郵件-Persona已確認該電子郵件
    • 如果您的數據庫中有該電子郵件的用戶,請檢查該用戶是否已請求該操作,或者是否已(通過注冊頁面中的復選框)指示他要自動登錄。考慮–應該詢問用戶,還是應該始終將其設置為true或false? 我已經添加了復選框。 如果應該進行登錄,則在會話中設置用戶并重定向到home(或上一頁,或“用戶home”的任何頁面)(“ context”是會話范圍的bean。您可以將其替換為session.setAttribute('user', user) )。 如果身份驗證嘗試是自動的,但用戶不希望這樣做,則不執行任何操作。 最后一個“ else”是針對用戶在您的站點上沒有帳戶并且觸發了自動身份驗證的情況–在這種情況下不執行任何操作,否則最終將無休止地重定向到注冊頁面
    • 如果身份驗證失敗,請務必記錄原因-然后您可以通過查看日志來檢查一切是否正常

    使用電子郵件作為唯一標識符( 使數據庫列唯一 )的一個很酷的副作用是,如果稍后將Persona添加到您的站點,即使用戶以其他方式注冊(例如,facebook或常規注冊),用戶也可以使用它登錄。 因此,他們可以將密碼設置為長而難以記住的密碼,并僅使用Persona繼續登錄。

    我從實現中省略的細節很簡單:注冊頁面只是收集字段并將其提交給/ completeRegistration處理程序,該處理程序將新用戶存儲在數據庫中。 / logout網址僅清除會話(如果存儲了cookie,則清除cookie)。 順便說一句,如果啟用了自動登錄,并且Persona是您唯一的身份驗證方法,則可能不需要存儲cookie來保持會話過期后仍保持用戶登錄狀態。

    總體而言,即使我提出了要點,實現也仍然很簡單。 女神異聞錄看起來很棒,我希望很快能在更多站點上看到它。

    參考: Bozho的技術博客博客上的JCG合作伙伴 Bozhidar Bozhanov的 Mozilla Persona身份驗證用戶指南 。

    翻譯自: https://www.javacodegeeks.com/2012/12/a-guide-to-authenticating-users-with-mozilla-persona.html

    國外persona用戶畫像

    總結

    以上是生活随笔為你收集整理的国外persona用户画像_使用Mozilla Persona验证用户的指南的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。