2.3 曝光!大厂都是这样设计API安全策略的!
在构建高可用、高安全性的通知平台时,API安全策略是至关重要的一环。无论是防止恶意攻击、保护敏感数据,还是确保系统的稳定运行,都需要一套完善的安全机制。本节将深入探讨大厂常用的API安全策略设计方法,并提供实际的Go代码实现。
API安全的核心要素
API安全策略通常包括以下几个核心要素:
- 身份认证(Authentication):确认用户身份的真实性
- 权限授权(Authorization):确定用户是否有权限访问特定资源
- 数据加密(Encryption):保护数据在传输和存储过程中的安全
- 访问控制(Access Control):限制用户对资源的访问方式和频率
- 安全审计(Security Audit):记录和监控安全相关事件
身份认证机制
JWT(JSON Web Token)认证
JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
// JWTAuth JWT认证器typeJWTAuthstruct{// 签名密钥secretKey[]byte// 令牌过期时间expireDuration time.Duration}// Claims JWT声明typeClaimsstruct{// 业务方IDBizIDstring`json:"biz_id"`// 权限列表Permissions[]string`json:"permissions"`// 注册的标准声明jwt.StandardClaims}// NewJWTAuth 创建JWT认证器funcNewJWTAuth(secretKeystring,expireDuration time.Duration)*JWTAuth{return&JWTAuth{secretKey:[]byte(secretKey),expireDuration:expireDuration,}}// GenerateToken 生成JWT令牌func(ja*JWTAuth)GenerateToken(bizIDstring,permissions[]string)(string,error){// 设置令牌过期时间expirationTime:=time.Now().Add(ja.expireDuration)// 创建声明claims:=&Claims{BizID:bizID,Permissions:permissions,StandardClaims:jwt.StandardClaims{ExpiresAt:expirationTime.Unix(),IssuedAt:time.Now().Unix(),Issuer:"notification-platform",},}// 创建令牌token:=jwt.NewWithClaims(jwt.SigningMethodHS256,claims)// 签名令牌tokenString,err:=token.SignedString(ja.secretKey)iferr!=nil{return"",fmt.Errorf("failed to sign token: %w",err)}returntokenString,nil}// ValidateToken 验证JWT令牌func(ja*JWTAuth)ValidateToken(tokenStringstring)(*Claims,error){claims:=&Claims{}// 解析令牌token,err:=jwt.ParseWithClaims(tokenString,claims,func(token*jwt.Token)(interface{},error){// 验证签名方法if_,ok:=token.Method.(*jwt.SigningMethodHMAC);!ok{returnnil,fmt.Errorf("unexpected signing method: %v",token.Header["alg"])}returnja.secretKey,nil})iferr!=nil{returnnil,fmt.Errorf("failed to parse token: %w",err)}// 验证令牌有效性if!token.Valid{returnnil,fmt.Errorf("invalid token")}// 检查是否过期ifclaims.ExpiresAt<time.Now().Unix(){returnnil,fmt.Errorf("token expired")}returnclaims,nil}// RefreshToken 刷新JWT令牌func(ja*JWTAuth)RefreshToken(tokenStringstring)(string,error){claims,err:=ja.ValidateToken(tokenString)iferr!=nil{return"",fmt.Errorf("invalid token: %w",err)}// 生成新的令牌newToken,err:=ja.GenerateToken(claims.BizID,claims.Permissions)iferr!=nil{return"",fmt.Errorf("failed to generate new token: %w",err)}returnnewToken,nil}OAuth 2.0认证
OAuth 2.0是一种授权框架,允许第三方应用在用户授权的情况下访问用户资源,而无需获取用户的密码。
// OAuth2Auth OAuth2认证器typeOAuth2Authstruct{// 客户端存储clientStore ClientStore// 令牌存储tokenStore TokenStore// 配置config*OAuth2Config}// OAuth2Config OAuth2配置typeOAuth2Configstruct{// 令牌过期时间AccessTokenExpire time.Duration// 刷新令牌过期时间RefreshTokenExpire time.Duration// 授权码过期时间AuthCodeExpire time.Duration}// Client 客户端信息typeClientstruct{// 客户端IDIDstring`json:"id" db:"id"`// 客户端密钥Secretstring`json:"secret" db:"secret"`// 域名列表Domains[]string`json:"domains" db:"domains"`// 重定向URL列表RedirectURLs[]string`json:"redirect_urls" db:"redirect_urls"`}// Token 令牌信息typeTokenstruct{// 访问令牌AccessTokenstring`json:"access_token"`// 刷新令牌RefreshTokenstring`json:"refresh_token"`// 令牌类型TokenTypestring`json:"token_type"`// 过期时间(秒)ExpiresInint64`json:"expires_in"`// 业务方IDBizIDstring`json:"biz_id"`// 权限范围Scopestring`json:"scope"`// 创建时间CreatedAt time.Time`json:"created_at"`}// ClientStore 客户端存储接口typeClientStoreinterface{// GetClientByID 根据ID获取客户端GetClientByID(idstring)(*Client,error)// ValidateClient 验证客户端ValidateClient(id,secretstring)bool}// TokenStore 令牌存储接口typeTokenStoreinterface{// CreateToken 创建令牌CreateToken(token*Token)error// GetTokenByAccessToken 根据访问令牌获取令牌信息GetTokenByAccessToken(accessTokenstring)(*Token,error)// GetTokenByRefreshToken 根据刷新令牌获取令牌信息GetTokenByRefreshToken(refreshTokenstring)(*Token,error)// DeleteToken 删除令牌DeleteToken(accessTokenstring<