File size: 2,331 Bytes
0240df9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
const crypto = require('crypto');
const { v4: uuidv4, v5: uuidv5 } = require('uuid');

function generatePkcePair() {
  const verifier = crypto.randomBytes(43).toString('base64url');
  const challenge = crypto.createHash('sha256').update(verifier).digest('base64url');    
  return { verifier, challenge };
}

function getLoginUrl(uuid, challenge) {
  const loginUrl = `https://www.cursor.com/loginDeepControl?challenge=${challenge}&uuid=${uuid}&mode=login`
  return loginUrl
}

async function queryAuthPoll(uuid, verifier){
  const authPolllUrl = `https://api2.cursor.sh/auth/poll?uuid=${uuid}&verifier=${verifier}`;
  const response = await fetch(authPolllUrl, {
    method: 'GET',
    headers: {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Cursor/0.48.6 Chrome/132.0.6834.210 Electron/34.3.4 Safari/537.36",
        "Accept": "*/*"
    },
    timeout: 5000
  });

  if (response.status === 200) {
    const data = await response.json();
    return data
  }

  return undefined;
}

if (require.main === module) {

  async function main(){
    const { verifier, challenge } = generatePkcePair();
    const uuid = uuidv4();
    const loginUrl = getLoginUrl(uuid, challenge);
    console.log("[Log] Please open the following URL in your browser to login:");
    console.log(loginUrl);

    const retryAttempts = 60;

    for (let i = 0; i < retryAttempts; i++) {
      console.log(`[Log] Waiting for login... (${i + 1}/${retryAttempts})`);
      const data = await queryAuthPoll(uuid, verifier);
      if (data) {
        const accessToken = data.accessToken || undefined;
        const authId = data.authId || "";
        let token = undefined
        if (authId.split("|").length > 1) {
          const userId = authId.split("|")[1];
          token = `${userId}%3A%3A${accessToken}`;
        } else {
          token = accessToken;
        }
        console.log("[Log] Login successfully. Your Cursor cookie:");
        console.log(token)
        break;
      }
      await new Promise(resolve => setTimeout(resolve, 5000));

      if (i === retryAttempts - 1) {
        console.log("Login timeout, please try again.");
      }
    }
  }

  main().catch((error) => {
    console.error("Error:", error);
  });

}

module.exports = {
  generatePkcePair,
  queryAuthPoll
}