后端应用程序流

时间:2017-07-25 14:28:36

标签: python api oauth-2.0 access-token

我正在尝试实现Backend Application流程以从Datahug API获取访问令牌(按照https://api.datahug.com/#gettingstarted中的说明进行操作。)

from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session

def get_access_token():
    token_url = 'https://apps.datahug.com/identity/connect/token'
    client_id = CLIENT_ID
    client_secret = CLIENT_SECRET
    scope = 'datahug_api'

    client = BackendApplicationClient(client_id=client_id)
    client.prepare_request_body(scope=[scope])
    oauth = OAuth2Session(client=client)
    token = oauth.fetch_token(token_url=token_url,
            client_id=client_id,
            client_secret=client_secret)

    return token

if __name__ == '__main__':
    token = get_access_token()
    print(token)

运行此代码时,我收到InvalidScopeError,即

user:dh user$ python so_test.py
Traceback (most recent call last):
  File "so_test.py", line 21, in <module>
    token = get_access_token()
  File "so_test.py", line 17, in get_access_token
    client_secret=client_secret)
  File "/Users/user/anaconda3/lib/python3.5/site-packages/requests_oauthlib/oauth2_session.py", line 244, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/Users/user/anaconda3/lib/python3.5/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 409, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/Users/user/anaconda3/lib/python3.5/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 376, in parse_token_response
    validate_token_parameters(params)
  File "/Users/user/anaconda3/lib/python3.5/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 383, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "/Users/user/anaconda3/lib/python3.5/site-packages/oauthlib/oauth2/rfc6749/errors.py", line 325, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidScopeError: (invalid_scope) 

问题似乎是值scope='datahug_api',但这是datahug api中建议的值。关于如何解决这个问题的任何建议都很受欢迎。

1 个答案:

答案 0 :(得分:0)

您缺少 oauth.fetch_token()中的作用域。
因此,您的可变令牌应为:

token = oauth.fetch_token(token_url=token_url,scope=scope,client_id=client_id,
                          client_secret=client_secret)