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:
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:
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.