Home Telegram Scroll Top

如何通过PKCE获取ChatGPT的AccessToken

借助今天OpenAI公布的iOS版本的ChaGPT,我们可以通过PKCE拿到AccessToken。
我先简单写一下,不懂的自己去查资料。

https://auth0.openai.com/authorize?client_id=pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh&audience=https%3A%2F%2Fapi.openai.com%2Fv1&redirect_uri=com.openai.chat%3A%2F%2Fauth0.openai.com%2Fios%2Fcom.openai.chat%2Fcallback&scope=openid%20email%20profile%20offline_access%20model.request%20model.read%20organization.read%20offline&response_type=code&code_challenge=w6n3Ix420Xhhu-Q5-mOOEyuPZmAsJHUbBpO8Ub7xBCY&code_challenge_method=S256

我们看这个登录的链接,这就是一个标准的Oauth里登录链接。通过这个方法这里的scope是可以换的。
上面的登录链接会直接使用你浏览器里已登录的账号,直接跳转。如果你希望每次都登录则使用这个地址:

https://auth0.openai.com/authorize?client_id=pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh&audience=https%3A%2F%2Fapi.openai.com%2Fv1&redirect_uri=com.openai.chat%3A%2F%2Fauth0.openai.com%2Fios%2Fcom.openai.chat%2Fcallback&scope=openid%20email%20profile%20offline_access%20model.request%20model.read%20organization.read%20offline&response_type=code&code_challenge=w6n3Ix420Xhhu-Q5-mOOEyuPZmAsJHUbBpO8Ub7xBCY&code_challenge_method=S256&prompt=login

其实很简单,就是加了个prompt=login参数。

链接里的code_challenge可以通过如下代码生成(这段代码GPT帮我写的,跟我说:谢谢OpenAI):

import os
import base64
import hashlib

def generate_code_verifier():
    # 随机生成一个长度为 32 的 code_verifier
    token = os.urandom(32)
    code_verifier = base64.urlsafe_b64encode(token).rstrip(b'=')
    return code_verifier.decode('utf-8')

def generate_code_challenge(code_verifier):
    # 对 code_verifier 进行哈希处理,然后再进行 base64url 编码,生成 code_challenge
    m = hashlib.sha256()
    m.update(code_verifier.encode('utf-8'))
    code_challenge = base64.urlsafe_b64encode(m.digest()).rstrip(b'=')
    return code_challenge.decode('utf-8')

code_verifier = generate_code_verifier()
code_challenge = generate_code_challenge(code_verifier)

print("code_verifier: ", code_verifier)
print("code_challenge: ", code_challenge)

对,就是用这里生成的code_challenge来替换链接里的,同时你需要记下这里的 code_verifier,后面要用。

我这里给一对例子,可以直接用:

code_verifier:  IkrrBD89CBmwwzM-csfBnWKLMan5uE7laCMd2YTcPWE
code_challenge:  t1RM5eR6dToh4VAe85qAf4ANdsnob6ANiuyl_z67mr4

现在请求拼装好的链接,登录成功后会跳转到 com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback?code=dbzSm1K578wMZ26GXXUri18a5_e024Dew123kzuiZ_Kq9 这里的code每次不同。

现在我们收集到这里的信息之后,POST 请求:https://auth0.openai.com/oauth/token
请求内容为json

{
    "redirect_uri": "com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback",
    "grant_type": "authorization_code",
    "client_id": "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh",
    "code": "替换成你拿到的code",
    "code_verifier": "替换成你前面生成的code_verifier"
}

请求了就能拿到 access token了,这个token可以使用ChatGPT。也可以在 Pandora 中使用。

补一下Refresh Token的内容:
在我们上步骤POST拿到access token之后,同时也会拿到一个refresh token,这个是用来刷新access token的(反正看OAuth就懂了)。
我们可以这么使用:还是 POST 请求: https://auth0.openai.com/oauth/token
请求内容为json

{
    "redirect_uri": "com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback",
    "grant_type": "refresh_token",
    "client_id": "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh",
    "refresh_token": "上步获取的refresh token"
}

你可以看到这里请求,只需要refresh token就能刷新并获取到新的access token!所以你万万不可以泄露refresh token!!

这里补充一下,如果泄露了refresh token,如何来吊销的方法(是吊销refresh token):

POST 请求:https://auth0.openai.com/oauth/revoke
请求内容为json

{
    "client_id": "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh",
    "token": "要吊销的refresh token"
}

先简单写这么多,相关利用代码更新在这里。对了,登录要开支持国家的梯子,不然你拿不到code
最大好处就是不跟cloudflare接触,并且可以改scope。

2023-07-13 更新

咱也不知道OpenAI出于什么心理,在登录时要求验证一个preauth_cookie参数,生成还挺麻烦。
不过不用担心,通过https://ai.fakeopen.com/auth/preauth就能拿到一个可用的preauth_cookie,把它附在登录链接上即可,大概长这样:https://auth0.openai.com/authorize?client_id=...&prompt=login&preauth_cookie=xxx
至于代码,我也已经更新在 Pandora v1.2.7 中了。

分享本文到:

34 评论

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注


  1. 大佬,/u/login/password?state=,请求到这一步,response code变成303了,怎么处理?