go后端集成 Github第三方登录


前言

因为大多数go集成第三方登录的示例都是前后端不分离,例如 goth,要改成前后端分离并不容易。
所以就自己简单实现了一个前后端分离的示例

实现

示例使用的gin + nextjs 的组合

具体实现

  1. 首先,需要到Github上去申请一个Oauth app
    点击Setting -> 滑到最下,选择Developer Settings -> 选择 Oauth apps
    -> 点击 New Oauth App

    填写下面的内容

这里的3000端口是前端的端口,文章的最后提供了前端的示例代码

生成client secret

保存client idclient secret
2. 登录流程
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

后端代码示例

了解后原理后,写代码就容易了
示例代码中,为了简单,并没用数据库存储用户,将用户信息保存在全局变量中

需要的库

import (
	"log"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/imroc/req/v3"
)

数据定义

type Token struct {
	// success response
	AccessToken string `json:"access_token,omitempty"`
	TokenType string `json:"token_type,omitempty"`
	Scope string `json:"scope,omitempty"`	

	// error response
	Error string `json:"error,omitempty"`
	ErrorDescription string `json:"error_description,omitempty"`
	ErrorUri string `json:"error_uri,omitempty"`
}

type AuthUser struct {
	Id        string `json:"id"`
	Username  string `json:"username"`
	Email     string `json:"email"`
	AvatarUrl string `json:"avatar_url"`
}

type User struct {
	// success response
	Username string `json:"login,omitempty"`
	Id int `json:"id,omitempty"`
	AvatarUrl string `json:"avatar_url,omitempty"`
	Email string `json:"email,omitempty"`

	// error response
	Message string `json:"message,omitempty"`
	DocumentationUrl string `json:"documentation_url,omitempty"`
	Status string `json:"status,omitempty"`
}

var globalUser AuthUser = AuthUser{}

main函数

func main() {
	r := gin.Default()
	
	// ... 接口代码 ...
	log.Fatal(r.Run(":8000"))
}

用户登录接口

r.GET("/auth/github", func(c *gin.Context) {
		code := c.Query("code")

		// get access token
		client := req.C()
		token := Token{}
		_, err := client.R().
			SetQueryParams(map[string]string{
				"client_id": "", // 替换成你的client_id
				"client_secret": "", // 替换成你的client_secret
				"code": code,
			}).
			SetHeader("Accept", "application/json").
			SetSuccessResult(&token).
			Post("https://github.com/login/oauth/access_token")

		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		if token.Error != "" || token.AccessToken == "" {
			c.JSON(http.StatusBadRequest, gin.H{"error": token.Error})
			return
		}
		
		var user User{}

		// get user info
		_, err = client.R().
			SetBearerAuthToken(token.AccessToken).
			SetSuccessResult(&user).
			Get("https://api.github.com/user")

		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		
		globalUser.Id = strconv.Itoa(user.Id),
		globalUser.Username:  user.Username,
		globalUser.Email:     user.Email,
		globalUser.AvatarUrl: user.AvatarUrl,

		c.JSON(http.StatusOK, globalUser)
})

获取用户信息

r.GET("/user", func(c *gin.Context) {
		c.JSON(http.StatusOK, au)
})

实现的效果

  1. 在登录界面中,点击使用github登录
    登录界面

  2. 进行授权,点击同意
    授权界面

  3. 之后跳转到用户界面,完成登录
    用户界面

总结

本文只是打通了登录流程,并没有实现用户认证功能。可以通过access_token获取到用户的信息后,将用户信息保存在jwt_token,将jwt_token发送给前端,之后前端每次操作都带上jwt_token进行验证,这部分的内容就留给大家自行实现

前端代码: https://github.com/cpf2021-gif/behu-web

最后

如果本文对你有帮助, 帮我点个赞👍(关注更好🥰

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个流行的开源的HTTP客户端,它可以用于发送和接收HTTP请求。要实现GitHub第三方登录,我们可以使用OkHttp向GitHub的认证服务器发送请求,并获取授权码或访问令牌。 下面是一个用OkHttp实现GitHub第三方登录的简单的步骤: 1. 首先,我们需要在GitHub开发者平台注册一个应用程序,获得Client ID和Client Secret。这些凭证将用于向GitHub认证服务器证明我们的应用程序的身份。 2. 在应用程序中,创建一个OkHttpClient实例并实例化一个Request对象。Request对象应该包含登录请求的URL、请求方法(一般是GET或POST)、请求头(包括Accept和User-Agent等)以及需要的参数(如Client ID、Client Secret和一些其他参数)。 3. 调用OkHttpClient的newCall方法并传入Request对象来创建Call对象。 4. 调用Call对象的execute方法来发送请求并获取响应。得到的响应是一个Response对象。 5. 从Response对象中获取响应的内容,可能是JSON格式的数据。如果响应中包含授权码或访问令牌,我们可以将其用于后续的访问。 6. 进行登录验证和其他操作。根据响应内容和需要,可以使用OkHttp继续发送请求并处理响应。 需要注意的是,此处的步骤是简化的,并且可能因GitHub的认证流程而有所不同。在实际的应用程序中,还需要处理认证过程中的错误、重试机制、OAuth协议的授权流程等相关问题。 总结来说,使用OkHttp实现GitHub第三方登录需要创建OkHttpClient和Request对象,发送请求并获取响应,然后根据需要处理响应,获取授权码或访问令牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值