【问题标题】:Passing REST API Authentication Token Working in PostMan But Not Python Requests传递 REST API 身份验证令牌在 PostMan 但不是 Python 请求中工作
【发布时间】:2021-06-16 20:37:37
【问题描述】:

我正在尝试使用 Python 请求通过 REST API 访问一些信息。我使用的 API 需要身份验证,在登录请求之后,响应将包含一个会话 ID,该 ID 应该包含在所有未来请求的标头中。 API 文档指出:

身份验证成功后,将返回带有访问令牌的 JSON 响应。这 令牌需要在所有的标题中设置 成功处理它们的后续请求。 API 客户端应该添加一个 HTTP 名称为“blabla_session_id”的标头,与 Web 应用程序中的 cookie 名称相同

我能够成功发送登录请求并接收带有会话 ID 的响应,但是我在使用 Python 请求将会话 ID 添加到标头时遇到了问题。我正在使用以下代码:

# Functions

def login(base_url, username, password):
    print("Getting token...")
    header = {'content-type':'application/json'}

    data_get = {'email': username,
                'password':password,
                'workspaceId':12345678} 

    r = requests.post(base_url+'login', headers=header, json=data_get)

    if r.ok:
        print("Login Success!")
        global session_id   
        session_id = r.cookies['blabla_session_id']
        print("Session ID is %s" %session_id)

    else:
        print("Login Fail...")
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))

def logout():
    header = {'blabla_session_id':session_id,'content-type':'application/json'}
    print (header)

    r = requests.put(base_url+'logout', headers=header)
    print (r.request.headers)

    if r.ok:
        print("Logout Success")
    else:
        print("Logout Failed")
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))

def main():
    login(base_url, api_login, api_password)
    logout()

# Main Program
main()

执行此操作时,我得到以下响应:

Getting token...
Login Success!
Session ID is LABS-FReGnWuzzj7oYQ4nzPdvB55rOpctU48s%7C
{'blabla_session_id': 'LABS-FReGnWuzzj7oYQ4nzPdvB55rOpctU48s%7C', 'content-type': 'application/json'}
{'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'blabla_session_id': 'LABS-FReGnWuzzj7oYQ4nzPdvB55rOpctU48s%7C', 'content-type': 'application/json', 'Content-Length': '0'}
Logout Failed
HTTP 401 - , Message {"status":401,"errors":[{"code":401,"message":"There is no access token associated with this request or the access token is not valid."}]}

Command Line Response

任何想法我哪里出错了?正如标题所暗示的,我确实尝试使用 PostMan 来验证 API,并且我能够登录、将会话 ID 添加到标题中并没有问题地注销。我怀疑这与标题的格式有关,但我不确定。

【问题讨论】:

  • 很惊讶您没有使用请求会话;通过使用单个会话进行登录和后续请求,您不必为复制 cookie 而烦恼。
  • 谢谢!我确实在请求文档中看到了这个功能并同意,它肯定会让我不必将会话 ID 添加到每个请求的标头中,但我希望在更改之前使用当前方法至少成功传递一次会话 ID方法。

标签: python rest python-requests


【解决方案1】:

转为使用单个请求 session,这将在您的所有 http 操作中传播特别是 cookie,确保成功的身份验证传递到所有请求中。

例如:

import requests

def login(s,base_url, username, password):
    print("Getting token...")
    header = {'content-type':'application/json'}

    data_get = {'email': username,
                'password':password,
                'workspaceId':12345678} 

    r = s.post(base_url+'login', headers=header, json=data_get)

    if r.ok:
        print("Login Success!")
        global session_id   
        session_id = r.cookies['blabla_session_id']
        print("Session ID is %s" %session_id)

    else:
        print("Login Fail...")
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))

def logout(s):
    header = {'blabla_session_id':session_id,'content-type':'application/json'}
    print (header)

    r = s.put(base_url+'logout', headers=header)
    print (r.request.headers)

    if r.ok:
        print("Logout Success")
    else:
        print("Logout Failed")
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))

def main():
    s = requests.session()
    login(s,base_url, api_login, api_password)
    logout(s)

# Main Program
main()

【讨论】:

  • 谢谢,不幸的是,这与不使用会话一样失败。
  • 我明白了!使用会话来管理 cookie 确实有效,只要我根本不将会话 ID 添加到标题中。感谢您的帮助!
  • 没错。如果我回答了您的问题,希望您能接受并支持我的回答。
猜你喜欢
  • 1970-01-01
  • 2018-01-03
  • 2020-09-12
  • 1970-01-01
  • 2021-12-06
  • 2018-03-08
  • 2019-05-18
  • 1970-01-01
  • 2016-08-10
相关资源
最近更新 更多