借助今天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。
膜拜大佬!非常感谢。
更改code_challenge复制链接后跳转到是welcome back界面
然后是如何操作呢 求大神讲解
当然是要先登录,然后才能拿到code。
佩服大佬的分享,非常感谢,收获很多
请问,我用你提供的链接,输入的账号获取的token,当14天过期后,我再使用相同的账号,会重新返回一个新的token供我验证使用吗
你什么时候请求,都是给你一个新token。
通过ios拿到的 ,也是有效期14天吗?
是。不过可以用refresh token续期。
牛啊,唯一在中文互联网上没有套路提供chatgpt服务的网站吧?
没有套路是真的,是否唯一不知道。
有没有可能根据这个方法,将pandora部署到能直接访问chatgpt的服务器上,直接通过账号登录呢?
完全可以啊,pandora已经更新代码了。
我没有详细看,现在已经支持直接登录了吗?如果已经ok了,那我去更新下
已更新,多谢提醒,谢谢。
能否在docker里面提供变量,从而实现不设置actoekn仅设置一个类似pandora_account的环境变量从而实现http的功能,这样就避免了再需要去更新actoken了大佬
这个互联网我就服你
这个互联网我就服你。
google 登录烦请搞一下嘛