转自 gae group
I know the question of GAE + OAuth has come up before. In case it is
useful to anyone, here is the code I used to get access to GMail inbox
with OAuth. I use the base OAuth client classes from
http://oauth.googlecode.com/svn/code/python/
, but unlike the example
code (which uses httplib) I use urlfetch.
I use the GAE webapp framework, and I have left out the code not
directly related to OAuth:
REQUEST_TOKEN_URL = 'https://www.google.com/accounts/
OAuthGetRequestToken'
ACCESS_TOKEN_URL = 'https://www.google.com/accounts/
OAuthGetAccessToken'
AUTHORIZATION_URL = 'https://www.google.com/accounts/
OAuthAuthorizeToken'
CALLBACK_URL = 'http://<yourapp>.appspot.com/oauth/token_ready'
RESOURCE_URL = 'https://mail.google.com/mail/feed/atom'
SCOPE = 'https://mail.google.com/mail/feed/atom'
CONSUMER_KEY = <your consumer key>
CONSUMER_SECRET = '<your consumer secret>
class OAuthToken(db.Model):
user = db.UserProperty()
token_key = db.StringProperty(required=True)
token_secret = db.StringProperty(required=True)
type = db.StringProperty(required=True)
scope = db.StringProperty(required=True)
# the home page displays the nwest messages from the users inbox
# it looks for a saved access token, and if there is not one,
redirects
# to /oauth to begin the dance...
class HomePage(BaseRequestHandler):
@login_required
def get(self):
mail_feed = ''
t = OAuthToken.all()
t.filter("user =",users.GetCurrentUser())
t.filter("scope =", SCOPE)
t.filter("type =", 'access')
results = t.fetch(1)
for oauth_token in results:
if oauth_token.token_key:
key = oauth_token.token_key
mail_feed = oauth_token.token_key
secret = oauth_token.token_secret
token = oauth.OAuthToken(key,secret)
consumer = oauth.OAuthConsumer(CONSUMER_KEY,
CONSUMER_SECRET)
oauth_request =
oauth.OAuthRequest.from_consumer_and_token(consumer,
token=token,
http_url=SCOPE)
signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1
()
oauth_request.sign_request(signature_method, consumer,
token)
result = urlfetch.fetch(url=SCOPE,
method=urlfetch.GET,
headers=oauth_request.to_header
())
# I use a custom atom wrapper for displaying the feed
mail_feed = atomlib.atom03.Atom.from_text
(result.content)
if not mail_feed:
self.redirect('/oauth')
self.generate('index.html', {
'mail_feed' : mail_feed,
})
# this class (probably should not be called a "page")
# gets a request token and authorizes it
class OAuthPage(BaseRequestHandler):
def get(self):
scope = {'scope':SCOPE}
consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
oauth_request = oauth.OAuthRequest.from_consumer_and_token
(consumer,
token=None,
http_url=REQUEST_TOKEN_URL,parameters=scope)
signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
oauth_request.sign_request(signature_method, consumer, None)
url = oauth_request.to_url()
result = urlfetch.fetch(url)
if result.status_code == 200:
token = oauth.OAuthToken.from_string(result.content)
#persist token
saved_token = OAuthToken(user=users.GetCurrentUser(),
token_key = token.key,
token_secret = token.secret,
scope = SCOPE,
type = 'request',
)
saved_token.put()
#now authorize token
oauth_request = oauth.OAuthRequest.from_token_and_callback
(token=token,
callback=CALLBACK_URL,
http_url=AUTHORIZATION_URL)
url = oauth_request.to_url()
self.redirect(url)
else:
self.response.out.write('no request token')
#this class is where we exchange the request token
# for an access token
class OAuthReadyPage(BaseRequestHandler):
def get(self):
t = OAuthToken.all()
t.filter("user =",users.GetCurrentUser())
t.filter("token_key =", self.request.get('oauth_token'))
t.filter("scope =", SCOPE)
t.filter("type =", 'request')
results = t.fetch(1)
for oauth_token in results:
if oauth_token.token_key:
key = oauth_token.token_key
secret = oauth_token.token_secret
token = oauth.OAuthToken(key,secret)
#get access token
consumer = oauth.OAuthConsumer(CONSUMER_KEY,
CONSUMER_SECRET)
oauth_request = oauth.OAuthRequest.from_consumer_and_token
(consumer,
token=token,
http_url=ACCESS_TOKEN_URL)
signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1
()
oauth_request.sign_request(signature_method, consumer,
token)
url = oauth_request.to_url()
result = urlfetch.fetch(url)
if result.status_code == 200:
token = oauth.OAuthToken.from_string(result.content)
oauth_token.token_key = token.key
oauth_token.token_secret = token.secret
oauth_token.type = 'access'
oauth_token.put()
self.redirect('/')
else:
self.response.out.write(result.content)
else:
self.response.out.write('no go')
def main():
application = webapp.WSGIApplication([
('/', HomePage),
('/oauth', OAuthPage),
('/oauth/token_ready', OAuthReadyPage),
], debug=_DEBUG)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
--peter keane
分享到:
相关推荐
GAE是一个托管的云服务平台,提供了灵活的环境来运行Web应用,支持多种语言,如Java、Python等。 在这个项目中,可能包含以下组件: 1. 一个OAuth2认证服务器,处理授权请求,颁发令牌。 2. OpenID Connect提供者...
- `gae-dropbox-python-master`目录可能包含以下内容: - `app.yaml`:配置文件,定义应用的运行环境和路由规则。 - `main.py`或`__init__.py`:应用的主要代码,实现了与Dropbox API的交互逻辑。 - `...
从压缩包文件名称“gae-starter-api-python-master”来看,这很可能是项目源代码的主分支或最终版本。"master"通常是Git版本控制系统中的默认分支,代表了项目的主要或稳定版本。 在这样的项目中,我们可能会学习到...
Python是gae-smart-relay项目的主要编程语言。Python以其简洁明了的语法和丰富的库而著名,适合快速开发。在这个项目中,Python可能用于编写处理HTTP请求、数据库交互、逻辑控制以及与硬件通信的代码。 3. **智能...
Google App Engine 和 Python Webapp2 中的示例 此演示的目标: 学习Python webapp2。 学习 Google DataStore 作为持久性工具。 学习Google Oauth2的认证授权工具。 下载 文档 使用的库
这个"oauth-proxy"项目是为Google App Engine(GAE)设计的一个特定实现,它使用了Java编程语言。App Engine是一个由Google提供的平台,用于构建和部署web应用。开发者可以使用Java或Python等语言编写应用,并享受到...
**OAuth Python 深度解析** OAuth(开放授权)是一种开放标准,允许用户提供一个令牌,而不是用户名和密码来访问他们存储在特定服务提供者的数据。OAuth使得用户可以将自己的数据授权给第三方应用,而无需分享自己...
MVC应用程序模型 - 7 - app/controllers - 8 - app/models - 8 - app/views - 8 - 请求生命周期 - 8 - 标准应用程序布局layout - 9 - ...Google App Engine (GAE) - 152 - Heroku - 152 - playapps.net - 153 -
GAE支持多种编程语言,包括Python、Java、Go、Node.js等,提供了完整的基础设施,如数据库服务、存储系统、身份验证以及负载均衡。 在学习和使用GAE进行建站的过程中,以下几个关键知识点是必须掌握的: 1. **开发...
2. **Python运行环境**:GAE支持的Python版本,如2.7或3.7,以及如何使用标准库和第三方库。 3. **数据存储**:GAE的NoSQL数据存储系统称为Datastore,它提供了一个基于Bigtable的强大存储解决方案。文档会解释实体...
在GAE项目中,你将使用`google-api-python-client`库来与Calendar API交互。使用`pip`安装这个库,然后在代码中引入相关模块: ```python from googleapiclient.discovery import build from google.oauth2....
首先,我们要了解Google App Engine(GAE)是一个完全托管的平台,用于构建和运行Web应用程序。它提供了自动扩展、高可用性和与其他Google服务的无缝集成,如Google Cloud Storage。 Google Cloud Storage(GCS)是...
GAE支持OAuth协议进行身份验证,可以与其他Google服务如Google Drive或Google Analytics集成。同时,App Engine提供了安全的会话管理机制,保护用户数据的安全。 6. **开发与部署** 开发者可以使用Google提供的...
在Python中开发可扩展的应用程序,Google App Engine(GAE)是一个非常强大的平台。这个平台允许开发者使用Python语言构建高效、可伸缩的云应用程序,而无需关心底层基础设施的管理和维护。Google API 是与 GAE 配合...
1. **Python 运行时环境**:GAE 支持 Python 2.7 和 3.7(或更高版本)运行时环境,允许开发者使用 Python 编写应用程序。Python 2.7 提供了标准库,而 Python 3.x 提供了更现代的语言特性和更新的库。 2. **...
1. **源代码文件** - 包含使用JavaScript编写的前端代码,以及可能的Python代码,因为GAE支持Python作为后端语言。这些文件将展示如何设置GAE应用,以及如何与GCS进行交互。 2. **配置文件** - 可能有`app.yaml`,这...
对于Python,GAE 支持使用 webapp2 和 Django 等框架。其他语言也有对应的推荐框架。 10. **文件系统** GAE 的文件系统是受限的,主要依赖于 Datastore 和 Blobstore 存储数据。开发者需适应这种非传统的文件操作...
1. **Google App Engine (GAE)**:GAE 是 Google 提供的一种托管平台,支持开发人员使用 Python、Java、Go 和 PHP 等语言编写应用程序,并在 Google 的基础设施上运行。GAE 提供自动缩放、负载均衡和持久性数据存储...
3. **身份验证和授权**: 探索Google的OAuth2.0和其他身份验证机制,理解如何保护你的应用和数据安全。 4. **性能优化**: 学习如何进行性能监控和优化,如减少读写延迟、正确使用缓存和预热请求。 5. **故障排查**:...