package Sso import ( "dsBaseWeb/Model" "dsBaseWeb/Utils/CommonUtil" "dsBaseWeb/Utils/ConfigUtil" "dsBaseWeb/Utils/LogUtil" "dsBaseWeb/Utils/RedisUtil" "encoding/base64" "github.com/gin-gonic/gin" "github.com/valyala/fasthttp" "net/http" "strings" ) //模块的路由配置 func Routers(r *gin.RouterGroup) { rr := r.Group("/sso") //配置接口 rr.GET("/CheckSsoCode", CheckSsoCode) rr.GET("/Logout", Logout) return } /** 功能:清除缓存中的access_token */ func Logout(c *gin.Context) { accessToken := c.Query("access_token") RedisUtil.DEL(accessToken) c.JSON(200, Model.Res{ Success: true, Message: "操作成功!", }) } func CheckSsoCode(c *gin.Context) { //获取统一认证返回的code code := c.Query("code") //获取最终访问的地址,并baes64解密 reqCallBackURLBytes, _ := base64.StdEncoding.DecodeString(c.Query("oauth_callback")) reqCallBackURL := string(reqCallBackURLBytes) host := c.Request.Host ssoServer := "" clientId := "" clientSecret := "" redirectURI := "" ipStart := strings.Split(host, ".")[0] isIntranetIPBool := false isIntranetIPArr := strings.Split(ConfigUtil.IntranetIP, ",") for i := 0; i < len(isIntranetIPArr); i++ { if ipStart == isIntranetIPArr[i] { isIntranetIPBool = true } } if isIntranetIPBool { //true为内网 ssoServer = ConfigUtil.SsoServerNw clientId = ConfigUtil.ClientIdNw clientSecret = ConfigUtil.ClientSecretNw redirectURI = ConfigUtil.RedirectURINw } else { ssoServer = ConfigUtil.SsoServerWw clientId = ConfigUtil.ClientIdWw clientSecret = ConfigUtil.ClientSecretWw redirectURI = ConfigUtil.RedirectURIWw } //拼统一认证验证code接口地址 checkCodeUrl := ssoServer + ConfigUtil.AuthTokenURI //拼统一认证验证code接口需要的参数 args := &fasthttp.Args{} args.Add("code", code) args.Add("client_id", clientId) args.Add("client_secret", clientSecret) args.Add("grant_type", ConfigUtil.GrantType) args.Add("redirect_uri", redirectURI) //用POST调用统一认证验证code接口 statusCode, resp, err := fasthttp.Post(nil, checkCodeUrl, args) if err != nil { LogUtil.Error("错误信息: ", err.Error()) LogUtil.Error("statusCode: ", CommonUtil.ConvertIntToString(statusCode)) return } //统一认证返回的信息 respMap := CommonUtil.ConvertJsonStringToMap(string(resp)) if respMap["code"].(float64) != 200 { LogUtil.Error("错误信息: ", respMap["msg"].(string)) return } accessToken := respMap["access_token"].(string) personId := respMap["person_id"].(string) identityId := CommonUtil.ConvertInt32ToString(int32(respMap["identity_id"].(float64))) //生成token,在拦截中会进行校验,防止cookie被篡改 token := CommonUtil.MD5([]byte(personId + "_" + identityId + "_dsideal4r5t6y7u")) //写cookie c.SetCookie(ConfigUtil.AccessTokenKey, accessToken, 0, "/", "", false, true) c.SetCookie("person_id", personId, 0, "/", "", false, true) c.SetCookie("identity_id", identityId, 0, "/", "", false, true) c.SetCookie("token", token, 0, "/", "", false, true) //将返回的access_token写入到redis RedisUtil.SET(accessToken, "1") RedisUtil.EXPIRE(accessToken) //跳转到最终访问的地址 c.Redirect(http.StatusMovedPermanently, reqCallBackURL) }