我有一个使用 GAE 用户服务和联合登录的应用程序。
最近,对于一位用户,我在昵称属性中获得了一个 xml 提要。
对于所有其他字段,数据正常
详细说明:
我的注册处理程序:
class RegisterPersonHandler(UserPageHandler):
def get(self):
user = users.get_current_user()
if not user:
self.redirect(users.create_login_url(self.request.uri), abort=True)
return
person = Person.get_or_insert(user.user_id())
if not self._register(person, user):
logging.warning('Warning registration failed')
return
self.redirect("/")
def post(self):
self.view("No reason to be here Mr Jiggles ;-)")
return
@ndb.transactional()
def _register(self, person, user):
''' Registration process happens here
'''
# check if the person has info and if not create it
info = PersonInfo.query(ancestor=person.key).get()
if not info:
info = PersonInfo(id=user.user_id(), parent=person.key)
info.nick_name = user.nickname()
info.email = user.email()
info.put()
return True
在昵称字段中,我得到以下字符串:
https://www.google.com/accounts/o8/id?id=[id_of_the_user]
在我的浏览器中打开该 url 可以让我下载一个包含以下内容的xml :
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud</URI>
</Service>
<Service priority="10">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud?source=mail</URI>
</Service>
<Service priority="10">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud?source=gmail.com</URI>
</Service>
<Service priority="10">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud?source=googlemail.com</URI>
</Service>
<Service priority="10">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud?source=profiles</URI>
</Service>
</XRD>
</xrds:XRDS>
我错过了什么?
编辑
因为这无济于事,我至少想知道:
我可以信任昵称属性来为用户返回一个带有可用昵称的字符串吗?我已经发现如果你想将这个属性暴露给公共数据,这个属性会带来风险,因为大多数情况下都是“用户名”或电子邮件地址......
顺便提一句
从文档
nickname() 返回用户的“昵称”,一个可显示的名字。对于 Google 帐户用户,昵称可以是用户电子邮件地址的“名称”部分(如果地址与应用程序位于同一域中),否则就是用户的完整电子邮件地址。对于 OpenID 用户,昵称是 OpenID 标识符。
稍后_
email() 返回用户的电子邮件地址。如果您使用 OpenID,则不应依赖此电子邮件地址是正确的。应用程序应该为可显示的名称使用昵称。