当前位置:首页 > 科技  > 软件

用Go模拟实现单点登录Token生成和验证解析

来源: 责编: 时间:2024-01-15 09:20:58 282观看
导读1.单点登录(SSO)原理单点登录(Single Sign-On,简称SSO)是一种身份验证和授权机制,允许用户在访问多个相关独立的系统或应用程序时只需一次登录, 而不需要为每个系统都提供单独的身份验证凭证。SSO的目的是简化用户体

1.单点登录(SSO)原理

单点登录(Single Sign-On,简称SSO)是一种身份验证和授权机制,允许用户在访问多个相关独立的系统或应用程序时只需一次登录, 而不需要为每个系统都提供单独的身份验证凭证。SSO的目的是简化用户体验、提高安全性, 并减少用户因频繁登录而可能面临密码疲劳问题。BPg28资讯网——每日最新资讯28at.com

SSO的工作原理涉及以下关键概念:BPg28资讯网——每日最新资讯28at.com

  • 身份提供者(Identity Provider, IdP): 负责验证用户的身份并生成令牌(Token)。IdP通常是一个中心化的认证系统, 负责向其他相关系统提供认证服务。
  • 服务提供者(Service Provider, SP): 各个系统或应用程序, 它们依赖于IdP来验证用户身份。SP接收到IdP颁发的令牌后, 可以通过验证令牌的有效性来信任用户身份。
  • 令牌(Token): 由IdP颁发, 包含有关用户身份的信息, 以及可能的授权信息。
  • 单一登录会话(Single Sign-On Session): 用户只需一次登录到IdP,然后就可以访问所有与IdP集成的SP, 而无需再次提供用户名和密码。

原理图如下:BPg28资讯网——每日最新资讯28at.com

图片图片BPg28资讯网——每日最新资讯28at.com

2.JWT原理

JWT 是一种基于 JSON 格式的轻量级令牌,其主要原理是通过在服务端生成一个包含用户信息的 JSON 对象,然后使用密钥对该对象进行签名,生成一个令牌。这个令牌可以被发送到客户端,客户端可以在之后的请求中携带该令牌,服务端使用密钥验证令牌的签名,并解析其中的信息, 从而完成身份验证。BPg28资讯网——每日最新资讯28at.com

JWT 由三部分组成:Header(头部)、Payload(负载)和 Signature(签名)。BPg28资讯网——每日最新资讯28at.com

  • Header(头部):包含了两部分信息,token 的类型(JWT)和使用的签名算法,通常是 Base64 编码的 JSON 字符串。
  • Payload(负载):包含了一些声明(Claim),其中包括标准声明、私有声明等。这部分也是 Base64 编码的 JSON 字符串,用于携带一些关键的信息。
  • Signature(签名):由前两部分使用指定的算法签名而成,用于验证消息的完整性。

JWT原理图如下:BPg28资讯网——每日最新资讯28at.com

图片图片BPg28资讯网——每日最新资讯28at.com

3.使用Golang模拟实现过程

为了模拟单点登录(SSO), 将创建两个简单的Golang服务: 一个用于认证用户(认证中心), 另一个用于资源提供。用户如果要获取资源,必须先登录认证中心获取令牌, 然后再通过令牌访问资源服务器, 下面是认证中心的服务端实现代码:BPg28资讯网——每日最新资讯28at.com

