何时在 oauth2 中随机化身份验证代码/状态?

dav*_*mer 3 go oauth-2.0

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

...State 是保护用户免受 CSRF 攻击的令牌。您必须始终提供一个非零字符串...

并在https://www.rfc-editor.org/rfc/rfc6749#section-10.12

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

然而,这具体是在流程中没有会话数据的部分,即用户尚未登录并且仅在显示匿名页面时生成授权代码。

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

Dan*_*ilo 5

状态

受到推崇的。客户端使用的不透明值来维护请求和回调之间的状态。授权服务器在将用户代理重定向回客户端时包含此值。该参数应该用于防止跨站点请求伪造,如第 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
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在一段时间后使陈旧状态过期。大约 5 分钟应该就足够了。 (2认同)