我在docker中使用Go和ory kratos,在localhost上的我的机器上一切正常。身份验证工作,所有cookie都已发送和设置,我可以从SPA调用我的后端并进行身份验证。
问题是,在后面的实时服务器上,显然没有从我的js客户端发送一个cookie(仅发送而不是cookie),并且它在功能中失败,cookie丢失错误。nginxsslory_kratos_sessionxxx_csrf_token
它使用官方的go sdk:kratos-client-go
Go 身份验证必需的中间件
func ExtractKratosCookiesFromRequest(r *http.Request) (csrf, session *http.Cookie, cookieHeader string) {
cookieHeader = r.Header.Get("Cookie")
cookies := r.Cookies()
for _, c := range cookies {
if c != nil {
if ok := strings.HasSuffix(c.Name, string("csrf_token")); ok {
csrf = c
}
}
}
sessionCookie, _ := r.Cookie("ory_kratos_session")
if sessionCookie != nil {
session = sessionCookie
}
return
}
func AuthRequired(w http.ResponseWriter, r *http.Request) error {
csrfCookie, sessionCookie, cookieHeader := ExtractKratosCookiesFromRequest(r)
if (csrfCookie == nil || sessionCookie == nil) || (csrfCookie.Value == "" || sessionCookie.Value == "") {
return errors.New("Cookie missing")
}
req := kratos.PublicApi.Whoami(r.Context()).Cookie(cookieHeader)
kratosSession, _, err := req.Execute()
if err != nil {
return errors.New("Whoami error")
}
return nil
}
我的 js http 客户端有选项:.credentials: 'include'
在devtools面板中,我只看到1个cookie()在注册/登录后。ory_kratos_session
因此,失败的是请求仅发送而不是cookie(在kratos模式下工作,并且cookie在devtools面板中是可行的)ory_kratos_sessionxxx_csrf_tokenlocalhost--dev
慕桂英546537
12345678_0001
相关分类