如何在无头服务器上无需重定向用户刷新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刷新流程。
实现步骤
- 在Upwork开发者控制台创建API密钥(需账号具备管理员权限)。
- 使用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
相关产品推荐
相关产品推荐

