65.9K
CodeProject 正在变化。 阅读更多。
Home

Python:OAuth 后获取用户信息

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (4投票s)

2013年10月21日

CPOL

4分钟阅读

viewsIcon

22399

downloadIcon

1

OAuth 后获取用户信息。

引言

使用Google API构建 Web 应用程序在很大程度上是直接的。特别是使用Google API 客户端库时!但如果你想完成一些超出 Google 提供的所有精美教程之外的事情,那就会变得更棘手了!多年来我一直是一名 C# 程序员,我注意到网上关于我可能遇到的任何(以及几乎)所有问题的示例、教程和操作指南都很多。但是对于Google APIGoogle App Engine,则不是这样。我不知道为什么会这样,明明有很多人愿意分享?

背景

我目前正在开发一个运行在Google App Engine上的 Web 应用程序,该应用程序使用Picasa Web API。用户被重定向到 OAuth 网站批准访问,然后我收到一个令牌,很简单!获取相册、图片和电影列表很容易,但获取用户信息呢?我对 Python 和Google App Engine都比较陌生,所以我浏览了很长时间,也没有找到我想要解决的任何方案!于是,在被打败之前,我在这里StackOverflow上发布了一个问题。

通常,你会很快得到同行们的回答,但这次,什么都没有!又来了……难道只有我在做这类事情吗?我不信!所以,我必须自己解决这个问题,弄得焦头烂额!

分解问题…

所以我的问题是我想要用户的个人资料信息,比如电子邮件、姓名等等。我开始阅读Picasa Web API的协议定义,在这里找到。很快我意识到我需要的东西甚至没有返回给我。所以我需要请求这些信息!

经过一番关于这个问题的谷歌搜索,我发现了一些建议,说我应该使用Google Contacts API并从我自己的联系人中获取作者字段,这不是一个漂亮的解决方案!

我去了OAuth 2.0 Playground,查看哪些 Feed 可以帮助我获取用户信息。在 Playground 的列表中,我没找到多少!其他一些服务用它们的 Feed 提供了信息,但我想要一个只返回我想要的信息的东西。所以我去了源头,Google API Explorer。我发现了一些适合我需求的 scope:

检查 Scope

所以,我去了 OAuth Playground 并尝试了它们,看看我能从中获取什么信息。

Scope:https://www.googleapis.com/auth/userinfo.email

请求 URL:https://www.googleapis.com/userinfo/v2/me

响应

{
"id": "113303504361682404626",
"email": "puh.kallsbo@gmail.com",
"verified_email": true
}

或多或少正是我想要的,我需要电子邮件来获取 gravatar。但为何止步于此。让我们看看还有什么可用的…

Scope:https://www.googleapis.com/auth/userinfo.profile

请求 URL:https://www.googleapis.com/userinfo/v2/me

响应

{
"id": "113303504361682404626",
"name": "Kristofer Källsbo",
"given_name": "Kristofer",
"family_name": "Källsbo",
"link": "https://profiles.google.com/puh.kallsbo",
"picture": "https://lh3.googleusercontent.com/
-n6hDipRgm5k/AAAAAAAAAAI/AAAAAAAAVYY/XZd9zlnMmGk/photo.jpg",
"gender": "male",
"locale": "en"
}

所以这或多或少给了我所有的用户信息,但没有电子邮件。所以将它与上面的结合起来是个好主意!

开始干活(Python)

所以,现在我知道信息在哪里了。但如何访问它以及Picasa Web API呢?所以,如果我们从这个例子开始

def GetAuthSubUrl():
next = 'http://www.example.com/welcome.pyc'
scope = 'https://picasaweb.google.com/data/'
secure = False
session = True
gd_client = gdata.photos.service.PhotosService()
return gd_client.GenerateAuthSubURL(next, scope, secure, session);

authSubUrl = GetAuthSubUrl();
print '<a href="%s">Login to your Google account</a>' % authSubUrl

所以我们需要为用户授权添加一个额外的 scope。而不是将字符串作为 scope 变量传递,我们可以像这样传递一个 `string` 列表

scope = ['https://picasaweb.google.com/data/', 
'https://www.googleapis.com/auth/userinfo.email']

这将生成一个对两个 scope 都有效的令牌!遵循关于Picasa Web API的示例,我们继续检索用户的相册列表,但然后呢?

#Setup a basic gdata client
userClient = gdata.client.GDClient()
#Create a gauth sub token object from the session token we already have in the gd_client
oauthToken = gdata.gauth.AuthSubToken(gd_client.GetAuthSubToken())
#Get the request, this userinfo is in json
response = userClient.request
('GET','https://www.googleapis.com/userinfo/v2/me', oauthToken)
#Parse the webresponse
jobj = json.loads(response.read())
#Display
self.response.write('Your email is: {0}'.format(jobj['email']))

我们启动一个 gdata 客户端并用它来检索 JSON。一行一行地,我们实际做了以下事情:

userClient = gdata.client.GDClient()

只是创建了一个 `Gdata` 客户端实例。

oauthToken = gdata.gauth.AuthSubToken(gd_client.GetAuthSubToken())

检索 Picasa Web Albums 中已用于 `gd_client` 的 OAuth 令牌。为了能够在 `Gdata` 客户端中使用它,我们必须将其作为 `AuthSubToken` 或类似类型的对象传递。

response = userClient.request
('GET','https://www.googleapis.com/userinfo/v2/me', oauthToken)

将返回一个标准的 Python httplib `HTTPResponse`,其中包含从服务器返回的数据。

jobj = json.loads(response.read())

`.read()` 函数返回 `HTTPResponse` 对象的正文,然后我们可以将其解析为 json 对象。

self.response.write('Your email is: {0}'.format(jobj['email']))

最后,我们有了用户的电子邮件,可以用来显示个人资料信息等等…

结论

并非所有关于 Google API 和Google App Engine的文档都很好。我从 8 岁就开始编程了,所以我通常能找到方法,但我意识到这并不是一个初学者可以轻易掌握的语言或领域。另一方面,所有的技术信息都在那里,比如协议规范等等。然后有一些很棒的工具可以尝试 API,比如 OAuth Playground。我希望这对某些人有所帮助,并且一个完整的演示项目可在Google Code上免费为Google App Engine下载。请参阅下面的链接。

链接

© . All rights reserved.