2단계 인증은 네트워크 보안의 필수 기능이 되었으며, 이는 계정 보안을 크게 강화할 수 있습니다. 이 기사에서는 Gin 프레임워크를 사용하여 2단계 인증 기능을 구현하는 방법을 소개합니다.
Gin 프레임워크는 고성능, 사용 용이성 및 유연성의 장점을 지닌 경량 웹 프레임워크입니다. RESTful API, 미들웨어, 라우팅 그룹, 템플릿 렌더링 및 기타 기능을 지원하고 좋은 문서와 예제를 갖추고 있어 가장 인기 있는 Go 언어 웹 프레임워크 중 하나입니다.
시작하기 전에 Go 언어 개발 환경을 설치하고 해당 GOPATH 및 PATH 환경 변수를 구성했는지 확인하세요.
먼저 새로운 Gin 프로젝트를 생성해야 합니다. 명령줄에 다음 명령을 입력하세요:
$ mkdir gin-auth $ cd gin-auth $ go mod init gin-auth
다음으로 Gin 프레임워크와 기타 종속성 패키지를 설치해야 합니다. 콘솔에 다음 명령을 입력하세요.
$ go get -u github.com/gin-gonic/gin $ go get -u github.com/gin-contrib/sessions $ go get -u github.com/google/uuid
gin
은 Gin 프레임워크 자체입니다. gin
是Gin框架本身。gin-contrib/sessions
是Gin框架的Session中间件,用于处理Session相关任务。uuid
是Google开发的用于生成UUID的Go语言库。在本文中用于生成二次认证验证码。现在,我们可以开始实现我们的双因素认证功能了。
我们首先需要编写登录页面和处理登录请求的代码,如下所示:
package main import ( "net/http" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // 使用sessions中间件 store := sessions.NewCookieStore([]byte("secret")) router.Use(sessions.Sessions("mysession", store)) router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "login.html", nil) }) router.POST("/", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") // TODO: 验证用户名和密码是否正确 // 将用户名保存到Session中 session := sessions.Default(c) session.Set("username", username) session.Save() c.Redirect(http.StatusFound, "/second-factor") }) router.Run(":8080") }
上面的代码中,我们使用Gin框架的gin.Default()
函数创建一个基本的路由器。然后,我们使用sessions.NewCookieStore
函数创建了一个存储Session的Cookie Store,用于储存用户的Session信息。我们在路由器中间件中使用了Session中间件,并将其命名为mysession
。
在首页路由中,我们通过c.HTML
函数将渲染出登录页面。在登录路由中,我们获取用户输入的用户名和密码,然后在稍后实现的功能中验证它们。如果验证成功,我们将用户名保存在Session中,并将用户重定向到第二种认证页面。
接下来,我们将编写第二次认证的页面和功能。在这里,我们通过Session验证是否已经登录,如果登录,则显示二次认证页面并生成一个随机的6位数字验证码。该验证码将保存在Session中,并将通过短信、邮件或安全令牌等方式发送给用户。
// 定义一个中间件,用于检查Session中是否保存了该用户的用户名 func AuthRequired() gin.HandlerFunc { return func(c *gin.Context) { session := sessions.Default(c) username := session.Get("username") if username == nil { c.Redirect(http.StatusFound, "/") return } c.Next() } } func generateCode() string { code := uuid.New().String() code = strings.ReplaceAll(code, "-", "") code = code[:6] return code } func sendCode(username string, code string) error { // TODO: 将验证码发送给用户 return nil } func main() { router := gin.Default() // ... router.GET("/second-factor", AuthRequired(), func(c *gin.Context) { session := sessions.Default(c) username := session.Get("username").(string) code := generateCode() // 将二次认证验证码保存到Session session.Set("second-factor-code", code) session.Save() // 发送二次认证验证码 err := sendCode(username, code) if err != nil { c.String(http.StatusInternalServerError, "发送二次认证验证码失败") } // 渲染二次认证视图 c.HTML(http.StatusOK, "second-factor.html", nil) }) router.POST("/second-factor", AuthRequired(), func(c *gin.Context) { session := sessions.Default(c) code := session.Get("second-factor-code").(string) inputCode := c.PostForm("code") // 验证二次认证验证码是否正确 if code != inputCode { c.String(http.StatusBadRequest, "验证码不正确") return } c.Redirect(http.StatusFound, "/dashboard") }) router.Run(":8080") }
在上面的代码中,我们定义了一个名为AuthRequired
的中间件,用于检查Session中是否存在已登录的用户。在我们的第二个路由中,使用该中间件,如果Session中未找到已登录的用户,则将用户重定向到登录页面。
我们使用一个名为generateCode
的函数来生成6位数字的验证码,并使用sendCode
gin-contrib/sessions
는 세션 관련 작업을 처리하는 데 사용되는 Gin 프레임워크의 세션 미들웨어입니다.
uuid
는 UUID 생성을 위해 Google에서 개발한 Go 언어 라이브러리입니다. 이 문서에서는 2단계 인증 확인 코드를 생성하는 데 사용됩니다. 이제 이중 인증 기능 구현을 시작할 수 있습니다.
먼저 아래와 같이 로그인 페이지와 로그인 요청을 처리하는 코드를 작성해야 합니다.
代码已经完成了,现在可以创建一些模板文件来呈现登录、二次验证和控制面板页面了。下面是示例模板文件,你可以根据自身需求对其进行修改。
gin.Default()
함수를 사용하여 다음을 수행합니다. 기본 라우터를 만듭니다. 그런 다음 sessions.NewCookieStore
함수를 사용하여 사용자의 세션 정보를 저장하는 데 사용되는 세션을 저장하는 쿠키 저장소를 만듭니다. 라우터 미들웨어에 세션 미들웨어를 사용하고 이름을 mysession
으로 지정했습니다. c.HTML
기능을 사용하여 로그인 페이지를 렌더링합니다. 로그인 경로에서는 사용자가 입력한 사용자 이름과 비밀번호를 얻은 다음 나중에 구현하는 함수에서 이를 검증합니다. 인증이 성공하면 세션에 사용자 이름을 저장하고 사용자를 두 번째 인증 페이지로 리디렉션합니다.
다음으로 2차 인증을 위한 페이지와 기능을 작성하겠습니다. 여기서는 Session을 통해 로그인 여부를 확인합니다. 로그인을 하면 2차 인증 페이지가 표시되며 임의의 6자리 인증코드가 생성됩니다. 인증 코드는 세션에 저장되며 SMS, 이메일 또는 보안 토큰을 통해 사용자에게 전송됩니다.
<meta charset="UTF-8"> <title>Login</title>
위 코드에서는 세션에 로그인한 사용자가 있는지 확인하기 위해 AuthRequired
라는 미들웨어를 정의했습니다. 두 번째 경로에서는 로그인한 사용자를 세션에서 찾을 수 없는 경우 이 미들웨어를 사용하여 사용자를 로그인 페이지로 리디렉션합니다.
generateCode
라는 함수를 사용하여 6자리 인증코드를 생성하고, sendCode
함수를 사용하여 사용자에게 인증코드를 보냅니다. 실제 애플리케이션에서는 이 인증 코드를 SMS, 이메일 또는 보안 토큰을 사용하여 전송할 수 있습니다.
POST 요청과 두 번째 경로의 토큰을 사용하여 사용자의 2단계 인증 코드가 올바른지 확인합니다. 인증코드가 올바르면 사용자는 제어판 페이지로 리디렉션됩니다.
<form method="post" action="/"> <label> 用户名: <input type="text" name="username" /> </label> <br /> <label> 密码: <input type="password" name="password" /> </label> <br /> <button type="submit">登录</button> </form>
<meta charset="UTF-8"> <title>Second Factor Authentication</title>
<form method="post" action="/second-factor"> <p> 请验证您的身份。 </p> <p> 一个6位数字的验证码已经发送到您的邮件或手机上。 <br /> 请输入该验证码以完成二次认证: </p> <label> 验证码: <input type="text" name="code" /> </label> <br /> <button type="submit">验证</button> </form>
<meta charset="UTF-8"> <title>Dashboard</title>
<h1>欢迎访问控制面板</h1>
现在,我们的Gin应用程序就已经完成了。它使用Session中间件实现了用户认证机制,并使用了二次认证功能来增强安全性。