Developer 2024 🎇限时优惠进行中,现在购买立即享受

现在购买

教大家如何接入gitee码云的OAuth登录

avatarJingle
9月13日7.0k次阅读

Simple社区接入码云登录

众所周知,由于某些原因基友hub(Github)一直处于经常打不开的情况,而Simple社区最初只开放了一个GitHub登录的入口,导致经常登录失败。所以我们决定增加Gitee登录。后续还可以考虑接入QQ、微博、微信等。

创建应用

登录码云 gitee.com,进入个人中心,创建一个第三方应用。

文档

打开码云开放平台的文档,https://gitee.com/api/v5/oauth_doc

这里有具体的步骤和流程介绍图

OAuth2 获取 AccessToken 认证步骤

  1. 授权码模式

应用通过 浏览器 或 Webview 将用户引导到码云三方认证页面上( GET请求 ) https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code

  1. 用户对应用进行授权

注意: 如果之前已经授权过的需要跳过授权页面,需要在上面第一步的 URL 加上 scope 参数,且 scope 的值需要和用户上次授权的勾选的一致。如用户在上次授权了user_info、projects以及pull_requests。则步骤A 中

GET 请求应为:https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=user_info%20projects%20pull_requests

  1. 码云认证服务器通过回调地址{redirect_uri}将 用户授权码 传递给 应用服务器 或者直接在 Webview 中跳转到携带 用户授权码的回调地址上,Webview 直接获取code即可({redirect_uri}?code=abc&state=xyz)

  2. 应用服务器 或 Webview 使用 access_token API 向 码云认证服务器发送post请求传入 用户授权码 以及 回调地址( POST请求 )

https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}

  1. 码云认证服务器返回 access_token

应用通过 access_token 访问 Open API 使用用户数据。 当 access_token 过期后(有效期为一天),你可以通过以下 refresh_token 方式重新获取 access_token POST请求 )

https://gitee.com/oauth/token?grant_type=refresh_token&refresh_token={refresh_token}

  • 注意:如果获取 access_token 返回 403,可能是没有设置User-Agent的原因。
  • 详见:获取Token时服务端响应状态403是什么情况
  1. 密码模式 用户向客户端提供邮箱地址和密码。客户端将邮箱地址和密码发给码云认证服务器,并向码云认证服务器请求令牌。

( POST请求。Content-Type: application/x-www-form-urlencoded )

curl -X POST --data-urlencode "grant_type=password" --data-urlencode "username={email}" --data-urlencode "password={password}" --data-urlencode "client_id={client_id}" --data-urlencode "client_secret={client_secret}" --data-urlencode "scope=projects user_info issues notes" https://gitee.com/oauth/token

scope表示权限范围,有以下选项,请求时使用空格隔开

user_info projects pull_requests issues notes keys hook groups gists enterprises

  • 码云认证服务器返回 access_token

  • 应用通过 access_token 访问 Open API 使用用户数据。

Django中具体应用步骤

在通过以上操作后,我们就可以获取到access_token,通过这个值,我们可以去码云的api查询到用户信息,拿来和数据库进行比较,有就创建,没有就移除即可。

代码:


from django.conf import settings
from django.contrib.auth import get_user_model, authenticate, login
from django.contrib.auth.models import User
from django.shortcuts import redirect
import requests



def gitee_oauth(request):
    url = 'https://gitee.com/oauth/authorize?client_id={}&redirect_uri={}&scope=user_info&response_type=code'.format(
        settings.GITEE_CLIENT_ID, settings.GITEE_REDIRECT_URI)
    return redirect(url)


def gitee_callback(request):
    code = request.GET.get('code')
    if not code:
        # 取消授权之类,直接跳转首页
        return redirect('/')
    # 开始获取用户信息

    r = requests.post('https://gitee.com/oauth/token', data={
        'grant_type': 'authorization_code',
        'code': code,
        'client_id': settings.GITEE_CLIENT_ID,
        'redirect_uri': settings.GITEE_REDIRECT_URI,
        'client_secret': settings.GITEE_CLIENT_SECRET
    })
    access_token = r.json().get('access_token')
    # 获取用户基本信息
    r = requests.get('https://gitee.com/api/v5/user?access_token={}'.format(access_token))
    u = r.json()
    d = {
        'email': u.get('email'),
        'username': u.get('login'),
        'first_name': u.get('name'),
    }

    if not d.get('email'):
        r = requests.get('https://gitee.com/api/v5/emails?access_token={}'.format(access_token))
        e = r.json()
        d['email'] = e[0].get('email')
    
    # 这个是头像地址,可以存放到一张单独的表
    avatar_url = u.get('avatar_url')

    dbu = User.objects.filter(username=d.get('username')).first()
    if not dbu:
        dbu = User.objects.create(**d)
    # 放入session
    login(request, dbu, backend='django.contrib.auth.backends.ModelBackend')
    

    # 判断session有没有跳转地址,没有就跳转首页

    # 如果用户存在,就登录,不存在就创建
    return redirect('/')

如有疑问欢迎在下方留言。

发布评论
登录后发表内容
2个评论