2on*_*one 4 python authentication api
我已经设置了对网站的 API 访问,并且可以使用他们的测试 GUI 界面使用用户名、密码和 API 密钥进行连接 (HTTP 200)。
如果我尝试下面的代码,我会收到错误响应 403:
from requests.auth import HTTPDigestAuth
url = 'https://website.com'
result = requests.get(url, auth=HTTPDigestAuth('username', 'password'))
Run Code Online (Sandbox Code Playgroud)
我认为我需要将 API 密钥包含在原始密钥中requests.get,但我不知道该怎么做。
这是一个 REST API。在网站上,我通过提供名称生成 API 密钥,然后设置 API 登录详细信息(用户名和密码)。在 HTTP 请求的信息下,列出了请求标头组件:
X-API-KEY: k API 密钥 k(从“我的帐户”获取)是我们识别和授权调用应用程序的方式
CST / 授权标识客户端的有效访问令牌。
X-SECURITY-TOKEN / ACCOUNT-ID标识客户当前帐户的有效帐户令牌或帐户 ID。
Content-Type:application/json请求格式类型。应始终将其设置为仅指定为 json
接受:application/json;charset=UTF-8响应格式类型。应始终将其设置为仅限 json 版本:
版本:v API 版本 v(如果未指定,则默认为 1)
API 密钥、用户名和密码是否可能全部包含在标头中?用户名和密码不用于设置 API 密钥。
您似乎正在使用IG Labs REST Trading API;文档指出有两种身份验证模式,具体取决于您指定的 API 版本。您引用的标头文档是所涉及的不同标头的一般概述。该部分对于实际理解该 API 的身份验证/授权如何工作并不是很有用。
同一页面上有身份验证和授权部分,这就是您需要学习的部分。这是描述两种身份验证模式的地方。还有一个单独的示例部分,解释了两种不同的模式如何与所示的具体请求和响应一起工作。
要进行身份验证,您必须首先POST向/session路由发送请求,并在标头中包含您的 API 密钥X-IG-API-KEY。这是您需要用户名和密码的地方。然后,有效的用户名/密码将为您提供用于后续请求的安全令牌。对于 API 版本 1 和 2,encryptedPassword可以包含一个附加字段来说明密码是纯文本还是加密的;您只需要这个来满足IG 新加坡登录限制,并且可以安全地省略该字段。
对于 v1 和 v2 请求,您可以在响应标头中获取这些令牌,API 版本 v3 在正文中为您提供所需的信息。令牌的生命周期有限。v1/v2 令牌的有效期为 6 小时,但在您需要再次登录之前,可以通过使用这些令牌发出请求来自动将其有效期延长至 72 小时。v3 令牌的有效期只有 60秒,但单独的令牌refresh_token允许您通过将刷新令牌发送到/session/refresh-token端点来获取新令牌。
然后,V1 / v2 请求在响应使用的标头中使用令牌/session,因此复制CST(“客户端会话令牌”)和X-SECURITY-TOKEN标头,然后您就可以开始了。
V3 请求使用标准 OAuthAuthorization标头,方法设置为Bearer. access_token只需使用结构中的值构造该标头oauthToken,并refresh_token在access_token过期时保存该标头。该文档还建议您设置IG-ACCOUNT-ID标头以标识帐户(令牌仅标识客户端)。
我强烈建议您使用requests.Session()对象来简化标头处理。
对于 API 的 v1 和 v2 版本,请使用:
import requests
url = 'https://website.com'
API_KEY = '.... your API key ....'
username = 'username'
password = 'password'
session = requests.Session()
# these are sent along for all requests
session.headers['X-IG-API-KEY'] = API_KEY
# not strictly needed, but the documentation recommends it.
session.headers['Accept'] = "application/json; charset=UTF-8"
# log in first, to get the tokens
response = session.post(
url + '/session',
json={'identifier': username, 'password': password},
headers={'VERSION': '2'},
)
response.raise_for_status() # if not a 2xx response, raise an exception
# copy across the v1/v2 tokens
session.headers['CST'] = response.headers['CST']
session.headers['X-SECURITY-TOKEN'] = response.headers['X-SECURITY-TOKEN']
Run Code Online (Sandbox Code Playgroud)
现在您已设置好session可以继续访问 API。
对于 v3,令牌位于 JSON 正文中:
session = requests.Session()
# these are sent along for all requests
session.headers['X-IG-API-KEY'] = API_KEY
# log in first, to get the tokens
response = session.post(
url + '/session',
json={'identifier': username, 'password': password},
headers={'VERSION': '3'},
)
response.raise_for_status() # if not a 2xx response, raise an exception
response_data = response.json()
oauth_tokens = response_data['oauthToken']
session.headers['Authorization'] = 'Bearer ' + oauth_tokens['access_token']
session.headers['IG-ACCOUNT-ID'] = response_data['accountId']
Run Code Online (Sandbox Code Playgroud)
现在,您已设置session为继续访问 API,直到oauth._tokens['expires_in']几秒钟过去或给出 401 响应:
if response.status == 401 and response.json()['errorCode'] == 'error.security.oauth-token-invalid':
# refresh required, old token is done.
Run Code Online (Sandbox Code Playgroud)
然后您需要使用session.post(url + '/session/refresh-token', json={'refresh_token': oauth_tokens['refresh_token']}) to get a freshoauthToken` 结构:
# refresh the access token
del session.headers['Authorization']
response = session.post(
url + '/session/refresh-token',
json={'refresh_token': oauth_tokens['refresh_token']},
headers={'VERSION': '1'},
)
response.raise_for_status() # if not a 2xx response, raise an exception
oauth_tokens = response.json()
session.headers['Authorization'] = 'Bearer ' + oauth_tokens['access_token']
Run Code Online (Sandbox Code Playgroud)
请注意,我一直VERSION在每个单独的请求中发送标头;他们的 API 使用每个端点的版本号,因此/session有 3 个版本,但/session/refresh-token只有版本 1,并且您不能设置VERSION为其他任何内容,否则会损坏。
V3/session格式可能看起来更麻烦,但该版本允许您无限期地刷新访问权限,前提是您在上次使用令牌后 10 分钟内执行此操作;无论您做什么,V1 / V2 访问令牌都会在 72 小时后过期。
| 归档时间: |
|
| 查看次数: |
41332 次 |
| 最近记录: |