国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
讓網(wǎng)站支持OpenID的方法

讓網(wǎng)站支持OpenID的方法

2009年07月22日

對(duì)于已經(jīng)擁有一定數(shù)量的注冊(cè)用戶的網(wǎng)站,如何引入對(duì)OpenID注冊(cè)與登錄的支持,本教程做了詳細(xì)的描述。它將告訴你如何讓新用戶使用OpenID的URL來(lái)注冊(cè)賬號(hào),也讓原有的用戶輕松綁定他們的OpenID進(jìn)行登錄。

 

概述

首先假定你的網(wǎng)站情況是:

  • 有一個(gè)用戶數(shù)據(jù)庫(kù)
    • 每個(gè)用戶有一個(gè)唯一的內(nèi)部ID
    • 用戶以用戶名/Email加上他的密碼進(jìn)行登錄
  • 有一個(gè)完整的新用戶注冊(cè)和用戶信息收集流程
  • 有一個(gè)登陸頁(yè)面供用戶進(jìn)行登錄驗(yàn)證身份
    • 用戶憑其用戶名/Email和密碼登陸以后,以其唯一的用戶ID號(hào)在整個(gè)網(wǎng)站通行
  • 有讓用戶管理其賬戶信息的頁(yè)面

如果你的網(wǎng)站不是如上所說(shuō)的樣子,應(yīng)先將其改成那樣。

下面大致說(shuō)說(shuō)你需要給你的網(wǎng)站添加的內(nèi)容:

  1. A 一個(gè)新的數(shù)據(jù)表用于建立OpenID和內(nèi)部用戶ID的對(duì)應(yīng)
    • 這是多對(duì)一的關(guān)系(每個(gè)用戶可以綁定多個(gè)OpenID,但是一個(gè)OpenID只能屬于一個(gè)用戶)。
    • 這個(gè)表將是用通過(guò)OpenID查詢用戶的唯一依據(jù),因此必須是一個(gè)獨(dú)立的數(shù)據(jù)表。
  2. 在新用戶注冊(cè)頁(yè)面上加上一些OpenID元紊
    • 新用戶可以輸入他們的OpenID, 通過(guò)對(duì)應(yīng)的OpenID提供方驗(yàn)證以后,返回到你的注冊(cè)頁(yè)面,選擇性提供他們想在你的網(wǎng)站上共享的資料。
  3. 對(duì)原有用戶需要在登錄頁(yè)面上加上一些OpenID元紊
    • 已經(jīng)綁定OpenID的用戶可以直接輸入OpenID,通過(guò)對(duì)應(yīng)提供者驗(yàn)證用戶身份,并返回到你的網(wǎng)站的驗(yàn)證頁(yè)面,并通過(guò)OpenID和用戶ID的對(duì)應(yīng)關(guān)系找到對(duì)應(yīng)的賬號(hào),就像他們輸入了賬號(hào)(e-mail)和密碼一樣。
  4. 一個(gè)OpenID 設(shè)置頁(yè)面供用戶瀏覽、添加、刪除他的賬號(hào)的OpenID綁定。

