2010-03-11 37 views

回答

17

sreg被寫爲最簡單的事情,可能可能工作,並有一個非常有限的可用字段集。但是,因爲這包括nicknameemailfullname,這通常是您所需要的。

屬性交換是更具擴展性和功能,雖然我懷疑在實踐中功能像update_url和存儲請求尚未廣泛實施。

至於知道要請求:理論上,在發現階段可用的XRDS文檔中記錄了提供程序支持哪些擴展,如規範的Extensions部分中所述。如果您使用python-openid(或者在支持OpenID其他圖書館之一),你可以通過一些查詢,像

auth_req = consumer.begin('http://example.com/joe') 

from openid.extensions import sreg 

if sreg.supportsSreg(auth_req.endpoint): 
    sreg_request = sreg.SRegRequest(required=['nickname','email']) 
    auth_req.addExtension(sreg_request) 
else: 
    # maybe AX, maybe something else... 

不幸的是,OpenID標識符代表團讓那個漂亮的不可靠。用戶可能正在使用基於HTML的發現方法,該方法完全不通告擴展,可能具有不包含與提供程序相同的擴展信息的XRDS,或者曾經準確但現在不在的XRDS的日期。另外,即使你確實得到了一個宣傳AX擴展的XRDS,據我所知它並不告訴你提供者支持哪些屬性(即哪個AX模式)。

最實際的方法可能是要求大量的東西,如果你得到一些東西回來,你可以使用它。

+0

我是否需要每次OpenID身份驗證的擴展名,或者是否應該停止詢問我是否已經知道OpenID(可能只是'google.com')... – joeforker 2010-03-12 14:58:09

+0

@joeforker,發現響應可能會被緩存,因爲它們不會非常頻繁地改變,減少了OP請求的數量和解析開銷。請參閱http://stackoverflow.com/questions/2799638/should-i-cache-the-xrds-file-returned-in-openid – rajeshnair 2011-02-16 19:53:54