É possível fazer uma sessão entre servidores usando gorila / sessões? Suponha que eu tenha vários servidores para servir um site. Se o usuário fizer login em um servidor, espero que ele também faça login em outro servidor.
@CasperHK Isso é o que você obtém por padrão com os cookies: contanto que os servidores façam parte do mesmo domínio (por exemplo, github.com ou * .github.com), o cookie será enviado pelo navegador.
Como alternativa, as sessões também oferecem suporte a armazenamentos do lado do servidor - todos os servidores precisam ser capazes de se conectar a esse armazenamento (seja Redis ou PostgreSQL, etc).
gorilla/session
parece ótimo para minha tarefa. Na verdade, eu quero usar Go no meu projeto de último ano na minha universidade e agora tenho 12 servidores ubuntu sob o mesmo domínio. Alguns deles serão usados como servidores web e um será usado como um servidor de banco de dados MySQL. Portanto, desejo implementar um serviço de sessão baseado em MySQL para permitir a sincronização dos dados da sessão em todos os servidores da web.
Anteriormente, tentei programar a sessão de servidor cruzado baseada em MySQL. Se srinathgs/mysqlstore
fornecem uma maneira mais fácil de fazer o mesmo, é ótimo para mim estudar e simplificar meu trabalho.
Use o CookieStore padrão e, se todos os servidores tiverem a mesma chave de assinatura,
e existir no mesmo domínio, ele funcionará como está.
No domingo, 24 de julho de 2016 às 22h48, Casper LI [email protected] escreveu:
gorila / sessão parece ótimo para minha tarefa. Na verdade, eu quero usar Go no meu
projeto de último ano na minha universidade e agora tenho 12 servidores ubuntu sob
o mesmo domínio. Alguns deles serão usados como servidores web e um será
usado como um servidor de banco de dados MySQL. Portanto, quero implementar um
Serviço de sessão baseado em MySQL para permitir a sincronização dos dados da sessão em toda a web
servidores.
Anteriormente, tentei programar a sessão de servidor cruzado baseada em MySQL. Se "
github.com/gorilla/sessions "fornecem uma maneira mais fácil de fazer o mesmo, é
ótimo para eu estudar e simplificar meu trabalho.-
Você está recebendo isto porque foi designado.Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/gorilla/sessions/issues/87#issuecomment -234845955,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AABIcNfC7H8DrZq5NX1Tu7W_Vd1LM5BIks5qZE43gaJpZM4JTizF
.
Desculpe, gostaria de perguntar qual é o CookieStore padrão e a chave de assinatura? CookieStore significa gorilla/sessions
pacote?
sim. Dê uma olhada em http://www.gorillatoolkit.org/pkg/sessions -
something-very-secret
é a chave de assinaturasessions.NewCookieStore
retorna um *CookieStore
, que não requer um banco de dados / estado compartilhado entre seus servidores.import (
"net/http"
"github.com/gorilla/sessions"
)
var store = sessions.NewCookieStore([]byte("something-very-secret"))
func MyHandler(w http.ResponseWriter, r *http.Request) {
// Get a session. We're ignoring the error resulted from decoding an
// existing session: Get() always returns a session, even if empty.
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// Set some session values.
session.Values["foo"] = "bar"
session.Values[42] = 43
// Save it before we write to the response/return from the handler.
session.Save(r, w)
}
Eu li o código. Quando eu olho para
var store = sessions.NewCookieStore([]byte("something-very-secret"))
Eu me pergunto se a variável store
é usada em todos os manipuladores durante todo o projeto. Em caso afirmativo, parece que preciso embrulhá-lo em outro pacote e exportá-lo. Isso ocorre porque eu separei todos os manipuladores diferentes em pacotes diferentes de acordo com a página que eles estão servindo, (por exemplo, index
, projbrwsr
, codeeditor
) e esses manipuladores têm que chamar o mesmo Store
.
something-very-secret
é considerada uma chave secreta, mas não tenho nenhuma idéia do que devo passar para a função NewCookieStore()
.
Injetar armazenamento (sessões.Armazenamento) como uma dependência em seus outros pacotes.
Na segunda-feira, 25 de julho de 2016 às 8:57 AM Casper LI [email protected] escreveu:
Eu li o código. Quando eu olho para
var store = sessions.NewCookieStore ([] byte ("algo muito secreto"))
Eu me pergunto se a variável store é usada em todos os manipuladores ao longo de
o projeto. Em caso afirmativo, parece que preciso embrulhá-lo em outro pacote e
torná-lo exportado. Isso ocorre porque separei todos os diferentes manipuladores em
pacotes diferentes de acordo com a página que estão servindo, (por exemplo, índice,
projbrwsr, codeeditor) e esses manipuladores devem chamar para o mesmo Store.
[imagem: imagem]
https://cloud.githubusercontent.com/assets/6957401/17107410/a34dcc50-52c1-11e6-92f7-a4227da60244.png-
Você está recebendo isto porque foi designado.Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/gorilla/sessions/issues/87#issuecomment -234996994,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AABIcOHzeq8IabUoj-SZx_B-7er-PJf9ks5qZNzsgaJpZM4JTizF
.
alguma coisa-muito-secreta é considerada uma chave secreta, mas não tenho nenhuma ideia do que devo passar para a função NewCookieStore ().
https://godoc.org/github.com/gorilla/sessions#NewCookieStore
As chaves são definidas em pares para permitir a rotação de chaves, mas o caso comum é definir uma única chave de autenticação e, opcionalmente, uma chave de criptografia.
A primeira chave em um par é usada para autenticação e a segunda para criptografia. A chave de criptografia pode ser definida como nula ou omitida no último par, mas a chave de autenticação é necessária em todos os pares.
NewCookieStore
usa uma chave de autenticação / assinatura e uma chave de criptografia (opcional).
Desculpe, sou muito novo para ir. Você poderia explicar mais sobre Inject store
ou me dar um link para uma explicação? Obrigada.
@CasperHK Faça com que os construtores de seus pacotes aceitem suas dependências - por exemplo
NewProjectBrowser(store sessions.Store, debug bool) (*ProjectBrowser, error) { ... }
NewCodeEditor(store sessions.Store) (*CodeEditor, error) { ... }
Em main.go
func main() {
// Create a store, and then pass it (inject it) into your other packages via their constructors
store := sessions.NewCookieStore(key)
...
ce, err := package.NewCodeEditor(store)
...
pb, err := package.NewProjectBrowser(store)
...
}
Fechando por inatividade.
Comentários muito úteis
@CasperHK Isso é o que você obtém por padrão com os cookies: contanto que os servidores façam parte do mesmo domínio (por exemplo, github.com ou * .github.com), o cookie será enviado pelo navegador.
Como alternativa, as sessões também oferecem suporte a armazenamentos do lado do servidor - todos os servidores precisam ser capazes de se conectar a esse armazenamento (seja Redis ou PostgreSQL, etc).