Autenticação de nós remotos

O Erlang permite a autenticação de nós remotos baseada no conceito de "magic cookies". Um cookie é um átomo atribuído a cada nó. Sempre que um nó arranca é-lhe atribuído automaticamente um cookie

Existem duas BIFs para manipular cookies:

O mecanismo de autenticação por cookies funciona da seguinte forma:

  1. Sempre que uma mensagem é enviada, o nó emissor adiciona-lhe o cookie do nó receptor.
  2. O nó receptor verifica se o cookie da mensagem é o correcto.
  3. Se o cookie for correcto a mensagem é aceite. Se o cookie não é o correcto a mensagem é tratada da seguinte forma:

Desde que o cookie de um nó remoto não tenha sido explicitamente associado com erlang:set_cookie/2 o nó emissor assume que o cookie de todos os nós remotos é o átomo nocookie. Assim, inicialmente, todas as mensagens para nós remotos terão um cookie com valor nocookie.

Para que um nó N1 comunique com outro nó N2 é necessário que N1 saiba qual o cookie de N2:

A forma como N1 sabe qual o cookie de N2 não faz parte do mecanismo de autenticação do Erlang, à semelhança do problema de distribuição de chaves num algoritmo de criptografia simétrica. No entanto, para facilitar a partilha de um cookie por um conjunto de nós, possibilitando a comunicação entre os nós desse grupo, se cada nó avaliar

erlang:set_cookie(node(),Cookie)

para além de alterar o seu cookie para o valor presente em Cookie, assume que o cookie dos restantes nós é também Cookie.

Em Unix o comportamento por omissão quando se inicia um nó é ler um ficheiro no directório $HOME do utilizador normalmente chamado ".erlang.cookie" para obter o cookie desse nó. O Erlang verifica se o ficheiro está correctamente protegido contra escrita e então é executada a função erlang:set_cookie(node(),Cookie). Desta forma todos os nós lançados pelo utilizador podem comunicar entre si, desde que residam na mesma máquina. Entre máquinas diferentes é necessário assegurar que os nós partilham o mesmo cookie.

Exercícios

1) Lance a toolbar num nó existente noutra máquina.

2) Desenvolva um sistema distribuído que permita a dois utilizadores jogarem o jogo "tesoura, pedra, papel".

O jogo desenrola-se da seguinte forma: cada um dos jogadores escolhe um objecto (tesoura, pedra ou papel) e informa o árbitro da sua escolha. O objecto escolhido por cada jogador não deve ser conhecido pelo seu adversário. O árbitro é responsável por determinar o resultado, que é calculado em função da combinação dos objectos escolhidos:

O jogador que escolher o objecto vencedor, recebe uma mensagem de vitória, o outro de derrota. Em caso de empate, ambos recebem uma mensagem de empate.

Pode implementar uma tabela que contabiliza o nº de vitórias, derrotas e empates entre dois jogadores.