下面是你將要?jiǎng)?chuàng)建的內(nèi)容的簡(jiǎn)要介紹:

  1. 一個(gè)OpenID數(shù)據(jù)表
    • 數(shù)據(jù)列: (openid_url, user_id). openid_url是字符串,user_id是你當(dāng)前用戶標(biāo)識(shí)身份的內(nèi)部ID。
    • 把openid_url設(shè)為主鍵(唯一,用來(lái)通過(guò)OpenID查找用戶)
    • 對(duì)user_id建立索引(用來(lái)對(duì)指定賬號(hào)列舉其綁定的OpenID)
  2. 一個(gè)對(duì)用戶輸入的OpenID進(jìn)行查詢并重定向到OpenID提供者的頁(yè)面
    • 需要檢查用戶輸入的OpenID是否已經(jīng)進(jìn)行過(guò)綁定
    • 需要重定向到OpenID提供者(使用OpenID庫(kù))以便用戶進(jìn)行登錄驗(yàn)證(詳見后面)
  3. 一個(gè)處理OpenID提供者返回信息的頁(yè)面
    • 需要核實(shí)OpenID提供者的響應(yīng)信息(使用OpenID庫(kù))
    • 對(duì)于新用戶,需要將他們引導(dǎo)到用戶注冊(cè)流程,并預(yù)先填充好從OpenID提供者返回的注冊(cè)信息。還要稍微改一下注冊(cè)頁(yè)面讓他們不再需要輸入密碼(因?yàn)樗麄円院髮⑼ㄟ^(guò)OpenID直接登陸)。
    • 對(duì)于已經(jīng)注冊(cè)的用戶,由OpenID查詢出內(nèi)部用戶ID完成登錄的過(guò)程。
  4. 一個(gè)用來(lái)管理用戶的OpenID綁定的頁(yè)面
    • 可以列出當(dāng)前登陸賬號(hào)的所有綁定OpenID
    • 可以讓用戶綁定新的OpenID(通過(guò)上面所說(shuō)的流程)
    • 可以讓用戶解除OpenID的綁定
  5. 在刪除用戶的代碼中加入刪除相應(yīng)OpenID綁定的功能

在正式開干之前你可能需要準(zhǔn)備:

  • 一個(gè)適合你網(wǎng)站編程語(yǔ)言的OpenID庫(kù)。由于我們是用C++,所以就采用了libopkele (多謝Michael和他們的Klever團(tuán)隊(duì)提供了這個(gè)開源的庫(kù)文件!), 你也可以在這里查到其他語(yǔ)言的庫(kù)。
  • 一些OpenID的標(biāo)準(zhǔn)圖片用于放在你的網(wǎng)站上以提供統(tǒng)一的UI,例如小圖標(biāo)和logo (小圖, 標(biāo)準(zhǔn)圖, PDF)
  • 一個(gè)可以用于測(cè)試的OpenID提供者。例如藍(lán)天OpenID,MyOpenID.com, LiveJournal, ClaimID。另外如果你有AOL/AIM賬號(hào),也可以直接用http://openid.aol.com/SCREENAME作為你的 OpenID.

實(shí)現(xiàn)OpenID用戶支持可以給你網(wǎng)站立刻帶來(lái)如下好處:

  • 超過(guò)1.2億使用OpenID的用戶可以更容易、迅速地注冊(cè)到你的網(wǎng)站,因?yàn)樗麄儾辉傩枰硗鈩?chuàng)建并記住新的賬號(hào)和密碼。
  • 讓你的用戶享受到更多的基于OpenID的服務(wù)。
  • 以O(shè)penID表明你網(wǎng)站的開放性和領(lǐng)先程度。

當(dāng)OpenID被越來(lái)越廣泛的使用之后,你還可以得到以下好處:

  • 可以鏈接到會(huì)員注冊(cè)的其他網(wǎng)站,讓用戶無(wú)需重新登錄。
  • 當(dāng)用戶更改信息時(shí),可以得到最新的更新。
  • 獲得可信的信息,如:經(jīng)過(guò)驗(yàn)證的年齡、EMAIL等。

