(原文作者:Devcrazy)
近年来,全栈开发人员受到了更多的赞赏。因此,我决定进行一个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的身份验证进行集成。并使用一些实用工具进行测试。我希望我的文章对您的职业有所帮助。
原文: