脚本能自动刷新API令牌吗?

wen 实用脚本 2

本文目录导读:

脚本能自动刷新API令牌吗?

  1. 常见的自动刷新策略
  2. 实际应用示例(GitHub API)
  3. 关键要点
  4. 最佳实践

是的,脚本完全可以自动刷新API令牌,这是现代API交互中的常见做法,主要通过以下几种方式实现:

常见的自动刷新策略

使用刷新令牌(Refresh Token)

import requests
import time
class TokenManager:
    def __init__(self, client_id, client_secret, refresh_token):
        self.client_id = client_id
        self.client_secret = client_secret
        self.refresh_token = refresh_token
        self.access_token = None
        self.expires_at = 0
    def get_valid_token(self):
        if time.time() >= self.expires_at:
            self.refresh_access_token()
        return self.access_token
    def refresh_access_token(self):
        response = requests.post('https://api.example.com/oauth/token', {
            'grant_type': 'refresh_token',
            'refresh_token': self.refresh_token,
            'client_id': self.client_id,
            'client_secret': self.client_secret
        })
        data = response.json()
        self.access_token = data['access_token']
        # 设置过期时间(提前5分钟刷新)
        self.expires_at = time.time() + data['expires_in'] - 300

定时刷新模式

import schedule
import threading
def refresh_token_job():
    # 刷新令牌的逻辑
    print("令牌已自动刷新")
# 每小时刷新一次
schedule.every(1).hours.do(refresh_token_job)
# 在后台运行
def run_schedule():
    while True:
        schedule.run_pending()
        time.sleep(60)
thread = threading.Thread(target=run_schedule)
thread.start()

请求拦截器模式(适用于频繁请求)

import requests
from requests.adapters import HTTPAdapter
class AutoRefreshAdapter(HTTPAdapter):
    def send(self, request, **kwargs):
        response = super().send(request, **kwargs)
        if response.status_code == 401:  # 令牌过期
            # 自动刷新令牌
            new_token = refresh_token()
            request.headers['Authorization'] = f'Bearer {new_token}'
            # 重试请求
            response = super().send(request, **kwargs)
        return response

实际应用示例(GitHub API)

import requests
import base64
import json
from datetime import datetime, timedelta
class GitHubTokenRefresher:
    def __init__(self, app_id, private_key):
        self.app_id = app_id
        self.private_key = private_key
        self.jwt_token = None
        self.installation_token = None
        self.token_expires = datetime.now()
    def get_installation_token(self):
        if datetime.now() >= self.token_expires:
            # 生成新的JWT
            jwt = self._generate_jwt()
            # 获取安装令牌
            response = requests.post(
                'https://api.github.com/app/installations/{installation_id}/access_tokens',
                headers={'Authorization': f'Bearer {jwt}'}
            )
            data = response.json()
            self.installation_token = data['token']
            # 设置过期时间(提前10分钟刷新)
            self.token_expires = datetime.now() + timedelta(seconds=data['expires_in'] - 600)
        return self.installation_token
    def make_authenticated_request(self, url):
        token = self.get_installation_token()
        response = requests.get(url, headers={'Authorization': f'Bearer {token}'})
        return response

关键要点

  1. 存储安全:敏感令牌应加密存储,避免硬编码
  2. 状态监控:记录令牌状态,避免无效请求
  3. 重试机制:失败时应有重试策略
  4. 并发处理:多线程环境下注意令牌的并发更新
  5. 提前刷新:建议在过期前几分钟就刷新,避免服务中断

最佳实践

  • 使用 装饰器模式 包装API调用函数
  • 集成主动监控,记录令牌刷新频率和成功/失败情况
  • 实现降级策略,当刷新失败时如何处理
  • 使用本地缓存记录令牌状态

这样的脚本可以显著提升API调用的稳定性和自动化程度,避免因令牌过期导致的服务中断,需要针对具体的API认证机制选择合适的实现方式。

抱歉,评论功能暂时关闭!