在 revel 中,session 仅支持字符串类型值,但可通过 json 序列化/反序列化高效、安全地存取 oauth token 等结构体对象,避免手动拆解字段,提升可维护性与健壮性。
Revel 的 Session 机制底层基于 map[string]string,因此无法直接存储 Go 结构体(如 oauth.Token)。但无需逐字段拆解为多个 session 键(如 "AccessToken"、"RefreshToken"),推荐使用标准库 encoding/json 进行统一序列化——这既简洁又符合单一职责原则,也便于未来结构扩展。
假设你已通过 goauth2/oauth 获取到 t.Token(类型为 *oauth.Token),其所有字段均为导出字段(首字母大写),满足 JSON 序列化要求:
import "encoding/json" // 存储:将 Token 结构体序列化为 JSON 字符串并存入 Session if data, err := json.Marshal(t.Token); err == nil { c.Session["OAuthToken"] = string(data) } else { c.Result = c.RenderError("Failed to serialize token: " + err.Error()) return }
读取时需先检查键是否存在,并确保反序列化目标为地址(使用 &t.Token):
tokenData := c.Session["OAuthToken"]
if tokenData == "" {
c.Result = c.RenderError("OAuth token not found in session")
return
}
var token oauth.Token
if err := json.Unmarshal([]byte(tokenData), &token); err != nil {
c.Result = c.RenderError("Failed to parse token from session: " + err.Error())
return
}
// 现在可安全用于构建 HTTP 客户端
client := &http.Client{}
// ... 使用 token 创建授权客户端,例如调用 Client.Get()通过该方式,你不仅解决了类型限制问题,还让会话数据具备结构化、可验证、易调试的特性,是 Revel 应用集成 OAuth 的推荐实践。