设置伊芙烧瓶使用OAuth以上的Heroku

问题描述:

我有一个python API(伊芙烧瓶使用OAuth 2.0),其在本地主机成功运行。设置伊芙烧瓶使用OAuth以上的Heroku

我已经部署了该应用的Heroku和我无法访问的API资源获得令牌密钥之后,不过,我可以访问一些端点产生同样的道理。

这里有:

> curl -k -X POST -d "client_id=XXXXX&grant_type=password&username=XXX&password=YYYY" https://MYAPP.herokuapp.com/oauth/token 

和API的回应是:

> {"access_token": "VWQjYBOMTkeqPbiql8dl2T1fbBM1WH", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "Z0d1O3LUVrE1lIaYuQ3hOkZSFO9GuX", "scope": ""} 

了这里的一切是正确的,除了我可以访问一些端点生成的令牌:

> curl -k -H "Authorization: Bearer VWQjYBOMTkeqPbiql8dl2T1fbBM1WH" https://MYAPP.herokuapp.com/myendpoint 

>You have access the protected resource! 

在另一方面:

curl -k -H "Authorization: Bearer VWQjYBOMTkeqPbiql8dl2T1fbBM1WH" https://MYAPP.herokuapp.com/api_resource 


Traceback (most recent call last): 
    File "/app/.heroku/python/lib/python2.7/site-packages/eve/flaskapp.py", line 968, in __call__ 
    return super(Eve, self).__call__(environ, start_response) 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/app/.heroku/python/lib/python2.7/site-packages/eve/endpoints.py", line 54, in collections_endpoint 
    response = get(resource, lookup) 
    File "/app/.heroku/python/lib/python2.7/site-packages/eve/methods/common.py", line 242, in rate_limited 
    return f(*args, **kwargs) 
    File "/app/.heroku/python/lib/python2.7/site-packages/eve/auth.py", line 77, in decorated 
    if not auth.authorized(roles, resource_name, request.method): 
    File "/app/oauth2.py", line 45, in authorized 
    return self.check_auth(token, allowed_roles, resource, method) 
    File "/app/oauth2.py", line 33, in check_auth 
    return token and self.redis.get(token) 
    File "/app/.heroku/python/lib/python2.7/site-packages/redis/client.py", line 880, in get 
    return self.execute_command('GET', name) 
    File "/app/.heroku/python/lib/python2.7/site-packages/redis/client.py", line 578, in execute_command 
    connection.send_command(*args) 
    File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 563, in send_command 
    self.send_packed_command(self.pack_command(*args)) 
    File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 538, in send_packed_command 
    self.connect() 
    File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 442, in connect 
    raise ConnectionError(self._error_message(e)) 
ConnectionError: Error 111 connecting to localhost:6379. Connection refused. 

run.py的PICE

app = Eve(auth=BearerAuth) 
ResourceOwnerPasswordCredentials(app) 

@app.route('/myendpoint') 
@oauth.require_oauth() 
def restricted_access(): 
    return "You have access the protected resource!" 

if __name__ == '__main__': 
    host = str(os.environ.get('HOST', '0.0.0.0')) 
    app.run(host, int(os.environ.get('PORT')),debug=True) 

我在Heroku上设置Redis的,但是,这片错误:

ConnectionError: Error 111 connecting to localhost:6379. Connection refused. 

夏娃试图用我的Redis本地主机连接,我不知道为什么,这个错误将很快杀死我。

在此先感谢。

萨科

最后,我可以减轻Redis的错误和运行API时,Heroku的编辑oauth2.py:

def __init__(self): 
     super(BearerAuth, self).__init__() 
     self.redis = StrictRedis(host='XXX',port=123,password='YYY') 

代替

self.redis = StrictRedis() 

干杯。

堆栈跟踪显示连接到Redis的一个问题:

File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 442, in connect 
raise ConnectionError(self._error_message(e)) 

所以我将确保Redis的启动和您的实例在运行。另外,还要确保SENTINEL_REDIS_URL设置为正确的端口(也许Heroku上运行一个非标准的端口上的Redis?)

+0

我在settings.py以下属性: SENTINEL_REDIS_URL = 'redis的:// rediscloud:[email protected]:12864' 和相同的错误:错误111连接到本地主机:6379。拒绝连接。 它可以尝试连接到本地主机过。 –

+0

最后,我可以减轻redis的误差加法REDIS_URL变量在settings.py REDIS_URL =“redis的:// rediscloud:XXXXXXXXXXX/0,但是我有一个其他错误。 –