Gitee第三方登录

该文章详细介绍了如何使用Gitee的OAuthAPI创建第三方应用并获取用户授权。首先,创建应用并获取client_id和client_secret,然后通过这些参数构建授权码地址进行用户授权。接着,用授权码换取access_token和refresh_token,最后根据access_token获取用户信息,并在数据库中处理用户登录状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gitee官方文档icon-default.png?t=N176https://gitee.com/api/v5/oauth_doc#/

1.创建第三方应用

gitee创建第三方应用icon-default.png?t=N176https://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
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值