As sessões são uma opção popular para autenticação de usuários na web. Uma sessão é um período durante o qual um usuário se envolve ativamente com um aplicativo. O tempo de vida de uma sessão começa quando um usuário efetua login e termina quando ele efetua logout.

O HTTP é um protocolo sem estado, portanto, muitas vezes você precisará rastrear a atividade do usuário manualmente.

No lado do servidor do seu aplicativo, você pode gerar um valor exclusivo, preferencialmente um valor criptograficamente seguro. Você pode armazenar isso em um cookie que o cliente enviará ao seu aplicativo em solicitações futuras, criando uma forma de estado.

Sessões em andamento

Você pode usar o pacote net/http para implementar sessões, e há muitos pacotes disponíveis que já fazem isso. O mais popular é o pacote de sessões Gorilla. Este pacote fornece funcionalidade de armazenamento de cookies e arquivos juntamente com a infraestrutura de back-end de sessão personalizada.

Execute este comando em seu espaço de trabalho Go para instalar o pacote de sessões do Gorilla.

instagram viewer
vai obtenha github.com/gorilla/sessions

Neste tutorial, você usará um armazenamento de cookies para sessões. Você usará o pacote net/http para iniciar um servidor web que verificará o problema do usuário e revogará as sessões.

Aqui está a lista de importações que você precisará seguir este tutorial.

importar (
"github.com/gorilla/sessions"
"registro"
"rede/http"
)

o registro pacote é para operações relacionadas ao registro com base no status da autenticação do usuário.

Uma implementação simples de armazenamento de cookies

Você precisará de um armazenamento de cookies para suas funções de gerenciador de login e logout. Para sua loja de cookies, você precisará de uma chave secreta para autenticação.

Aqui está uma função para a implementação do armazenamento de cookies.

// função cookieStore cria um armazenamento de cookies com a chave secreta do usuário
funçãocookieStore() *sessões.CookieStore {
Chave Secreta := []byte("super-secreto-SecretKey")
cookieStore := sessões. NewCookieStore (SecretKey)

// função retorna o armazenamento de cookies para que outras funções possam acessá-lo
Retorna cookieStore
}

No cookieStore função, a variável de chave secreta declarada Chave secreta é um exemplo de chave secreta. Em produção, sua chave secreta deve ser criptograficamente segura, usando o pacote de criptografia, por exemplo. Você também deve carregar o segredo de um arquivo de variáveis ​​de ambiente.

A função retorna um valor de *sessões. CookieStore tipo que representa o armazenamento de cookies protegido com a chave secreta. Você usará o CookieStore funcionar em seu Conecte-se e sair manipuladores para autenticar usuários e atribuir sessões.

A função do gerenciador de login

Você desejará verificar se o usuário já está logado antes de criar uma sessão em sua função de gerenciador de login. Você pode usar o Pegue método no armazenamento de cookies para recuperar uma sessão do cookie e adicionar a sessão à solicitação do cliente.

o Pegue retorna a sessão e um erro que você pode manipular. Se precisar autenticar o usuário, você pode autenticar ou autorizar no Conecte-se manipulador.

// manipulador de login recupera a sessão da loja de cookies
funçãoConecte-se(escritor http. ResponseWriter, solicite *http. Solicitar) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

E se err!= nada {
registro. Fataln (err)
}

// defina sua autenticação de usuário aqui com base na operação
sessão. Valores["status de autenticação"] = verdadeiro
erro = sessão. Salvar (solicitação, escritor)

E se err!= nada {
Retorna
}
}

A propriedade Values ​​contém os dados relacionados à sessão no armazenamento de cookies:

o Salvar método salva a sessão no armazenamento de cookies. Em seus manipuladores, você precisará de outras medidas de autenticação para maior segurança.

Verificando o status de login de um usuário

Seu manipulador de verificação deve recuperar a sessão do cookie do cliente usando o armazenamento de cookies Pegue método. Em seguida, você pode recuperar a sessão e autenticar o usuário.

funçãocheckAuthStatus(escritor http. ResponseWriter, solicite *http. Solicitar) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

E se err!= nada {
registro. Fataln (err)
}

autenticado := sessão. Valores["status de autenticação"]

E se autenticado == verdadeiro {
escritor. WriteHeader (http. StatusOK) // escreve o código de status 200
Retorna
} senão {
escritor. WriteHeader (http. StatusBadRequest) // escreve o código de status http 400
Retorna
}
}

o autenticado variável usa o Valores propriedade para recuperar o status do armazenamento de cookies. A instrução if verifica esse status de autenticação. Se avaliar para verdadeiro, o cliente recebe os 200 Código de status HTTP. Se o status de autenticação não for verdadeiro, o cliente receberá o código de status HTTP 400.

O manipulador de logout da sessão

Sua função de manipulador de logout será muito semelhante à função de manipulador de login. Você excluirá todos os dados relacionados à sessão do usuário do armazenamento de cookies e anulará o status de autenticação.

funçãosair(escritor http. ResponseWriter, solicite *http. Solicitar) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

E se err!= nada {
Retorna
}

// anula a sessão do usuário da loja de cookies
sessão. Valores["status de autenticação"] = falso
erro = sessão. Salvar (solicitação, escritor)

E se err!= nada {
Retorna
}
}

o sair A função handler anula o status de autenticação da sessão do usuário e salva o status no armazenamento de cookies.

Não armazene dados confidenciais em sessões

As sessões são ótimas para armazenar dados, mas é melhor evitar o armazenamento de dados confidenciais nelas. Um invasor pode sequestrar uma sessão se você armazenar seus dados em um cookie e enviá-lo por HTTP simples. A segurança do seu aplicativo é importante para seus usuários.

As sessões são stateful e há muitas implementações de banco de dados de armazenamentos de cookies para o pacote Gorilla, tanto para bancos de dados SQL quanto NoSQL.