Cursor长效Token获取核心技术解析

161 阅读5分钟

Cursor长效Token获取核心技术解析

深入剖析从Cursor登录Cookie到长效Token的完整技术流程

cursor 账号管理工具

pan.quark.cn/s/372592459…

前言

Cursor作为AI驱动的代码编辑器,其认证机制涉及两种token:短效的Cookie token用于Web端认证,长效的Session token用于客户端认证。本文将从技术角度详细解析这一转换过程。

一、Token类型说明

1.1 短效Cookie Token(Web端认证)

从Cursor Web端登录后获得的Cookie格式为:

WorkosCursorSessionToken = user_id%3A%3Ajwt_token

实际示例:

user_01K43D4JHZ7HVR1VQ3GWHQ7PG1%3A%3AeyJhbGciOiJNaIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSzQzRDRKSFo3SFZSMVZRM0dXSFE3UEcxIiwidGltZSI6IjE3NTY3NTYwODYiLCJyYW5kb21uZXNzIjoiZjBkMWNhMzEtOTM2NS00Njc3IiwiZXhwIjoxNzYxOTQwMDg2LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.va_W-h_MP8hMnTMYsxlVDZZk0FQNfwKM-S3K5C9d8p8

特点说明:

  • 用途: Cursor Web端后台的认证信息
  • Token类型: type: "web"
  • 格式: user_id%3A%3Ajwt_token%3A%3A:: 的URL编码)

1.2 长效Session Token(客户端认证)

通过PKCE流程获得的长效Token用于Cursor客户端认证:

特点说明:

  • 用途: Cursor客户端的认证信息
  • Token类型: type: "session"
  • 获取方式: 通过PKCE OAuth 2.0流程转换

1.3 JWT Token结构解析

JWT Token包含三部分:header.payload.signature

Payload解码后的内容:

{
  "sub": "auth0|user_01K43D4JHZ7HVR1VQ3GWHQ7PG1",
  "time": "1756756086",
  "randomness": "f0d1ca31-9365-4677",
  "exp": 1761940086,
  "iss": "https://authentication.cursor.sh",
  "scope": "openid profile email offline_access",
  "aud": "https://cursor.com",
  "type": "session"
}

关键字段:

  • sub: 用户标识
  • exp: 过期时间戳
  • type: Token类型("web" 或 "session")
  • scope: 权限范围

二、PKCE OAuth 2.0核心流程

2.1 PKCE挑战码生成

import secrets
import hashlib
import base64

def generate_pkce_challenge():
    # 生成32字节随机字符串作为code_verifier
    code_verifier = secrets.token_urlsafe(32)
  
    # 对code_verifier进行SHA256哈希
    sha256_hash = hashlib.sha256(code_verifier.encode('utf-8')).digest()
  
    # Base64 URL安全编码
    code_challenge = base64.urlsafe_b64encode(sha256_hash).rstrip(b'=').decode('utf-8')
  
    return code_verifier, code_challenge

示例输出:

code_verifier: "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
code_challenge: "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM"

2.2 登录URL构造

import uuid

def create_login_url():
    request_uuid = str(uuid.uuid4())
    code_verifier, code_challenge = generate_pkce_challenge()
  
    login_url = f"https://cursor.com/cn/loginDeepControl?challenge={code_challenge}&uuid={request_uuid}&mode=login"
  
    return login_url, request_uuid, code_verifier

完整URL示例:

https://cursor.com/cn/loginDeepControl?challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&uuid=f47ac10b-58cc-4372-a567-0e02b2c3d479&mode=login

2.3 Cookie预设置

在访问登录URL前,需要设置现有的短效token作为Cookie:

def set_auth_cookie(page, user_id, access_token):
    cookie = {
        'name''WorkosCursorSessionToken',
        'value'f"{user_id}%3A%3A{access_token}",
        'domain''.cursor.com',
        'path''/',
        'secure'True,
        'httpOnly'True,
        'sameSite''Lax'
    }
    page.set.cookies(cookie)

三、长效Token轮询获取

3.1 轮询端点

API端点: https://api2.cursor.sh/auth/poll

请求方式: GET

关键参数:

  • uuid: 登录请求的唯一标识
  • verifier: PKCE的code_verifier

3.2 请求头构造

import secrets

def build_headers():
    # 动态生成分布式追踪ID
    trace_id = secrets.token_hex(16)
    parent_id = secrets.token_hex(8)
    traceparent = f"00-{trace_id}-{parent_id}-00"
  
    return {
        "Host""api2.cursor.sh",
        "Origin""vscode-file://vscode-app",
        "User-Agent""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Cursor/1.2.2 Chrome/132.0.6834.210 Electron/34.5.1 Safari/537.36",
        "accept""*/*",
        "sec-ch-ua"'"Not A(Brand";v="8", "Chromium";v="132"',
        "sec-ch-ua-mobile""?0",
        "sec-ch-ua-platform"'"macOS"',
        "sec-fetch-site""cross-site",
        "sec-fetch-mode""cors",
        "sec-fetch-dest""empty",
        "accept-language""zh-CN",
        "traceparent": traceparent,
        "x-ghost-mode""true",
        "x-new-onboarding-completed""false"
    }

3.3 轮询核心逻辑

import requests
import time

def poll_for_token(request_uuid, code_verifier, max_attempts=50, interval=2):
    polling_url = "https://api2.cursor.sh/auth/poll"
  
    for attempt in range(max_attempts):
        headers = build_headers()
        params = {
            "uuid": request_uuid,
            "verifier": code_verifier
        }
    
        try:
            response = requests.get(polling_url, headers=headers, params=params, timeout=10)
        
            if response.status_code == 200:
                data = response.json()
                if "accessToken" in data and "refreshToken" in data:
                    return {
                        "access_token": data["accessToken"],
                        "refresh_token": data["refreshToken"],
                        "user_id": data.get("userId""")
                    }
            elif response.status_code == 404:
                # 404是正常状态,表示用户尚未确认登录
                pass
            else:
                print(f"Unexpected status code: {response.status_code}")
            
        except requests.exceptions.RequestException as e:
            print(f"Request error: {e}")
        
        time.sleep(interval)
  
    return None

状态码含义:

  • 200: 成功获取token
  • 404: 等待用户确认登录(正常状态)
  • 其他: 异常状态

3.4 成功响应格式

{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": "user_01K43D4JHZ7HVR1VQ3GWHQ7PG1"
}

四、关键技术要点

4.1 安全机制

  1. PKCE流程: 防止授权码拦截攻击,确保客户端身份验证
  2. 动态追踪ID: 每次请求生成唯一标识,避免请求重放
  3. Cookie预设: 利用现有Web端认证状态,简化用户操作
  4. JWT验证: 通过数字签名确保token完整性和真实性

4.2 容错处理

  1. 网络重试: 请求失败自动重试,提高成功率
  2. 超时控制: 每个请求10秒超时,避免长时间等待
  3. 状态码识别: 区分正常等待和异常状态,精确处理
  4. 轮询限制: 最多50次轮询防止无限循环,保护系统资源

4.3 性能优化

  1. 轮询间隔: 2秒间隔平衡响应速度和服务器压力
  2. 并发控制: 单线程轮询避免重复请求,降低服务器负载
  3. 资源清理: 及时关闭浏览器释放资源,避免内存泄漏
  4. 请求复用: 复用HTTP连接减少建连开销

结语

通过PKCE OAuth 2.0流程,我们可以将Cursor的短效Cookie token转换为长效Session token,实现从Web端认证到客户端认证的无缝切换。这一技术流程体现了现代OAuth认证机制的安全性和灵活性,为构建可靠的认证系统提供了重要参考。

理解这一流程不仅有助于深入掌握OAuth 2.0协议的实际应用,更为开发者在处理类似认证场景时提供了宝贵的技术洞察。


本文仅供技术学习研究使用,请遵守相关服务条款和法律法规。

技术标签:#OAuth2.0 #PKCE #JWT #认证流程 #Web安全 #cursor