`
iamsk
  • 浏览: 71971 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

GAE-oAuth-python

阅读更多

转自 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-oauth2-oidc:Google App Engine,OAuth2,OpenID Connect解决方案

    GAE是一个托管的云服务平台,提供了灵活的环境来运行Web应用,支持多种语言,如Java、Python等。 在这个项目中,可能包含以下组件: 1. 一个OAuth2认证服务器,处理授权请求,颁发令牌。 2. OpenID Connect提供者...

    gae-dropbox-python:在Google App Engine上运行Dropbox Python API

    - `gae-dropbox-python-master`目录可能包含以下内容: - `app.yaml`:配置文件,定义应用的运行环境和路由规则。 - `main.py`或`__init__.py`:应用的主要代码,实现了与Dropbox API的交互逻辑。 - `...

    gae-starter-api-python:在 App Engine 上构建并用 Python 编写的 API 以收集 2014 年莫斯科 Droidcon 的参与者

    从压缩包文件名称“gae-starter-api-python-master”来看,这很可能是项目源代码的主分支或最终版本。"master"通常是Git版本控制系统中的默认分支,代表了项目的主要或稳定版本。 在这样的项目中,我们可能会学习到...

    gae-smart-relay

    Python是gae-smart-relay项目的主要编程语言。Python以其简洁明了的语法和丰富的库而著名,适合快速开发。在这个项目中,Python可能用于编写处理HTTP请求、数据库交互、逻辑控制以及与硬件通信的代码。 3. **智能...

    demo-python-gae-gday:GDayX Santiago 2015 的示例演示,使用来自 Google App Engine、NDB DataStore、Oauth2、Webapp2 的技术

    Google App Engine 和 Python Webapp2 中的示例 此演示的目标: 学习Python webapp2。 学习 Google DataStore 作为持久性工具。 学习Google Oauth2的认证授权工具。 下载 文档 使用的库

    oauth-proxy:oauth代理

    这个"oauth-proxy"项目是为Google App Engine(GAE)设计的一个特定实现,它使用了Java编程语言。App Engine是一个由Google提供的平台,用于构建和部署web应用。开发者可以使用Java或Python等语言编写应用,并享受到...

    oauth-python

    **OAuth Python 深度解析** OAuth(开放授权)是一种开放标准,允许用户提供一个令牌,而不是用户名和密码来访问他们存储在特定服务提供者的数据。OAuth使得用户可以将自己的数据授权给第三方应用,而无需分享自己...

    play框架手册

    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的教程、工具与文档(建站)

    GAE支持多种编程语言,包括Python、Java、Go、Node.js等,提供了完整的基础设施,如数据库服务、存储系统、身份验证以及负载均衡。 在学习和使用GAE进行建站的过程中,以下几个关键知识点是必须掌握的: 1. **开发...

    google app engine 一些文档 python

    2. **Python运行环境**:GAE支持的Python版本,如2.7或3.7,以及如何使用标准库和第三方库。 3. **数据存储**:GAE的NoSQL数据存储系统称为Datastore,它提供了一个基于Bigtable的强大存储解决方案。文档会解释实体...

    Example-HowTo-CalendarAPI-GAE:有关如何使用Calendar API v3和Google App Engine的方法指南的示例源代码-How to use the source code

    在GAE项目中,你将使用`google-api-python-client`库来与Calendar API交互。使用`pip`安装这个库,然后在代码中引入相关模块: ```python from googleapiclient.discovery import build from google.oauth2....

    storage-appengine-bucket-lister-python:示例应用程序示例,说明在App Engine环境中使用Google Cloud Storage API

    首先,我们要了解Google App Engine(GAE)是一个完全托管的平台,用于构建和运行Web应用程序。它提供了自动扩展、高可用性和与其他Google服务的无缝集成,如Google Cloud Storage。 Google Cloud Storage(GCS)是...

    云端代码:利用Google.AppEngine编程.源代码

    GAE支持OAuth协议进行身份验证,可以与其他Google服务如Google Drive或Google Analytics集成。同时,App Engine提供了安全的会话管理机制,保护用户数据的安全。 6. **开发与部署** 开发者可以使用Google提供的...

    google-api:在 python 中开发可扩展的应用程序

    在Python中开发可扩展的应用程序,Google App Engine(GAE)是一个非常强大的平台。这个平台允许开发者使用Python语言构建高效、可伸缩的云应用程序,而无需关心底层基础设施的管理和维护。Google API 是与 GAE 配合...

    离线 google app engine 文档

    1. **Python 运行时环境**:GAE 支持 Python 2.7 和 3.7(或更高版本)运行时环境,允许开发者使用 Python 编写应用程序。Python 2.7 提供了标准库,而 Python 3.x 提供了更现代的语言特性和更新的库。 2. **...

    gae_clouddrive:Google App Engine (GAE) 上的 Cloud Drive 应用程序

    1. **源代码文件** - 包含使用JavaScript编写的前端代码,以及可能的Python代码,因为GAE支持Python作为后端语言。这些文件将展示如何设置GAE应用,以及如何与GCS进行交互。 2. **配置文件** - 可能有`app.yaml`,这...

    Google App Engine 帮助文档

    对于Python,GAE 支持使用 webapp2 和 Django 等框架。其他语言也有对应的推荐框架。 10. **文件系统** GAE 的文件系统是受限的,主要依赖于 Datastore 和 Blobstore 存储数据。开发者需适应这种非传统的文件操作...

    NoEnemyLG:使用 GAE 的 Android 后端客户端

    1. **Google App Engine (GAE)**:GAE 是 Google 提供的一种托管平台,支持开发人员使用 Python、Java、Go 和 PHP 等语言编写应用程序,并在 Google 的基础设施上运行。GAE 提供自动缩放、负载均衡和持久性数据存储...

    google app engine开发人员文档

    3. **身份验证和授权**: 探索Google的OAuth2.0和其他身份验证机制,理解如何保护你的应用和数据安全。 4. **性能优化**: 学习如何进行性能监控和优化,如减少读写延迟、正确使用缓存和预热请求。 5. **故障排查**:...

Global site tag (gtag.js) - Google Analytics