首頁  >  文章  >  後端開發  >  單一登入是什麼?用golang怎麼實作?

單一登入是什麼?用golang怎麼實作?

PHPz
PHPz原創
2023-03-30 09:10:231270瀏覽

單一登入(Single Sign-On, SSO)是一種使用者認證方式,一旦使用者進行了登入操作,就可以在不同的系統或應用程式中無需重新輸入使用者名稱和密碼即可獲得存取權限。在企業級應用程式中,單一登入能夠提高使用者體驗、簡化管理操作、增強安全性等方面有著重要意義。

Golang語言因其高效、簡潔、易於維護等特點受到廣泛關注,本文將介紹如何利用Golang實現單一登入。

  1. 單一登入原則

單一登入主要包含三個角色:使用者Agent、認證中心和資源服務。當使用者在一個應用系統中進行了登入操作之後,將會被重定向到認證中心進行身份認證,認證通過之後,在其它資源服務中仍然可以獲得存取權限。

  1. Golang單一登入原理

在Golang中,可以使用Cookie或Token的方式來實作單一登入功能。

2.1 Cookie方式

在Cookie方式中,登入資訊將保存在Cookie中,登入後存取其它服務時,會將Cookie中的資訊傳遞到資源服務,使得資源服務能夠驗證使用者身份。

首先,進行登入認證的是認證中心,將認證資訊保存在Cookie中,程式碼如下:

func Login(c *gin.Context) {
    c.SetCookie("username", "123", 3600, "/", "localhost", false, true)
    c.JSON(200, "登录成功")
}

在上述程式碼中,SetCookie方法中的第一個參數為Cookie的名稱,第二個參數為Cookie的值,第三個參數為Cookie的過期時間,第四個參數為Cookie的有效路徑,第五個參數為Cookie的域名,第六個參數表示是否僅支援HTTPS協議,最後一個參數表示是否允許跨域存取。

在資源服務中,可以透過c.Request.Cookie("username")方法來取得Cookie資訊:

func SSO(c *gin.Context) {
    cookie, _ := c.Request.Cookie("username")
    if cookie != nil {
        c.JSON(200, "访问成功")
    } else {
        c.JSON(200, "请重新登录")
    }
}

2.2 Token方式

#在Token方式中,認證中心將認證資訊加密成Token的形式,傳到資源服務時,資源服務透過解密方式驗證使用者帳戶的有效性。

下面是Token方式的實作程式碼:

func Login(c *gin.Context) {
    username := "123"
    token, err := CreateToken(username)
    if err != nil {
        c.JSON(500, "生成Token错误")
        return
    }

    c.JSON(200, gin.H{
        "Token": token,
    })
}

func CreateToken(username string) (string, error) {
    claims := Claims{
        username,
        jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
            Issuer:    "test",
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString([]byte("SecretKey"))
    if err != nil {
        return "", err
    }
    return signedToken, nil
}

func SSO(c *gin.Context) {
    tokenString := c.Request.Header.Get("Authorization")
    if tokenString == "" {
        c.JSON(401, "未登录")
        return
    }
    token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte("SecretKey"), nil
    })
    if err != nil || !token.Valid {
        c.JSON(401, "未登录")
        return
    }
    c.JSON(200, "访问成功")
}

type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}

在上述程式碼中,CreateToken方法產生的Token中包含使用者名稱、過期時間以及簽發方等信息,在認證中心中產生Token之後,將Token傳給資源服務,在資源服務中透過解密方式驗證Token的有效性,從而實現單一登入。

  1. 總結

透過Cookie或Token方式,可以實作Golang單點登入功能。在企業級應用程式中,單一登入能夠簡化使用者操作流程,提高應用程式的安全性,為企業帶來更好的營運效益。

以上是單一登入是什麼?用golang怎麼實作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn