根据https://www.godoc.org/golang.org/x/oauth2#Config.AuthCodeURL的文档
...State 是保护用户免受 CSRF 攻击的令牌。您必须始终提供一个非零字符串...
并在https://www.rfc-editor.org/rfc/rfc6749#section-10.12
...发送到重定向 URI 端点以包含绑定请求的值的任何请求...
然而,这具体是在流程中没有会话数据的部分,即用户尚未登录并且仅在显示匿名页面时生成授权代码。
那么这个值如何随机化并在回调时进行比较呢?它是每个服务器随机的静态值吗?
状态
受到推崇的。客户端使用的不透明值来维护请求和回调之间的状态。授权服务器在将用户代理重定向回客户端时包含此值。该参数应该用于防止跨站点请求伪造,如第 10.12 节中所述。
您用于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
}
Run Code Online (Sandbox Code Playgroud)