设为首页 收藏本站
查看: 337|回复: 0

[经验分享] GAE-oAuth-python

[复制链接]

尚未签到

发表于 2017-4-24 12:20:48 | 显示全部楼层 |阅读模式
  转自 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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-368657-1-1.html 上篇帖子: 守护进程(Python) 下篇帖子: 拷贝Python 对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表