我已经设置了对网站的 API 访问,并且可以使用他们的测试 GUI 界面使用用户名、密码和 API 密钥进行连接(HTTP 200)。
如果我尝试下面的代码,我会收到错误响应 403:
from requests.auth import HTTPDigestAuth
url = 'https://website.com'
result = requests.get(url, auth=HTTPDigestAuth('username', 'password'))
我想我需要在原始文件中包含 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
接受:申请/json;charset=UTF-8响应格式类型。这应始终按照指示设置为仅 json 版本:
版本:v API 版本 v(如果未指定,则默认为 1)
是否有可能 API 密钥、用户名和密码都包含在标头中?用户名和密码不用于设置 API 密钥。
您似乎在使用IG Labs REST Trading API;文档说明有两种身份验证模式,具体取决于您指定的 API 版本。您引用的标题文档是所涉及的不同标题的一般概述。该部分对于实际了解该 API 的身份验证/授权如何工作并不是很有用。
在同一页上是一个身份验证和授权部分,它是这一节,你需要学习。这是描述两种身份验证模式的地方。还有一个单独的示例部分解释了两种不同的模式如何处理显示的具体请求和响应。
要进行身份验证,您必须首先向route发送POST
请求,并在标头中包含您的 API 密钥。这是您需要用户名和密码的地方。有效的用户名/密码为您提供安全令牌以用于后续请求。对于 API 版本 1 和 2,可以包含一个附加字段来说明密码是纯文本还是加密;你只需要这个来满足IG Singapore 登录限制,该字段可以安全地省略。/session
X-IG-API-KEY
encryptedPassword
对于 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
过期时保存for 。该文档还建议您设置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']
现在您已设置好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']
现在您已设置为使用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.
然后您需要使用session.post(url + '/session/refresh-token', json={'refresh_token': oauth_tokens['refresh_token']}) to get a fresh
oauthToken` 结构:
# 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']
请注意,我一直在发送VERSION
每个单独请求的标头;他们的 API 使用每个端点的版本号,因此/session
有 3 个版本,但/session/refresh-token
只有版本 1,您不能设置VERSION
任何其他内容,否则会中断。
V3/session
格式可能看起来更麻烦,但该版本允许您无限期地刷新您的访问权限,前提是您在上次使用令牌后 10 分钟内刷新;无论您做什么,V1/V2 访问令牌都会在 72 小时后过期。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句