截至2012年,似乎Google OpenID endpoint支持通過屬性交換協議的姓氏和名字檢索。下面是使用Pyramid Web框架和Janrain的python-openid包一些示例Python代碼。羅伊回答
from openid.consumer import consumer
from openid.extensions.ax import AttrInfo, FetchRequest, FetchResponse
from openid.store.filestore import FileOpenIDStore
from openid.store.sqlstore import PostgreSQLStore, MySQLStore, SQLiteStore
AX_FIRSTNAME = 'http://axschema.org/namePerson/first'
AX_LASTNAME = 'http://axschema.org/namePerson/last'
AX_EMAIL = 'http://axschema.org/contact/email'
@view_config(route_name='openID_start', permission=NO_PERMISSION_REQUIRED)
def start(request):
'Start openID authentication process'
params = request.params
openIDURL = params.get('openIDURL')
if not openIDURL:
return HTTPResponse('Parameter expected: openIDURL')
openIDConsumer = get_consumer(request)
try:
openIDRequest = openIDConsumer.begin(openIDURL)
except consumer.DiscoveryFailure, error:
return HTTPResponse('Discovery failed: %s' % escape(error))
else:
if not openIDRequest:
return HTTPResponse('Not an openID provider: %s' % escape(openIDURL))
axRequest = FetchRequest()
axRequest.add(AttrInfo(AX_FIRSTNAME, required=True))
axRequest.add(AttrInfo(AX_LASTNAME, required=True))
axRequest.add(AttrInfo(AX_EMAIL, required=True))
openIDRequest.addExtension(axRequest)
sourceURL = request.host_url
targetURL = request.route_url('openID_finish')
if openIDRequest.shouldSendRedirect():
return HTTPFound(location=openIDRequest.redirectURL(sourceURL, targetURL))
return HTTPResponse(openIDRequest.htmlMarkup(sourceURL, targetURL))
@view_config(route_name='openID_finish', permission=NO_PERMISSION_REQUIRED)
def finish(request):
'Finish openID authentication process'
openIDConsumer = get_consumer(request)
targetURL = request.route_url('openID_finish')
openIDResponse = openIDConsumer.complete(request.params, targetURL)
html = openIDResponse.status + '<br>'
for key, value in openIDResponse.__dict__.iteritems():
html += '%s: %s<br>' % (escape(key), escape(value))
html += '<br>'
if consumer.SUCCESS == openIDResponse.status:
axResponse = FetchResponse.fromSuccessResponse(openIDResponse)
html += 'First name: %s<br>' % escape(axResponse.get(AX_FIRSTNAME))
html += 'Last name: %s<br>' % escape(axResponse.get(AX_LASTNAME))
html += 'Email: %s<br>' % escape(axResponse.get(AX_EMAIL))
return HTTPResponse(html)
def get_consumer(request):
try:
openIDStore = {
'sqlite': SQLiteStore,
'postgresql': PostgreSQLStore,
'mysql': MySQLStore,
}[db.bind.name](db.bind.raw_connection())
except KeyError:
openIDStore = FileOpenIDStore('data/openIDs')
try:
openIDStore.createTables()
except:
pass
return consumer.Consumer(request.session, openIDStore)
感謝您解決這個問題。我想用默認的友好標識符作爲用戶的電子郵件可以工作。你會碰巧知道哪些其他服務在友好名稱方面表現不佳? – MunkiPhD 2009-08-31 00:58:23
雅虎是我所知道的唯一另一個,有時它只有這種行爲。 – 2009-08-31 04:02:31
安德魯,我設法讓你的博客文章更深入,並發現與雅虎有關的文章。我必須再次閱讀才能完全理解它 - 但在我未知的試驗中,我甚至無法從雅虎收到一封電子郵件地址,當我使用雅虎登錄信息進行電子郵件轉寄時,這使我感到困惑 - 而且我的信息清楚地轉移了過來。 – MunkiPhD 2009-08-31 16:00:51