package mainimport (  "fmt"  "net/http"  "time"  "github.com/dgrijalva/jwt-go")var secretKey = []byte("btk.gqv7jtu7VZD1dar")func main() {  http.HandleFunc("/login", handleLogin)  http.ListenAndServe(":8080", nil)}func handleLogin(w http.ResponseWriter, r *http.Request) {  // 在实际应用中,这里应该有用户认证的逻辑,为了简化,这里直接使用一个固定用户  userID := "9527"  tokenString, err := createToken(userID)  if err != nil {    http.Error(w, "创建令牌失败", http.StatusInternalServerError)    return  }  // 将 JWT 令牌附加到响应中  w.Header().Set("Authorization", "Bearer "+tokenString)  w.WriteHeader(http.StatusOK)  fmt.Fprintf(w, "登录成功. Token: %s", tokenString)}func createToken(userID string) (string, error) {  // 创建负载  payload := jwt.MapClaims{    "user": userID,    "exptime": time.Now().Add(time.Minute * 15).Unix(), // 令牌过期时间为15分钟  }  // 创建 Token  token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)  // 签名并获取完整的 Token 字符串  tokenString, err := token.SignedString(secretKey)  if err != nil {    return "", err  }  return tokenString, nil}

在上面的代码中, 认证中心服务端在本地监听8080端口, 用来模拟处理用户的登录请求, 在收到用户请求之后, 服务端根据用户ID调用JWT的方法生成Token, 并将Token设置到HTTP头的Authorization字段中返回给客户端。BPg28资讯网——每日最新资讯28at.com

接下来实现资源提供的服务端,参考代码如下:BPg28资讯网——每日最新资讯28at.com

package mainimport (  "fmt"  "net/http"  "github.com/dgrijalva/jwt-go")var secretKey = []byte("btk.gqv7jtu7VZD1dar")func main() {  http.HandleFunc("/resource", handleResource)  http.ListenAndServe(":8081", nil)}func handleResource(w http.ResponseWriter, r *http.Request) {  // 从请求中获取 Authorization 头  authHeader := r.Header.Get("Authorization")  if authHeader == "" {    http.Error(w, "未找到Authorization字段", http.StatusUnauthorized)    return  }  // 解析JWT令牌  tokenString := authHeader[len("Bearer "):]  token, err := parseToken(tokenString)  if err != nil || !token.Valid {    http.Error(w, "令牌不合法", http.StatusUnauthorized)    return  }  // 获取负载信息  claims, ok := token.Claims.(jwt.MapClaims)  if !ok {    http.Error(w, "令牌不合法", http.StatusUnauthorized)    return  }  userID, ok := claims["user"].(string)  if !ok {    http.Error(w, "访问令牌中的用户不存在", http.StatusUnauthorized)    return  }  // 在实际应用中,这里可以根据 userID 获取用户信息或提供资源  // 这里只是一个简单的示例  response := fmt.Sprintf("用户ID%s获取资源成功!", userID)  w.WriteHeader(http.StatusOK)  fmt.Fprintf(w, response)}func parseToken(tokenString string) (*jwt.Token, error) {  // 解析 Token 字符串  token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {    return secretKey, nil  })  if err != nil {    return nil, err  }  return token, nil}

在上面的代码中, 资源服务端监听本地的8081端口, 当接收到用户请求之后, 首先从请求头中的Authorization字段获取Token令牌, 并对令牌进行解析, 如果正确解析出用户ID, 返回该用户的资源信息。BPg28资讯网——每日最新资讯28at.com

4.验证实现结果

将上面两段代码分别编译成两个独立Server端,并开启两个窗口分别运行。首先请求SSO服务端, 返回结果如下:BPg28资讯网——每日最新资讯28at.com

图片图片BPg28资讯网——每日最新资讯28at.com

从上图可知,SSO服务端成功返回了一个Token令牌, 下面先不用Token访问一下资源服务器试试:BPg28资讯网——每日最新资讯28at.com

图片图片BPg28资讯网——每日最新资讯28at.com

从上图可以看到,没有令牌无法正常请求到所需资源, 下面使用Apifox新建一个请求, 在里面加上Token, 如图:BPg28资讯网——每日最新资讯28at.com

图片图片BPg28资讯网——每日最新资讯28at.com

保存之后, 带着Token请求一下资源服务端, 如图:BPg28资讯网——每日最新资讯28at.com

图片图片BPg28资讯网——每日最新资讯28at.com

可以看到, 成功返回了资源, 整个流程测试成功。BPg28资讯网——每日最新资讯28at.com


BPg28资讯网——每日最新资讯28at.com


BPg28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-60955-0.html用Go模拟实现单点登录Token生成和验证解析

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Rust越来越流行了!盘点使用Rust的五大项目

下一篇: 基于Doris ,打造快速、安全、高可靠的实时数据仓库

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
Top