Python 使用用户名、密码和 API 密钥连接到 API

2个

我已经设置了对网站的 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 登录限制,该字段可以安全地省略。/sessionX-IG-API-KEYencryptedPassword

对于 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_tokenaccess_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 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']

请注意,我一直在发送VERSION每个单独请求标头;他们的 API 使用每个端点的版本号,因此/session有 3 个版本,但/session/refresh-token只有版本 1,您不能设置VERSION任何其他内容,否则会中断。

V3/session格式可能看起来更麻烦,但该版本允许您无限期地刷新您的访问权限,前提是您在上次使用令牌后 10 分钟内刷新;无论您做什么,V1/V2 访问令牌都会在 72 小时后过期。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用HMACSHA1和密钥创建签名以连接到Kayako API

使用API密钥和机密连接到交易API(Poloniex)

使用密钥连接到R中的Rest API

如何使用用户名和密码向Azure REST API进行身份验证(无应用程序ID)

Kubernetes Java API不使用提供的用户名密码

使用基本授权时的VSTS REST API错误(用户名和密码)

为什么这个Spring Rest API强制使用用户名而不是密码

如何使用CCDT文件,用户名和密码在Python中连接到IBM MQ

使用用户名和密码访问Kubernetes API

无法使用用户名和密码获取Microsoft Graph API OAuth 2.0的access_token

sqlite连接使用用户名和密码

azure-devops-node-api:使用用户名和密码进行身份验证

如何获取Python MYSQL连接用户名和密码?

如何连接需要用户名和密码的API

使用用户名和密码进行密钥验证

Nodejs Nodemailer:使用现有代码将Sendgrid SMTP用户名和密码发送到API密钥错误:550

使用用户名和密码的Python github Pull

如何在Django Restfull API中使用用户名和ID创建存储文件夹

用用户名调用API并传递

如何获取使用jet.com API的api用户名和密码

查询Restful API传递用户名和密码

使用用户名和密码连接到openvpn

无法在 Scrapy 中使用带有用户名和密码的 API

在 PHP 中使用 Curl 访问带有用户名和密码的 API

如何使用用户名和密码连接LDAP?

给定用户名和密码,无法调用 github API

eXist-db:使用 XML:DB API 从 Java 应用程序连接时的用户名/密码

如何仅使用用户名和密码使用 python 访问 Microsoft One Drive

python paho mqtt无法使用用户名和密码连接到mqtts