如何序列化 OAuth1Session?

How to serialize an OAuth1Session?

我目前有一个单一的 Python 脚本,它执行 OAuth 身份验证,返回 OAuth1Session,然后使用该 OAuth1Session 继续执行一些业务逻辑以获得对第三方服务。

我需要将它分成两个单独的脚本,一个执行 OAuth 身份验证并将 运行 在一台机器上,另一个将 运行 在远程机器上执行针对第三方服务授权的业务逻辑。

如何序列化 OAuth1Session 对象,以便可以将经过身份验证的令牌从机器 A 上的 身份验证脚本 无缝传递到 在机器上处理脚本 B?

我尝试了显而易见的方法:

print(json.dumps(session))

但是我得到了这个错误:

TypeError: Object of type OAuth1Session is not JSON serializable

这个简单的需求有规范的解决方案吗?

更新

这是完整的源代码。请注意这不是我的代码,我是从作者那里下载的,现在我正在尝试修改它以使其工作方式有所不同。

"""This Python script provides examples on using the E*TRADE API endpoints"""
from __future__ import print_function
import webbrowser
import json
import logging
import configparser
import sys
import requests
from rauth import OAuth1Service

def oauth():
    """Allows user authorization for the sample application with OAuth 1"""
    etrade = OAuth1Service(
        name="etrade",
        consumer_key=config["DEFAULT"]["CONSUMER_KEY"],
        consumer_secret=config["DEFAULT"]["CONSUMER_SECRET"],
        request_token_url="https://api.etrade.com/oauth/request_token",
        access_token_url="https://api.etrade.com/oauth/access_token",
        authorize_url="https://us.etrade.com/e/t/etws/authorize?key={}&token={}",
        base_url="https://api.etrade.com")

    base_url = config["DEFAULT"]["PROD_BASE_URL"]

    # Step 1: Get OAuth 1 request token and secret
    request_token, request_token_secret = etrade.get_request_token(
        params={"oauth_callback": "oob", "format": "json"})

    # Step 2: Go through the authentication flow. Login to E*TRADE.
    # After you login, the page will provide a text code to enter.
    authorize_url = etrade.authorize_url.format(etrade.consumer_key, request_token)
    webbrowser.open(authorize_url)
    text_code = input("Please accept agreement and enter text code from browser: ")

    # Step 3: Exchange the authorized request token for an authenticated OAuth 1 session
    session = etrade.get_auth_session(request_token,
                                  request_token_secret,
                                  params={"oauth_verifier": text_code})

    return(session, base_url)


# loading configuration file
config = configparser.ConfigParser()
config.read(sys.argv[1])
(session, base_url) = oauth()

print(base_url)
print(json.dumps(session))

#original code
#market = Market(session, base_url)
#quotes = market.quotes(sys.argv[2])

请注意最后两行注释掉的行。那是原始代码:在执行 oauth 之后,代码立即调用一些业务功能。我想将其分解为两个单独的脚本 运行ning 作为隔离进程:脚本 1 执行 oauth 并保留会话,脚本 2 从文件中读取会话并执行业务功能。

不幸的是它在最后一行失败了,print(json.dumps(session))

"XY Problem" 警报

我的目标是将脚本分成两部分,以便业务逻辑可以 运行 在与身份验证代码不同的机器中。我相信这样做的方法是序列化 session 对象,然后在第二个脚本中将其解析回来。使用 json.dumps() 打印会话是 中间步骤,'Y',在我解决 问题 'X'[=59] 的过程中=].如果您能想到更好的方法来实现目标,那可能是一个有效的答案。

来自此处源代码中可用的注释:https://github.com/litl/rauth/blob/a6d887d7737cf21ec896a8104f25c2754c694011/rauth/session.py

你只需要序列化你的对象的一些属性来重新实例化它:

    Line 103
    def __init__(self,
                     consumer_key,
                     consumer_secret,
                     access_token=None,
                     access_token_secret=None,
                     signature=None,
                     service=None):
     ...

因此我建议在第一台机器上序列化以下字典:

info_to_serialize = {
    'consumer_key': session.consumer_key,
    'consumer_secret': session.consumer_secret,
    'access_token': session.access_token,
    'access_token_secret': session.access_token_secret
}
serialized_data = json.dumps(info_to_serialize)

然后在第二台机器上重新实例化您的会话:

from rauth.session import OAuth1Session

info_deserialized = json.loads(serialized_data)
session = OAuth1Session(**info_deserialized)

希望对您有所帮助