我一直在研究 Go,具體的說(shuō)應(yīng)該是一直在研究 gin 。我的 pet 項(xiàng)目需要一個(gè)快速而粗糙的身份認(rèn)證。
通常我不會(huì)建議使用 HTTP / basic auth 來(lái)保護(hù)資源,但對(duì)于這個(gè)項(xiàng)目,我沒(méi)有數(shù)據(jù)庫(kù),我只是在這里和那里提供一些 markdown 文件。所以我這里會(huì)采用 HTTP / basic auth 來(lái)做身份認(rèn)證。
gin 是我最喜歡的 web 框架之一,因?yàn)樗泻芏喾浅?岬闹虚g件,它有點(diǎn)像 node.js 的express 框架 或 hapijs。
安裝 Gin 框架 & 打印 Hello World
如果你在 go/src
目錄下創(chuàng)建了一個(gè) gin-http-auth
的項(xiàng)目,在項(xiàng)目的 main.go
文件里添加的的內(nèi)容如下:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "Hello World!", }) }) r.Run() //監(jiān)聽 0.0.0.0:8080 }
接著在你的終端上運(yùn)行 go get
命令,你的項(xiàng)目就開始運(yùn)行了! 您現(xiàn)在需要通過(guò)運(yùn)行以下命令啟動(dòng)剛出爐的 JSON API:
go run main.go
你可以在你的瀏覽器中輸入 localhost:8080,應(yīng)該可以看到 「message:Hello World !」
注意:提供 API 可能是 gin 的更大應(yīng)用場(chǎng)景之一,但是你也可以直接渲染一系列模板。
用 Gin 框架來(lái)實(shí)現(xiàn)路由保護(hù)
假設(shè)你現(xiàn)在有一個(gè) secret 的方法,你不希望所有人通過(guò) url 訪問(wèn)的到,這是一個(gè)特殊的燒烤醬配方或一封含有一些不可告人的細(xì)節(jié)的的情書!
我們需要設(shè)置一些示例用戶帳戶并創(chuàng)建一個(gè) secret 的路由,當(dāng)然我們也可以設(shè)置一個(gè)默認(rèn)的路由 /
。
讓我們來(lái)看看這個(gè)最小可行的例子:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello World!", }) }) authorized := r.Group("/", gin.BasicAuth(gin.Accounts{ "user1": "love", "user2": "god", "user3": "sex", })) authorized.GET("/secret", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "secret": "The secret ingredient to the BBQ sauce is stiring it in an old whiskey barrel.", }) }) r.Run() // 監(jiān)聽服務(wù)在 0.0.0.0:8080 }
- 在
import
中多導(dǎo)入了一個(gè)net/http
包, 用于格式化 http 響應(yīng)的狀態(tài)碼。 - 在授權(quán)訪問(wèn)的組中添加了部分用戶。
authorized.GET
只允許用戶輸入正確的組合。 它就像普通的路由器功能一樣,但它需要身份驗(yàn)證
當(dāng)您更改文件內(nèi)容時(shí),請(qǐng)按「CTRL + C」以快速運(yùn)行 Gin 框架的實(shí)例并重新啟動(dòng)它.
當(dāng)你在你的瀏覽器中訪問(wèn) localhost:8080/secret,你應(yīng)該看到一個(gè)窗口提示你輸入用戶名和密碼。
如果你正確輸入的賬戶和密碼,你將看到以下輸出:
secret "The secret ingredient to the BBQ sauce is stiring it in an old whiskey barrel."
就這樣已經(jīng)搞定了! 你在 Go web 項(xiàng)目中創(chuàng)造了一個(gè)需要 http basic auth 的路由!
如果你想要更詳細(xì)的例子,請(qǐng)查看 Github 上 gin 的 README.md ,因?yàn)樗袔讉€(gè)很好的例子!
推薦教程:《Go教程》