近年来,全栈开发人员受到了更多的赞赏。因此,我决定进行一个restfull项目。Go由Google在2009年开发。现在,它的受欢迎程度正在增长。

通常,对于一种新语言的初学者来说,他们想做一个认证项目。因为身份验证是所有Web应用程序的基础。并且它应该被当做一个启动项目。

在G ithub文章中( ),可以发现在框架中的G是最受欢迎的35943星。Beego也很流行,但我认为Gin更适合RESTfull应用程序;此外,Gin支持Mongodb,而Beego不支持。JWT身份验证广泛用于REST api。

我研究了有关Golang Mongo ORM的几篇文章。我发现mogo( )很有用。Mogo是mgo()的包装,它在原始Mongo函数中添加了ODM,挂钩,验证和填充过程。

在本文中,我将使用上面选定的内容制作一个示例项目。

先决条件
  • 从安装Go最新版本
  • 最新的MongoDB社区版( )

您可以通过以下方式检查golang版本:

 >go version
go version go1.14 windows/amd64  

如您所见,我已经安装了go 1.14。

Golang项目初始化

Golang项目的初始化相对容易。请在所需的新项目目录中打开终端,然后执行以下命令。

 >go mod init goseed  

在这里,“ goseed”是项目名称。然后在该目录下创建“ go.mod”文件。所有依赖项都在这里注册。
在以前的Go版本中,依赖项管理有些烦人。您必须通过“go get -u …”来安装包,但是从此版本(1.14)开始,上述命令可以解决所有问题。

杜松子酒的框架不提供项目结构。因此,我必须首先确定结构。

我的项目结构是这样的。

 + controllers
|--- authcontroller.go
+ middlewares
|--- middlewares.go
+ models
   + db
   |-- mongodb.go
   + entity
   |-- user.go
   + service
   |-- userservice.go
+ routers
|--- index.go
+ utils
|--- index.go
main.go  

我认为,这种结构在Web应用程序中很普遍。

像任何其他框架一样,无论是否为api项目, 控制器( controllers)都会 包装应用程序逻辑。 中间件(Middlewares) 嵌入控制器钩子之前或之后。而 模型(models) 是负责数据库连接和DB的逻辑。
也许项目中最重要的部分是路线系统。在我们的项目中, 路由器(routers ) 包对此负责。琐碎但有用的功能位于 utils 包中。

在Golang中,“ main.go”是

现在,我们必须执行数据库连接,实施身份验证系统。

MongoDB与Mogo

Mogo是mgo()的包装,它在原始Mongo函数中添加了ODM,挂钩,验证和填充过程。Mogo最初是bongo( )项目的一个分支,旨在重新思考已经开发的概念,最接近后端mgo驱动程序。它还添加了高级功能,例如分页,属于其他集合的参考文档的填充以及在文档字段上创建索引。

易于使用。只需从github仓库导入包。

 import "github.com/goonode/mogo"  

现在,让我们处理数据库连接。

在我的项目中,“ db/mongodb.go”处理数据库连接。

在这里,connectionString和dbName参数存储在.env文件中。我这样配置。

 DB_CONNECTION_STRING=localhost
DB_NAME=goseed  

存储项目配置参数很方便。为了处理.env文件,我使用在“utils/index.go”中实现的“ EnvVar”功能

而已。我们可以通过以下方式从任何地方获得连接。

 import "goseed/models/db"  
中间件

中间件软件包中有两个功能。一个是“ ErrorHandler”功能,另一个是“ Authentication”。

 //ErrorHandler is for global error
func ErrorHandler(c *gin.Context) {
c.Next()
if len(c.Errors) > 0 {
c.JSON(http.StatusBadRequest, gin.H{
            "errors": c.Errors,
        })
    }
}  

“ ErrorHandler”功能用于处理未捕获的应用程序错误。防止应用程序被意外的异常破坏非常有用。

中间件软件包中的“身份验证”功能处理JWT。它检查令牌并获取用户信息。如果不是,则拒绝请求。

该代码有点长,可以在这里( )引用。

路由器

布线图如下所示。

如您所见,“注册(sign up)”和“登录(sign in)”不需要身份验证,但“profile” API则需要。在这里,“profile” api是对需要身份验证的api的象征。

路由器程序包处理在“routers/index.go”中实现的路由逻辑

 package routers
import (
"goseed/controllers"
"goseed/middlewares"
"github.com/gin-gonic/gin"
)
func setAuthRoute(router *gin.Engine) {
authController := new(controllers.AuthController)  
   router.POST("/login", authController.Login)
   router.POST("/signup", authController.Signup)
   authGroup := router.Group("/")
   authGroup.Use(middlewares.Authentication())
   authGroup.GET("/profile", authController.Profile)
}
// InitRoute ..
func InitRoute() *gin.Engine {
   router := gin.New()
   router.Use(gin.Logger())
   router.Use(gin.Recovery())
   setAuthRoute(router)
   
   return router
}  

我们应该在main.go中调用“InitRoute()”函数来初始化路由器。

现在我们可以运行应用程序了。我们需要一些对后端开发人员有用的有用工具:MongoDB Compass和Postman。

让我们开始我们的应用程序。

 > go run .\main.go
[GIN-debug] POST   /login                    --> goseed/controllers.(*AuthController).Login-fm (3 handlers)  
[GIN-debug] POST   /signup                   --> goseed/controllers.(*AuthController).Signup-fm (3 handlers) 
[GIN-debug] GET    /profile                  --> goseed/controllers.(*AuthController).Profile-fm (4 handlers)
[GIN-debug] Listening and serving HTTP on :8080  

哇,应用程序正在运行。并启动MongoDB Compass并连接到localhost:27017。端口号27017是默认端口,可以更改。哦,我认为您已经开始使用mongod。

然后启动Postman,以此来测试我们的API。让我们从注册开始。

结果是确定的。现在您可以看到您的信息已在MongoDB中注册。

使用此信息,尝试登录。

服务器返回了令牌。好的。有了这个令牌,我们可以通过“ profile” api获取我们的信息。

在RFC6750中,建议使用“承载者(Bearer)”将令牌嵌入头部。

OK,成功获取用户信息。

结论

在本文中,我描述了如何构建一个项目以及将几种框架或技术(例如mogo)与基于gin的基于JWT的身份验证进行集成。并使用一些实用工具进行测试。我希望我的文章对您的职业有所帮助。

原文: