何时在oauth2中随机化auth代码/状态?

时间:2016-02-22 15:59:41

标签: go oauth-2.0

根据https://www.godoc.org/golang.org/x/oauth2#Config.AuthCodeURL

的文件
  

...状态是保护用户免受CSRF攻击的标记。您必须始终提供非零字符串...

http://tools.ietf.org/html/rfc6749#section-10.12

  

...发送到重定向URI端点的任何请求都包含一个绑定请求的值...

然而,当没有会话数据时,特别是流程中的部分,即用户尚未登录,并且仅在显示匿名页面时生成验证码。

如何将这个值随机化并在回调时进行比较?它是每个服务器随机化的静态值吗?

1 个答案:

答案 0 :(得分:1)

  

状态

     

推荐。客户端用于维护的不透明值      请求和回调之间的状态。授权      服务器在重定向用户代理时包含此值      给客户。该参数应该用于防止      跨站点请求伪造,如第10.12节所述。

     

RFC 6749

您使用state来识别授权服务器的回调与发送的请求相匹配。如果没有state攻击者可以使用您未请求的随机访问令牌调用您的回调URL。使用state,您知道被叫回调是为了响应您的请求。

因此,您根据发送的请求随机化state并跟踪它,直到您收到匹配的回调为止。只要无法猜到,它就可以是你想要的任何东西。

一种简单的方法是利用rand.Reader和base64编码结果:

func state(n int) (string, error) {
    data := make([]byte, n)
    if _, err := io.ReadFull(rand.Reader, data); err != nil {
        return "", err
    }
    return base64.StdEncoding.EncodeToString(data), nil
}