實(shí)現(xiàn)的細(xì)節(jié)

  1. 安裝OpenID庫(kù)
    • 可以在這里查找到各種主流編程語(yǔ)言的OpenID庫(kù)。
    • 在庫(kù)的基礎(chǔ)上,建立一個(gè)與OpenID提供者聯(lián)系的緩沖,以減少每次驗(yàn)證時(shí)重建聯(lián)系的開銷。
  2. 建立一個(gè) OpenID數(shù)據(jù)表
    • 如以下結(jié)構(gòu)(這是Mysql的,如果你用其他庫(kù)或者你的用戶ID字段名不一樣可以自行調(diào)整):
      create table user_openids (
        openid_url varchar(255) not null,
        primary key (openid_url),
      
        user_id int not null,
        index (user_id)
      );
    • 只用一個(gè)全局OpenID表以方便集中查找用戶。(即使是你的用戶數(shù)據(jù)分布在幾個(gè)不同的庫(kù)中).
    • 規(guī)范的存儲(chǔ)OpenID的URL以便查找。(假如下次用戶登錄時(shí)輸入的OpenID有點(diǎn)不同,你也可以轉(zhuǎn)成規(guī)范的來(lái)查找). 大多數(shù)OpenID庫(kù)都有提供規(guī)范的函數(shù),簡(jiǎn)單的說(shuō),你要把缺少的http://補(bǔ)上去,把域名轉(zhuǎn)成小寫(域名后面的不要轉(zhuǎn)),之類的。例如 "WWW.AOL.COM/myOpenID" 應(yīng)該存儲(chǔ)成:"http://www.aol.com/myOpenID". URL后面多余的/也應(yīng)該去掉。
    • 如果你有專門的數(shù)據(jù)訪問(wèn)層代碼,可以加上如下的函數(shù)。注意,所有用到OpenID的地方在訪問(wèn)數(shù)據(jù)庫(kù)之前都應(yīng)該先進(jìn)行規(guī)范化處理。
      • GetUserId(openid_url)

        select user_id from user_openids where openid_url = openid_url

         

      • GetOpenIDsByUser(user_id)

        select openid_url from user_openids where user_id = user_id

         

      • AttachOpenID(openid_url, user_id)

        insert into user_openids values (openid_url, user_id)

         

      • DetachOpenID(openid_url, user_id)

        delete from user_openids where openid_url = openid_url and user_id = user_id

         

      • DetachOpenIDsByUser(user_id)

        delete from user_openids where user_id = user_id

  3. 注冊(cè)頁(yè)面添加OpenID支持
    • 在注冊(cè)頁(yè)面上添加一段方便OpenID用戶注冊(cè)??傮w來(lái)說(shuō)要達(dá)到讓使用OpenID的用戶一眼就能看出你的網(wǎng)站支持OpenID,而其他用戶仍然可以使用原來(lái)的注冊(cè)方式不受影響。可以直接在頁(yè)面上放一個(gè)OpenID輸入框或者一個(gè)鏈接指向?qū)iT的OpenID輸入頁(yè)面。
    • 要注意讓命名和風(fēng)格都符合OpenID的規(guī)范:
      • 把輸入框的ID和name屬性都設(shè)為"openid_url"
      • 添加OpenID的小logo作為輸入框的背景,CSS代碼如下:
        background: #FFFFFF url('/images/openid-icon-small.gif') no-repeat scroll 0pt 50%;
        padding-left: 18px;
    • 提供一個(gè)關(guān)于OpenID是什么以及怎么在你的網(wǎng)站上使用OpenID的簡(jiǎn)短說(shuō)明。
    • 把OpenID輸入框放在一個(gè)form里面,form的action指向你的OpenID輸入處理程序。
    • 在用戶完成OpenID驗(yàn)證重定向返回你的注冊(cè)頁(yè)面時(shí),應(yīng)該注意:第一,要顯示該用戶所用的OpenID URL,最好擺在一個(gè)OpenID的小LOGO后面以便一眼就能看出。第二,不要再讓用戶設(shè)置登錄密碼。
    • 下面是一些圖例:

  4. 登錄頁(yè)面添加OpenID支持
    • 首先也要考慮好同時(shí)照顧使用OpenID的用戶和使用傳統(tǒng)登錄方式用戶。
    • 在每一個(gè)有傳統(tǒng)登錄方式的地方都應(yīng)該加上OpenID的登錄方式。
    • 以下圖例:

  5. 創(chuàng)建OpenID登錄的處理頁(yè)面
    • 輸入的參數(shù)最基本的有兩個(gè):
      • openid_url: 用戶輸入的OpenID
      • action_type: 用戶的操作類型. 可能是login, complete, attach, list, 和 delete.
    • 完成登錄過(guò)程
      1. 由openid_url通過(guò)前面所說(shuō)的GetUserId函數(shù)查找用戶ID.
      2. 如果這個(gè)OpenID已經(jīng)綁定好某個(gè)用戶ID,先看看這個(gè)用戶ID是不是當(dāng)前已經(jīng)登錄到本網(wǎng)站。
        1. 如果這個(gè)用戶ID并未登錄就重定向到OpenID提供者那里進(jìn)行登錄驗(yàn)證。
        2. 如果這個(gè)用戶ID已經(jīng)處于登錄狀態(tài),并且這個(gè)OpenID也是他所綁定的,就無(wú)需任何操作了。
        3. 如果這個(gè)用戶ID已經(jīng)處于登錄狀態(tài),但這個(gè)OpenID不是他所綁定的,提示錯(cuò)誤信息。
      3. 如果在數(shù)據(jù)庫(kù)中沒(méi)有找到這個(gè)OpenID,引導(dǎo)用戶到注冊(cè)頁(yè)面。
      4. 把openid_url存放在session中以便用戶從OpenID提供者那里驗(yàn)證返回以后提取出來(lái)使用。如果你沒(méi)有用session的話就要用一個(gè)數(shù)據(jù)庫(kù)來(lái)保存。要放在一個(gè)用戶無(wú)法改變的地方,用cookie就不好。

        (要保存openid_url的原因是OpenID允許代理登錄。例如我用我的博客URL(http://blog.bluesky.cn)做為我的OpenID,但這個(gè)OpenID號(hào)其實(shí)是真正的OpenID號(hào)http://openid.bluesky.cn/bluesky的代理,其登錄驗(yàn)證是到OpenID提供者openid.bluesky.cn上去進(jìn)行的,如果沒(méi)有事先記錄好我的登錄的openid_url是http://blog.bluesky.cn的話,那么驗(yàn)證返回以后可能會(huì)被誤認(rèn)為是http://openid.bluesky.cn/bluesky。還好大多數(shù)OpenID庫(kù)會(huì)做好這個(gè)處理,但最好還是在你自己的session保存一個(gè)原始的openid_url。這個(gè)問(wèn)題在OpenID 2.0規(guī)范中將得到解決)
      5. 向OpenID提供者提交return_to URL以便驗(yàn)證完成以后返回接著進(jìn)行后續(xù)的登錄處理。
      6. 對(duì)于新注冊(cè)的用戶,要想好需要用戶提供哪些信息。多數(shù)OpenID提供者支持simple-registration extension, 可以提供常用的幾個(gè)注冊(cè)信息,如:full name, e-mail, nickname, gender, date of birth, gender, postal code, country, language, and time zone. 如果你需要這些信息并且用戶也愿意通過(guò)OpenID提供給你,那么你可以把它們預(yù)填寫在注冊(cè)頁(yè)面的輸入框中,省去用戶重復(fù)輸入的操作。如果你的OpenID庫(kù)不支持simple-registration 參數(shù)的話,看看能不能使用自定義的擴(kuò)展,實(shí)在不行的話把這些參數(shù)手工加到跳轉(zhuǎn)的URL中也可以。
      7. 在OpenID庫(kù)中調(diào)用 checkid_setup來(lái)生成重定向用戶到OpenID提供者頁(yè)面的URL。同時(shí)傳遞規(guī)范化的OpenID url和前面所構(gòu)建的return_to URL。還可以選擇你所需要的simple registration項(xiàng)。
      8. 重定向用戶到前面生成的OpenID驗(yàn)證的URL。最好用服務(wù)端的重定向功能而不是客戶端的。
      9. 用戶被重定向到OpenID提供者網(wǎng)站以后,如果尚未登錄的話先進(jìn)行登錄,然后用戶會(huì)被詢問(wèn)是否信任你的網(wǎng)站,如果你要求提供simple registration信息的話,用戶還可以選擇是否提供這些信息給你。當(dāng)這個(gè)步驟完成以后,OpenID提供者會(huì)重定向用戶回return_to URL,然后你就可以繼續(xù)完成后續(xù)的工作了。

        以下圖例:

    • 完成驗(yàn)證以后的后續(xù)操作:
      1. 返回的return_to URL帶有各種OpenID提供者給回的信息,將其取出。
      2. 取出session中保存的OpenID。
      3. 調(diào)用OpenID庫(kù)中的id_res來(lái)驗(yàn)證返回的信息,看用戶是否通過(guò)驗(yàn)證并提示給用戶。
      4. 可選: 在驗(yàn)證成功后,你也可以在你的網(wǎng)站給這個(gè)OpenID設(shè)置一個(gè)永久的cookie,下次這個(gè)用戶進(jìn)入網(wǎng)站的時(shí)候就可以在OpenID輸入框預(yù)先填充好這個(gè)OpenID了。如果這樣做的話,需要確保當(dāng)用戶注銷時(shí)清除掉這個(gè)cookie。
      5. GetUserId函數(shù)查詢用戶ID。如果你不能從數(shù)據(jù)庫(kù)中獲取,檢查用戶是不是這會(huì)已經(jīng)登陸了。如果是,執(zhí)行attach動(dòng)作綁定OpenID到用戶已經(jīng)存在的賬號(hào)。否則,是時(shí)候啟動(dòng)注冊(cè)進(jìn)程創(chuàng)建一個(gè)使用改OpenID的新帳戶了。保存OpenID到session,這樣賬戶創(chuàng)建的代碼將能確保這個(gè)用戶已經(jīng)驗(yàn)證過(guò)這個(gè)OpenID了。(不要使用存取請(qǐng)求過(guò)的OpenID的session變量了,因?yàn)橛脩艨梢暂斎肴魏蝺?nèi)容給那個(gè)變量)

        然后將用戶重定向到注冊(cè)流程,并填充你獲取的簡(jiǎn)單注冊(cè)信息(如果有的話),因此你需要想辦法把返回的這些注冊(cè)信息和你網(wǎng)站平常使用的注冊(cè)信息關(guān)聯(lián)起來(lái)。

        • 像上面所描述的一樣,注冊(cè)頁(yè)面應(yīng)該非常顯著地顯示OpenID,并且不要在此要求用戶為你的網(wǎng)站輸入密碼,因?yàn)樗麄円呀?jīng)使用OpenID登陸了。另外,你應(yīng)該把從OpenID提供者獲取的簡(jiǎn)單注冊(cè)信息預(yù)先填充好。你可以繼續(xù)要求額外的一些注冊(cè)信息并且保持你網(wǎng)站當(dāng)前對(duì)信息的要求,比如哪些必填,哪些可選填。(使用OpenID將加快注冊(cè)速度,但并不是要求你你改變對(duì)注冊(cè)信息的要求直至影響網(wǎng)站的正常行為)最后,你應(yīng)該提供給已經(jīng)注冊(cè)用戶綁定OpenId的鏈接。
        • 當(dāng)用戶完成注冊(cè)流程,創(chuàng)建了一個(gè)新用戶賬號(hào),將可以使用AttachOpenID函數(shù)來(lái)綁定OpenID到新賬號(hào)上了。如果你的用戶表和OpenID表分布在不同的數(shù)據(jù)庫(kù),不能同步進(jìn)行訪問(wèn),可能會(huì)導(dǎo)致綁定命令失敗,從而導(dǎo)致鼓勵(lì)賬號(hào)存在。這種情況不可能完美地組織,但也是非常罕見地,況且,用戶可以重新登陸,你大可以忽視這種情況。
      6. 如果你已被驗(yàn)證的OpenID綁定到了一個(gè)已經(jīng)存在的賬號(hào)上,通過(guò)傳統(tǒng)的方法你也可以正常地登陸網(wǎng)站。如果用戶正好用別的賬號(hào)登陸,注銷掉,以O(shè)penID綁定的賬號(hào)登陸。
    • 實(shí)現(xiàn)attach功能 (幫助已經(jīng)注冊(cè)的用戶綁定新的OpenID到賬戶上):
      1. (這個(gè)方法可以看作是complete方法的一部分,因?yàn)樗l(fā)生在用戶已經(jīng)登陸而且已經(jīng)驗(yàn)證過(guò)了一個(gè)新的OpenID,所以在調(diào)用此方法時(shí)需要確保這個(gè)用戶已經(jīng)登陸了。)
      2. 用AttachOpenID函數(shù)綁定已經(jīng)驗(yàn)證過(guò)的OpenID到登陸的用戶賬戶.
      3. 提示用戶這個(gè)OpenID已經(jīng)綁定成功,今后可以它直接登陸。接下來(lái)可以考慮調(diào)用list方法,這樣用戶就能從列表中看到這個(gè)OpenID了.

        圖例:

    • 實(shí)現(xiàn) list 功能 (用來(lái)展示用戶賬戶上綁定的所有OpenID):
      1. 需要用戶登陸.
      2. 用GetOpenIDsByUser函數(shù)獲取綁定的OpenID列表
      3. 對(duì)應(yīng)每個(gè)綁定的OpenID提供鏈接用來(lái)解除綁定,用戶點(diǎn)擊后將傳入openid_url參數(shù)執(zhí)行delete的動(dòng)作。
      4. 提供增加OpenID的輸入框或鏈接。這將把用戶帶入到登陸和綁定流程,最后將返回這個(gè)列表頁(yè)面。
      5. 如果你的網(wǎng)站已經(jīng)有一般設(shè)置頁(yè)面,你應(yīng)該提供類似“管理你的OpenID”的鏈接到列表頁(yè)面。

        圖例:

    • 實(shí)現(xiàn)刪除功能 (用來(lái)從用戶賬戶中解除一個(gè)OpenID):
      1. 需要用戶已經(jīng)登陸。
      2. 可選:檢查這個(gè)OpenID是不是用戶最后一個(gè)在你的網(wǎng)站的身份憑證。如果用戶沒(méi)有設(shè)置你網(wǎng)站的密碼而且這是他唯一綁定到他賬戶的OpenID,刪除這個(gè)OpenID將會(huì)使用戶完全脫離這個(gè)賬戶。如果沒(méi)有好的辦法是用戶能恢復(fù)他的賬號(hào),而且用戶試圖刪除這個(gè)最后的身份憑證,那么就顯示一條錯(cuò)誤信息吧——“你不能刪除你賬號(hào)上的最后一個(gè)OpenID,這樣你將沒(méi)辦法再登陸本站。你可以先綁定另一個(gè)OpenID或者創(chuàng)建在本站的密碼”。
      3. 傳遞openid_url參數(shù)給DetachOpenID函數(shù),正常的話,就可以解除對(duì)它的綁定了。如果提供的OpenID并未綁定到用戶的賬戶,你可以提示錯(cuò)誤或者無(wú)視它即可。
      4. 顯示確認(rèn)信息,表明這個(gè)OpenID已經(jīng)被解除綁定,不能在你的網(wǎng)站繼續(xù)使用。告訴用戶如果他想再次綁定這個(gè)OpenID,則需要通過(guò)正常的驗(yàn)證過(guò)程重新綁定。然后可以考慮重新定向到OpenID列表頁(yè)面,用戶就能看到列表的更新情況。

        圖例:

    • 如果要?jiǎng)h除一個(gè)用戶賬號(hào),就需要?jiǎng)h除這個(gè)賬號(hào)綁定的所有OpenID
      1. 如果你的網(wǎng)站支持用戶刪除賬戶,刪除該賬戶綁定的任何OpenID也相當(dāng)重要,因?yàn)檫@樣,這些OpenID才有機(jī)會(huì)綁定到其他賬戶上。你可以在刪除用戶賬戶的時(shí)候調(diào)用DetachOpenIDsByUser函數(shù)來(lái)實(shí)現(xiàn)這個(gè)操作。  
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
OpenID使用手冊(cè)
OAuth2.0 & OpenID Connect解析
OpenID Connect Core 1.0(四)使用授權(quán)碼流驗(yàn)證(上)
Flask 教程,第五部分:用戶登錄
PKCE
面向 Java Web 應(yīng)用程序的 OpenID
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服