2016-12-20 62 views
0

我有一個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本地主機連接,我不知道爲什麼,這個錯誤將很快殺死我。

在此先感謝。

薩科

回答

1

最後,我可以減輕Redis的錯誤和運行API時,Heroku的編輯oauth2.py:

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

代替

self.redis = StrictRedis() 

乾杯。

0

堆棧跟蹤顯示連接到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,但是我有一個其他錯誤。 –