如何命中经过 PingIdentity 身份验证的 API;通过 python?
How to hit a API which is PingIdentity authenticated; via python?
我有这个 API,像这样:
https://baseurl.com/endpoint
它是一个 GET API 并且具有 PingIdentity 的 OIDC + Auth2.0 身份验证和授权(在 KONG API GATEWAY 级别启用)机制。我第一次通过浏览器点击 API 时,它会将我重定向到 sign-in 页面,成功 sign-in 后,成功触发 API 并向我显示输出 JSON 在浏览器上。在接下来的 1 小时里,每当我再次点击 API 时,它都不会再次要求 sign-in。之后,我又要登录一次。
现在,我需要通过Python点击这个API。问题是,作为响应,它给出了 HTML 输出,这基本上是浏览器将我重定向到的那个 sign-in 页面。
这是我尝试过的:
我在python中使用FastAPI写了这个API,当我在浏览器上请求它时,我在Fast[=40=中记录了它的headers ] 通过 request.headers
。这是 headers 包含的内容:
'host':
'keep-alive':
'connection':
'x-forwarded-for':
'x-forwarded-proto':
'x-forwarded-host':
'x-forwarded-port':
'x-forwarded-path':
'x-forwarded-prefix':
'x-real-ip':
'cache-control':
'sec-ch-ua':
'sec-ch-ua-mobile':
'sec-ch-ua-platform':
'upgrade-insecure-requests':
'user-agent':
'accept':
'sec-fetch-site':
'sec-fetch-mode':
'sec-fetch-user':
'sec-fetch-dest':
'referer':
'accept-encoding':
'accept-language':
'cookie': {contained my organization specific data, which I am sure are not essential}
'username':
'client_id':
'oidc-access-token': {it is a JWT token, which I have confirmed with my teammates, is the access token from PingIdentity}
但是,当我设置这些相同的 headers 时使用 Python 请求库命中相同的 API,它再次返回我 HTML sign-in 页面并没有给我结果!我还尝试从浏览器的调试器工具中的网络选项卡复制 headers,并在 python 中的请求中设置相同的参数,但仍然没有任何效果!
这是我在 python 中点击 API 的方式:
import requests
hit_my_api = requests.get("https://baseurl.com/endpoint", headers={<The ones I mentioned above>})
如何解决这个问题?
您应该在 headers 中添加 JWT 令牌,如下所示(参见 here):
hit_my_api = requests.get("https://baseurl.com/endpoint", headers={'Authorization': 'access_token myToken'})
编辑: 如果以上方法不起作用,试试这个:
hit_my_api = requests.get("https://baseurl.com/endpoint", headers={ 'Authorization': 'Bearer <your_token>' })
我有这个 API,像这样:
https://baseurl.com/endpoint
它是一个 GET API 并且具有 PingIdentity 的 OIDC + Auth2.0 身份验证和授权(在 KONG API GATEWAY 级别启用)机制。我第一次通过浏览器点击 API 时,它会将我重定向到 sign-in 页面,成功 sign-in 后,成功触发 API 并向我显示输出 JSON 在浏览器上。在接下来的 1 小时里,每当我再次点击 API 时,它都不会再次要求 sign-in。之后,我又要登录一次。
现在,我需要通过Python点击这个API。问题是,作为响应,它给出了 HTML 输出,这基本上是浏览器将我重定向到的那个 sign-in 页面。 这是我尝试过的:
我在python中使用FastAPI写了这个API,当我在浏览器上请求它时,我在Fast[=40=中记录了它的headers ] 通过 request.headers
。这是 headers 包含的内容:
'host':
'keep-alive':
'connection':
'x-forwarded-for':
'x-forwarded-proto':
'x-forwarded-host':
'x-forwarded-port':
'x-forwarded-path':
'x-forwarded-prefix':
'x-real-ip':
'cache-control':
'sec-ch-ua':
'sec-ch-ua-mobile':
'sec-ch-ua-platform':
'upgrade-insecure-requests':
'user-agent':
'accept':
'sec-fetch-site':
'sec-fetch-mode':
'sec-fetch-user':
'sec-fetch-dest':
'referer':
'accept-encoding':
'accept-language':
'cookie': {contained my organization specific data, which I am sure are not essential}
'username':
'client_id':
'oidc-access-token': {it is a JWT token, which I have confirmed with my teammates, is the access token from PingIdentity}
但是,当我设置这些相同的 headers 时使用 Python 请求库命中相同的 API,它再次返回我 HTML sign-in 页面并没有给我结果!我还尝试从浏览器的调试器工具中的网络选项卡复制 headers,并在 python 中的请求中设置相同的参数,但仍然没有任何效果! 这是我在 python 中点击 API 的方式:
import requests
hit_my_api = requests.get("https://baseurl.com/endpoint", headers={<The ones I mentioned above>})
如何解决这个问题?
您应该在 headers 中添加 JWT 令牌,如下所示(参见 here):
hit_my_api = requests.get("https://baseurl.com/endpoint", headers={'Authorization': 'access_token myToken'})
编辑: 如果以上方法不起作用,试试这个:
hit_my_api = requests.get("https://baseurl.com/endpoint", headers={ 'Authorization': 'Bearer <your_token>' })