gitee官方文档https://gitee.com/api/v5/oauth_doc#/
1.创建第三方应用
gitee创建第三方应用https://gitee.com/oauth/applications/
2.编写授权码地址 Get请求
https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code
相关参数:
3. 接收code参数,获取短token
code = self.get_argument("code", None)
# 通过授权码请求token
# 异步发送网络请求,防止阻塞
client_id = SITE_TYPE["Gitee"]["client_id"]
client_secret = SITE_TYPE["Gitee"]["client_secret"]
redirect_uri = SITE_TYPE["Gitee"]["redirect_uri"]
async with httpx.AsyncClient() as client:
res = await client.post(
url=f"https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}",
timeout=20
)
res = res.json()
# 获取gitee的access_token refresh_token
gitee_access_token = res["access_token"]
4.根据token获取用户信息
async def get_info(self, access_token):
async with httpx.AsyncClient() as client:
res = await client.get(f"https://gitee.com/api/v5/user?access_token=" + access_token, timeout=20)
res = res.json()
return res["id"], res["name"]
async def get(self):
gitee_id, gitee_username = await self.get_info(gitee_access_token)
username = (str(gitee_id) + "_" + str(gitee_username))
5.获取用户信息判断是否第一次登陆
try:
# 曾经使用过gitee账号
await db.get(UserModel.select().where((UserModel.username == username)
& (UserModel.site_type == SITE_TYPE["Gitee"]["num"])))
except Exception as e:
print(e.args)
await db.create(UserModel, username=username,
site_type=SITE_TYPE["Gitee"]["num"])
6.重新编写token
finally:
mj = MyJwt()
# 生成带有生命周期的token
token = mj.encode_date({
"username": username,
"site_type": SITE_TYPE["Gitee"]["num"]
})
# 生成refresh_token redis里面存
refresh_token = await mj.set_refresh_token(username)
url = "http://127.0.0.1:8080/center" + f"?gitee_refresh_token={refresh_token}&gitee_token={token}&username={username}"
return self.redirect(url)
完整代码
import httpx # 异步库
# gitee登录
class GiteeBack(BaseHandler):
async def get_info(self, access_token):
async with httpx.AsyncClient() as client:
res = await client.get(f"https://gitee.com/api/v5/user?access_token=" + access_token, timeout=20)
res = res.json()
return res["id"], res["name"]
async def get(self):
code = self.get_argument("code", None)
# 通过授权码请求token
# 异步发送网络请求,防止阻塞
client_id = SITE_TYPE["Gitee"]["client_id"]
client_secret = SITE_TYPE["Gitee"]["client_secret"]
redirect_uri = SITE_TYPE["Gitee"]["redirect_uri"]
async with httpx.AsyncClient() as client:
res = await client.post(
url=f"https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}",
timeout=20
)
res = res.json()
# 获取gitee的access_token refresh_token
gitee_access_token = res["access_token"]
gitee_id, gitee_username = await self.get_info(gitee_access_token)
username = (str(gitee_id) + "_" + str(gitee_username))
try:
# 曾经使用过gitee账号
await db.get(UserModel.select().where((UserModel.username == username)
& (UserModel.site_type == SITE_TYPE["Gitee"]["num"])))
except Exception as e:
print(e.args)
await db.create(UserModel, username=username,
site_type=SITE_TYPE["Gitee"]["num"])
finally:
mj = MyJwt()
# 生成带有生命周期的token
token = mj.encode_date({
"username": username,
"site_type": SITE_TYPE["Gitee"]["num"]
})
# 生成refresh_token redis里面存
refresh_token = await mj.set_refresh_token(username)
url = "http://127.0.0.1:8080/center" + f"?gitee_refresh_token={refresh_token}&gitee_token={token}&username={username}"
return self.redirect(url)
# 路由
urlpatterns = [
(r"/gitee_back/", Gitee), # gitee
]