记一次对接Gitee码云第三方授权登陆的经验分享!

最近又准备搞一个开源项目了,不要问我为啥要天天开源这个开源那个的,我也不知道,毕竟免费的代码托管服务,不用白不用。跑题了,因为我懒得自己实现一套用户登陆注册体系(我知道简单),因为注册无法就两条主流方案:邮箱注册、手机号注册,邮箱注册要对接SMTP服务,我懒的接;手机号注册,比邮箱注册更麻烦,不仅要对接第三方短信服务,还要设计短信模板还要提交审核,破事又是一堆,而且还会有可能会被刷短信验证码的一辈子吃不上四个菜的大聪明亲切问候,因此现在对于我来讲最简单的方案就是直接对接第三方授权登陆,先把基本的用户登陆做好,先把该有的功能做好,后面再好自己的一套用户体系!

开篇总结

其实第三方授权我大概都看了一下,都差不多。本来一开始想对接微信和QQ登陆的,结果发现QQ因为早些年刚毕业绑定了企业现在又注销不掉,微信登陆虽然我没实际对接但根据我对微信的聊天,应该是不大可能给个人开发者开放了,估计还得交保护费,因此拉倒吧,逛了一圈,作为程序员,我选择了2个代码平台:码云和Github,然后一个社交平台:新浪微博;这三个平台后面对接我都会慢慢出博客记录,这一篇博文主要是记录对接码云的授权登陆!

截图_选择区域_20211108213521.png

准备工作

首先,你肯定得具备阅读PHP代码的能力,因为本博客主要是基于PHP的ThinkPHP框架对接,当然其它语言基本逻辑类似。然后就是最好有线上的web环境,然后就是你得有个码云账号就好了;

开始对接

首先,你登陆你的码云账号,然后访问这个链接:https://gitee.com/oauth/applications/new,创建一个新的应用;

这一步我就不配图了,本国语言母语,但凡不是个傻子都知道怎么填写。

填完之后你就可以看到类似于这样一个应用(配图仅供参考,不要无脑理解!谢谢!)

截图_选择区域_20211108214631.png

内部配置其实最主要的就是 回调地址获取用户信息 的权限,获取用户信息 的能力默认就是给的,因此你需要配置好回调地址就好了;

配置完成后,你就可以打开码云的API文档开始对接了, 首先我们看 oAuth 的文档:https://gitee.com/api/v5/oauth_doc

截图_选择区域_20211108215143.png

对接就2个步骤,Web页面跳转到授权链接,获取用户授权后回调携带 code,你通过 code 再去调用 获取token 的接口,最后拿着token去获取用户信息即可!

几步走

  1. 前端页面放个按钮,点击一下,跳转到 https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code 这个链接,其中 {client_id}{redirect_uri} 是你实际的 client_id 和 回调地址;
  2. 如果用户授权,那么就会跳转到 你的回调地址 上,并且会给你附带一个 code
  3. 你通过 code,去请求 https://gitee.com/oauth/token 这个接口(后端请求)
  4. 通过上一步可以获得 access_token, 拿着 access_token 去请求 https://gitee.com/api/v5/user 接口,获取用户信息!
  5. 最后录入数据库完成登陆流程

参考代码

自用的一个Request请求类

<?php

namespace app\common\util;

/**
 * 发送网络请求工具类
 * @author huangjunjie
 * @version 1.0.0
 */
class Request
{
    /**
     * 发送 post 请求
     * @param $url
     * @param array $data
     * @return mixed
     */
    public function post($url, $data = array(), $json = true)
    {
        //初始化
        $curl = curl_init();
        //设置抓取的url
        curl_setopt($curl, CURLOPT_URL, $url);
        //设置头文件的信息作为数据流输出
        curl_setopt($curl, CURLOPT_HEADER, 0);
        //设置获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        //设置post方式提交
        curl_setopt($curl, CURLOPT_POST, 1);
        //设置post数据
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //不验证证书下同
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        //执行命令
        $output = curl_exec($curl);

        //关闭URL请求
        curl_close($curl);

        return $json ? json_decode($output, true) : $output;
    }

    /**
     * 发送 GET 请求
     * @param $url
     * @param array $data
     * @return mixed
     */
    public function get($url, $data = array(), $json = true)
    {
        //初始化
        $ch = curl_init();
        //设置选项,包括URL
        $query = http_build_query($data);
        $url = $url . '?' . $query;
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //执行并获取HTML文档内容
        $output = curl_exec($ch);
        //释放curl句柄
        curl_close($ch);

        return $json ? json_decode($output, true) : $output;
    }
}

我这边的控制器代码

<?php

namespace app\bookmarks\controller;

use app\common\util\Request;
use think\Controller;

class Auth extends Controller
{
    public function gitee()
    {
        // 通过回调函数获取code
        $code = $this->request->get("code");
        // 获取access_token
        $request = new Request();
        $login = $request->post(AUTH_LOGIN_GITEE_GET_TOKEN, [
            "grant_type" => "authorization_code",
            "code" => $code,
            "client_id" => AUTH_LOGIN_GITEE_CLIENT_ID,
            "redirect_uri" => AUTH_LOGIN_GITEE_REDIRECT_URI,
            "client_secret" => AUTH_LOGIN_GITEE_CLIENT_SECRET,
        ]);

        if (isset($login["error"])) {
            return ["code" => 401, "msg" => $login["error_description"]];
        } else {
            $userinfo = $request->get(AUTH_LOGIN_GITEE_GET_USERINFO, ["access_token" => $login["access_token"]]);
            return ["code" => 200, "data" => $userinfo];
        }
    }
}

我这边的全局常量配置

<?php
// 码云授权登陆配置,相关页面:https://gitee.com/oauth/applications
const AUTH_LOGIN_GITEE_CLIENT_ID = "这里换成你的 Client ID";
const AUTH_LOGIN_GITEE_CLIENT_SECRET = "这里换成你的 Client Secret";
const AUTH_LOGIN_GITEE_REDIRECT_URI = "这里换成你实际的回调地址";
const AUTH_LOGIN_GITEE_GET_TOKEN = "https://gitee.com/oauth/token";
const AUTH_LOGIN_GITEE_GET_USERINFO = "https://gitee.com/api/v5/user";

如何查看自己的 Client ID 和 Client Secret ?

点击应用名称,即可查看应用详情,上面就有两个只读的输入框,那里面就是需要的 Client IDClient Secret!

截图_选择区域_20211108220045.png