2

我正在使用带有 revel 的 oauth 包“code.google.com/p/goauth2/oauth”,它创建了一些包含大量信息的结构。我需要这些信息在整个会话中保持不变,但会话只能是字符串类型。有没有比以下更好的方法?

c.Session["AccessToken"] = t.Token.AccessToken
c.Session["RefreshToken"] = t.Token.RefreshToken
...

如果不是,我如何重新分配字符串以创建另一个结构来调用 Client.Get() ?

4

2 回答 2

1

您可以使用该json包将结构“转换”为string,反之亦然。只知道只有导出的字段以这种方式序列化。

由于oauth.Token只有导出的字段,这将起作用:

if data, err := json.Marshal(t.Token); err == nil {
    c.Session["Token"] = string(data)
} else {
    panic(err)
}

这就是您可以从会话中重建令牌的方式:

if err := json.Unmarshal([]byte(c.Session["Token"]), &t.Token); err != nil {
    panic(err)
}
于 2015-02-27T08:04:29.443 回答
0

取而代之的是,您可以尝试将一些字符串 ID 保存到Session您需要的对象中Cache

c.Session["id"] = id
go cache.Set("token_"+id, t.Token, 30*time.Minute)

然后按如下方式使用它:

var token oauth.Token

id := c.Session["id"]
if err := cache.Get("token_"+id, &token); err != nil {
    // TODO: token not found, do something
}

// TODO: use your token here...

这种方法的优点是您不必json显式地使用包,并且缓存有几个开箱即用的不同后端:内存、redis、memcached。此外,您没有 4K 的限制,如Cookie基于Session.

https://revel.github.io/manual/cache.html

于 2015-04-07T10:24:07.883 回答