登录
首页 >  Golang >  Go问答

Go Gorilla 会话在托管于 Apache Web 服务器时遇到问题

来源:stackoverflow

时间:2024-02-11 15:57:23 455浏览 收藏

本篇文章给大家分享《Go Gorilla 会话在托管于 Apache Web 服务器时遇到问题》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

这是我的会话化登录表单的 go 代码

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/context"
    "github.com/gorilla/sessions"
)

var store = sessions.newcookiestore([]byte("super-secret"))

func loginauthhandler(w http.responsewriter, r *http.request) {
    r.parseform()
    username := r.formvalue("username")
    password := r.formvalue("password")

    if password == "welcome" && username == "guest" {

        session, _ := store.get(r, "session")
        session.values["authenticated"] = true

        err := session.save(r, w)
        if err != nil {
            http.error(w, err.error(), http.statusinternalservererror)
            return
        }

        http.redirect(w, r, "/secret", http.statusfound)
    } else {
        fmt.fprintf(w, "wrong login!")
    }
}

func secret(w http.responsewriter, r *http.request) {
    session, _ := store.get(r, "session")

    if auth, ok := session.values["authenticated"].(bool); !ok || !auth {
        http.error(w, "forbidden", http.statusforbidden)
        return
    }

    fmt.fprintf(w, "the cake is a lie!")

}

func main() {
    store.options = &sessions.options{
        domain:   "localhost",
        path:     "/",
        maxage:   3600 * 8,
        httponly: true,
    }

    http.handlefunc("/secret", secret)
    http.handlefunc("/loginauth", loginauthhandler)
    http.handle("/", http.fileserver(http.dir("public")))
    log.fatal(http.listenandserve(":3003", context.clearhandler(http.defaultservemux)))
}

出于某种原因,当我在本地托管服务器时,这可以工作,但是当我尝试在我的 digital ocean droplet 上的 linux apache web 服务器上托管它时,它停止工作。该网站甚至正确重定向到秘密端点,但它显示“禁止”消息,因为 cookie 从未设置。 apache 上的托管是否存在某种差异导致了这种情况?

这是我用来在我的服务器上为 apache 设置代理的代码,除了我将服务器大部分保留为默认值之外。

#go
    ProxyPass /go http://localhost:3003
    ProxyPassReverse /go http://localhost:3003

正确答案


您正在将 store.options.domain 设置为 localhostdomain 在构建会话 cookie 时使用;这意味着 cookie domain attribute 将被设置为 localhost

由于您将服务器托管在云服务器上的 apache 反向代理后面,因此您将无法使用 localhost url(例如 http://localhost/go)访问它。这意味着您的 url 中的域不会是 localhost 并且 cookie 将被有效地忽略。请参阅 this question 了解更多信息。

快速修复方法是保持 domain 未设置,例如

store.Options = &sessions.Options{
        Path:     "/",
        MaxAge:   3600 * 8,
        HttpOnly: true,
    }

注意:如果您这样做,cookie 将无法在子域上使用(但在测试时这可能不是问题)。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>