Pie*_*lus 6 python google-app-engine oauth google-oauth
使用OAuth 2.0和Python时,我希望拥有用户ID或电子邮件来存储/检索OAuth访问令牌,因为即使用户离开后我也想修改日历.
有太多的文档,其中一半被弃用(OAuth 1.0),我无法弄清楚这一点.
我有以下代码:
import webapp2
import os
from apiclient.discovery import build
from oauth2client.appengine import OAuth2DecoratorFromClientSecrets
from google.appengine.api import oauth
user_scope = 'https://www.googleapis.com/auth/userinfo.profile'
decorator = OAuth2DecoratorFromClientSecrets(
os.path.join(os.path.dirname(__file__), 'client_secrets.json'),
scope=('https://www.googleapis.com/auth/calendar', user_scope)
)
service = build('calendar', 'v3')
class MainHandler(webapp2.RequestHandler):
@decorator.oauth_required
def get(self):
self.response.write('Hello world!')
user = oauth.get_current_user(user_scope)
if user:
self.response.write('%s\n' % user)
self.response.write('- email = %s\n' % user.email())
self.response.write('- nickname = %s\n' % user.nickname())
self.response.write('- user_id = %s\n' % user.user_id())
else:
self.response.write('No user found...')
app = webapp2.WSGIApplication([
('/', MainHandler),
(decorator.callback_path, decorator.callback_handler())
], debug=True)
Run Code Online (Sandbox Code Playgroud)
这在测试环境中本地工作,但是当我部署它并在线运行时,我收到以下错误:
Traceback (most recent call last):
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__
rv = self.handle_exception(request, response, e)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
rv = self.router.dispatch(request, response)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~myapp/oauth2client/appengine.py", line 714, in check_oauth
resp = method(request_handler, *args, **kwargs)
File "/base/data/home/apps/s~myapp/main.py", line 29, in get
user = oauth.get_current_user('https://www.googleapis.com/auth/userinfo.profile')
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/oauth/oauth_api.py", line 100, in get_current_user
_maybe_call_get_oauth_user(_scope)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/oauth/oauth_api.py", line 231, in _maybe_call_get_oauth_user
_maybe_raise_exception()
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/oauth/oauth_api.py", line 246, in _maybe_raise_exception
raise NotAllowedError(error_detail)
NotAllowedError
Run Code Online (Sandbox Code Playgroud)
我错过了什么导致此错误?
我刚刚得到了类似的东西。一旦您让用户使用 OAuth,您需要存储当前的用户 ID。如果您使用任务队列,您可以通过数据存储或作为参数来执行此操作
from google.appengine.api import users
ClientID = users.get_current_user().user_id()
然后使用您稍后需要运行 OAuth 令牌的任何代码。
from oauth2client.appengine import CredentialsModel
from oauth2client.appengine import StorageByKeyName
credentials = StorageByKeyName(CredentialsModel, ClientID, 'credentials').get()
cal = build('calendar', 'v3',http = credentials.authorize(httplib2.Http()))
Run Code Online (Sandbox Code Playgroud)
然后使用 cal 进行 API 调用。
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |