You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无头服务器上无需重定向用户刷新Upwork API的Refresh Token?

解决Upwork无头服务器应用的Token自动续期问题

方案一:优化OAuth2流程,自动续期Refresh Token

Upwork的OAuth2机制中,使用Refresh Token获取新Access Token时,会同步返回新的Refresh Token,其有效期会重新计算为两周。只要每次刷新时保存新的Refresh Token,就能实现无限续期,无需手动干预。

实现步骤

  • 持久化存储Token:首次获取Token后,将access_token、refresh_token、expires_at(当前时间+expires_in)保存到文件或数据库中。
  • 定时刷新Token:在Access Token过期前(比如提前1小时),调用刷新接口获取新的Token对,更新存储的内容。
  • 启动时加载Token:应用启动时优先加载已存储的Token,无需重新走授权流程。

代码示例

import upwork
import json
import time
from datetime import datetime, timedelta

# 存储Token的文件路径
TOKEN_FILE = "upwork_tokens.json"

def load_tokens():
    try:
        with open(TOKEN_FILE, "r") as f:
            data = json.load(f)
            # 检查Token是否即将过期
            if datetime.now() >= datetime.fromisoformat(data["expires_at"]):
                return None
            return data
    except (FileNotFoundError, KeyError):
        return None

def save_tokens(token_data):
    # 计算过期时间并存储
    expires_at = datetime.now() + timedelta(seconds=token_data["expires_in"])
    token_data["expires_at"] = expires_at.isoformat()
    with open(TOKEN_FILE, "w") as f:
        json.dump(token_data, f)

# 初始化配置
config = upwork.Config(
    {
        "client_id": "<my_client_id>",
        "client_secret": "<my_client_secret>",
        "redirect_uri": "<my_redirect_uri>"
    }
)

client = upwork.Client(config)

# 加载已存储的Token
saved_tokens = load_tokens()
if saved_tokens:
    config.token = saved_tokens
else:
    # 首次授权流程(仅需执行一次,之后无需手动干预)
    authorization_url, state = client.get_authorization_url()
    authz_code = input(
        "Please enter the full callback URL you get "
        "following this link:\n{0}\n\n> ".format(authorization_url)
    )
    token = client.get_access_token(authz_code)
    save_tokens(token)

# 定时刷新Token的函数
def refresh_token_periodically():
    while True:
        saved_tokens = load_tokens()
        if not saved_tokens:
            break
        # 计算下次刷新时间(过期前1小时)
        expires_at = datetime.fromisoformat(saved_tokens["expires_at"])
        next_refresh = expires_at - timedelta(hours=1)
        wait_time = (next_refresh - datetime.now()).total_seconds()
        if wait_time > 0:
            time.sleep(wait_time)
        # 刷新Token
        new_token = client.refresh_access_token(saved_tokens["refresh_token"])
        save_tokens(new_token)
        print("Token refreshed successfully at", datetime.now())

# 启动定时刷新线程(或用cron等定时任务工具)
import threading
refresh_thread = threading.Thread(target=refresh_token_periodically, daemon=True)
refresh_thread.start()

# 后续业务逻辑...

方案二:切换到API密钥认证模式(更适合无头服务器)

如果你的应用是服务端级别的(无需用户个人授权,仅操作团队/公司资源),可以使用Upwork的API密钥认证,完全跳过OAuth2的授权和Token刷新流程。

实现步骤

  1. 在Upwork开发者控制台创建API密钥(需账号具备管理员权限)。
  2. 使用API密钥初始化客户端,直接调用API。

代码示例

import upwork

# 使用API密钥初始化配置
config = upwork.Config(
    {
        "client_id": "<your_api_key>",
        "client_secret": "<your_api_secret>",
        "grant_type": "client_credentials"
    }
)

client = upwork.Client(config)

# 直接调用API,无需Token处理
# 示例:获取用户信息
response = client.get("/api/v3/auth/info")
print(response)

注意:API密钥模式仅适用于访问团队/公司级别的公共资源,若需访问用户个人资源,仍需使用OAuth2流程。

内容的提问来源于stack exchange,提问作者sviddo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:21:07