Cross Domain Login – Como fazer login de um usuário automaticamente quando transferido de um domínio para outro

Oferecemos vários serviços online. Somos obrigados a desenvolver um sistema que forneça uma experiência rápida / simples para os usuários, se eles forem transferidos de um serviço (em domain1.com ) para outro serviço (em domain2.com ).

Existe uma maneira segura de acessar automaticamente um usuário automaticamente depois que ele é transferido para o novo serviço?

Grite comigo se a solução abaixo é completamente insegura / errada.

Estávamos considerando um sistema semelhante ao fornecido por vários serviços on-line para recuperação de senha – eles recebem um link por e-mail com um hash exclusivo que expira, o que permite que eles alterem sua senha.

O domain1.com geraria um hash exclusivo e o armazenaria em um database com o hash vinculado a um usuário, juntamente com um campo expire datetime.

O usuário será transferido para domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e

domain2.com em seguida faria uma solicitação para domain1.com com o hash para obter as informações sobre o usuário. domain1.com então removeria o hash do database. domain2.com registraria o usuário e definiria o cookie etc.

Alguma coisa com base no OpenID ou OAuth poderia alcançar os mesmos resultados?

    Single sign-on (SSO) é conceitualmente bem simples.

    • O usuário domain1.com .
    • domain1.com vê que não há nenhum cookie de session.
    • domain1.com redireciona para sso.com
    • sso.com apresenta a página de login e recebe credenciais
    • sso.com define cookie de session para o usuário
    • sso.com seguida, redireciona de volta para o domain1 para um URL especial (como domain1.com/ssologin )
    • ssologin URL do ssologin contém um parâmetro que é basicamente “assinado” pelo sso.com . Pode ser tão simples quanto uma base64 de criptografar o loginid usando uma chave secreta compartilhada.
    • domain1.com pega o token criptografado, descriptografa, usa o novo ID de login para fazer o login no usuário.
    • domain1 define o cookie de session para o usuário.

    Agora, o próximo caso.

    • O usuário sso.com domain2.com , que segue domain1 e redireciona para sso.com
    • sso.com já tem um cookie para o usuário, por isso não apresenta a página de login
    • sso.com redireciona de volta para domain2.com com as informações criptografadas
    • domain2.com registra no usuário.

    Esses são os fundamentos de como isso funciona. Você pode torná-lo mais robusto, mais rico em resources (por exemplo, isso é SSOn , mas não SSOff , o usuário pode “sair” do domain1 , mas ainda assim estar logado no domain2 ). Você pode usar chaves públicas para assinar credenciais, você pode ter solicitações para transferir mais informações (como direitos de autorização, etc) do servidor SSO. Você pode ter uma integração mais íntima, como os domínios verificando rotineiramente se o usuário ainda tem direitos do servidor SSO.

    Mas o handshake do cookie através do navegador usando redirecionamentos é a base fundamental sobre a qual todas essas soluções SSO são baseadas.

    Se alguém fosse capaz de interpretar o homem no meio e pegar esse hash, ele seria capaz de roubar a transferência de domínio cruzado? Obviamente, ele precisa ser gerado e enviado ao cliente antes de precisar usá-lo. Então diga por exemplo:

    Eu estou jogando homem no meio espionando Jack. Jack acessa domain1.com que faz com que um hash seja preparado e enviado para ele, de modo que, quando ele acessa domain2.com ele possa enviar esse hash como autenticação. Quando ele acessa domain1.com , seu pedido vem através de mim, você retorna a página, eu pego o hash e o deixo continuar. Eu access o domain2.com usando o hash, você agora me deixa entrar no domain2.com e domain2.com o hash. Ele não é o mais sábio até que ele tenta acessar o domain2.com e é informado de que suas credenciais não são mais válidas.

    Como você supera isso?

    Não haveria nenhum ponto usando SSL para o login entre domínios, a menos que você use SSL para toda a session. É tão fácil roubar um cookie de session quanto usar um hash em um URL. Qual é o ponto em esconder o hash em SSL se o resto da session é inseguro.

    O método dado no topo é praticamente o método padrão. Se você optar por usar protocolos seguros é outra questão, mas seria inútil criptografar somente parte da session.

    Esta é uma boa solução. Aqui estão dois pontos a serem considerados:

    Você usa o termo “hash”, mas não está claro quais dados você terá. Em vez disso, use um “nonce”: um número grande (128 bits) gerado por um RNG de qualidade criptográfica.

    Além disso, você não especificou isso, mas as comunicações entre o usuário e os dois domínios, e entre os próprios domínios, devem ser seguras. Use SSL para autenticar os servidores e manter o nonce confidencial.

    E quanto a SEO? Parece que todas as solicitações antes de um login bem-sucedido são redirecionadas para outro domínio e vice-versa. Eu diria que isso é muito feio. Quais headers você deve enviar? 301 para SSO e depois de volta 301 para a página original? Então bot de busca é “solicitado” para alterar seu índice para essa página duas vezes?