quinta-feira, 22 de maio de 2014

Sistema de Login sem Senha


Ano passado meu amigo Dênis Costa me enviou um post fantástico sobre um sistema de login sem senha. A ideia principal é: “Para que pedir uma senha ao usuário se ele vai esquecê-la?”. Ou seja, se o “esqueci minha senha” vai ser utilizado com frequência, porque não simplesmente enviar um link de login por e-mail toda vez que usuário quiser acessar o sistema? Achei a ideia genial.

Procurei por alguém que oferecesse o login sem senha como serviço, aos moldes de um “login com Facebook”. Não encontrei. Decidi então desenvolver o Passwordless. Além de se poder utilizar como serviço, o projeto é livre:

https://github.com/renzon/pswdless

No processo de desenvolvimento mapiei os status para logar o usuário:

  1. Usuário pede para fazer login em um site;
  2. Site envia chamada para Passwordless;
  3. Passworldless envia e-mail em nome do site;
  4. Usuário acessa e-mail e clica no link;
  5. Passworldless envia noticação ao site.
  6. Site efetua o login

Desenhando o diagrama de sequência:


Além desse fluxo, também são importantíssimos os requisitos de segurança.

O primeiro deles é evitar o envio de spam. Isso foi mitigado criando um intervalo de tempo mínimo, atualmente 30 minutos, para que se possa enviar um e-mail de login para o mesmo usuário. Segue o teste automático:


def test_spam(self):
        site = mommy.make_one(Site, domain='www.pswd.com')
        user = mommy.make_one(PswdUser)
        ndb.put_multi([site, user])
        create_login = CreateLogin(user, site, 'hook')
        create_login.execute()
        # time.sleep(3)  # giving time because eventual consistency
        validate_cmd = ValidateLoginCall(site.key.id(), site.token, 'http://www.pswd.com/pswdless',
                                         user.key.id())



O segundo requisito seria proteger o link de login. Para isso foram implementadas as seguintes medidas:

  1. Todo link é único, contendo um token aleatório e assinado via hash;
  2. Todo link tem validade. Se em 10 minutos o usuário não clicar nele, ele fica inválido;
  3. Todo link é descartável. Depois de utilizado, não mais é possível fazer login com ele.

Para todas essas medidas foram construídos testes automáticos:

class ValidateLoginLinkTests(GAETestCase):
    def _assert_error(self, token):
        validate_cmd = ValidateLoginLink(token, None)
        validate_cmd.execute()
        self.assertDictEqual({'ticket': 'Invalid Call'}, validate_cmd.errors)

    def _assert_wrong_status(self, status):
        login = Login(status=status, hook='https://pswdless.appspot.com/foo')
        login.put()
        cmd = client_facade.sign_dct('ticket', login.key.id())
        cmd.execute()
        self._assert_error(cmd.result)

    def test_invalid_token(self):
        self._assert_error('invalid token')

    def test_already_clicked(self):
        self._assert_wrong_status(LOGIN_CLICK)

    def test_already_got_detail(self):
        self._assert_wrong_status(LOGIN_DETAIL)

    def test_not_existing_login(self):
        cmd = client_facade.sign_dct('ticket', 2)
        cmd.execute()
        self._assert_error(cmd.result)

Depois de um certo tempo, outro amigo, o Giovane Liberato, acabou me enviando alguns links sobre o assunto:


Interessante notar a análise no segundo, onde colocaram dados sobre a aceitação dos usuários a um sistema de login sem senha de um comércio eletrônico.

Mas e você, qual sua opinião sobre um sistema de login sem senha?

Até o próximo post.

segunda-feira, 5 de maio de 2014

Primeiro ano de ITA


Após a grande batalha de 2003, em janeiro do ano seguinte seguimos do RJ para o ITA no meu carro eu, Alan, Papel e Raissan. Dada minha experiência no Naval, cheguei no CTA de “guarda alta”, pronto para trotes pesados.

O veterano que nos recebeu foi Átila, da turma 07. Tudo muito tranquilo, falou que deveríamos escolher um apartamento, mas que não poderíamos ficar todos juntos, 2 no máximo por ap. A razão disso era enturmar todos os ingressantes, evitando a formação de panelas.

Perguntei então sobre a rotina, se tinha revista no apartamento. Ele respondeu que o apartamento era nosso e que apesar de o ITA estar em uma base militar, ele não tinha a rotina de milico. Você não é obrigado arrumar sua cama ou até mesmo ir a aula. Ao saber disso, pensei: “Isso vai ser uma colônia de férias”.

Ficamos então eu e Raissam no apartamento 316. Lá já estava o Reginaldo José, vulgo Beraba, que recentemente ficou famoso por hackear o Facebook. Depois chegaram o Thiago (Granola) , Joaquim (Mantega) e Marcelo Gomes (Muskito).

Durante o primeiro mês ocorria a chamada integração. Durante o período os calouros eram reunidos para “bostejos”, que são bate papos onde veteranos explicam o funcionamento do ITA e seus valores. Aconteciam algumas brincadeiras, mas depois dos trotes do Naval, aquilo era muito tranquilo.

Além disso havia instrução militar no CPOR. No primeiro ano todos alunos são militares, visando cumprir o serviço obrigatório. Mas sendo a maioria dos alunos compostas por civis, ou seja, quem não optou por ser militar no vestibular, as instruções eram bem suaves.

Apesar de eu achar tudo ótimo, a maioria dos meus amigos de turma não estava acostumados com as novidades. Morar sozinho era um desafio. Os apartamentos eram velhos e com vários problemas. Certa vez chouveu e o esgoto inundou minha vaga e a do Raissan. Muitos reclamavam do trote. Mas enfim, para quem morava em alojamento, tinha que arrumar a cama todo dia e ir para aula fardado, o CTA e o alojamento (H8) eram um paraíso.

Terminado o período de integração começaram as aulas. Nesse período apenas tínhamos que ir no CPOR às segundas de tarde. E isso recebendo um salário, não sei como ainda tinha gente que reclamava. Nesse início mais uma vez boa parte da turma se frustrou. Alguns professores deixavam a desejar. Por conta da fama do ITA, a maioria pensava que só existiriam profissionais espetaculares. Em particular ,eu não me frustrei por já ter passado o mesmo Naval.

Depois de estudar nessas duas instituições e conhecer muitos amigos de colégios militares, cheguei na fórmula das boas escolas:

  1. Processo seletivo acirrado
  2. Média de aprovação alta
  3. Provas difíceis, independente da qualidade do professor
  4. Regras rígidas, com muitas culminando em desligamento.

A média no ITA é 6,5. São feitas em geral 3 provas: primeiro e segundo bimestre e mais uma prova final. Se não atingir a média, o aluno deve fazer segunda época no próximo semestre e atingir a média. Isso quer dizer que se você ficou com 6 de média, precisa tirar 7 na segunda época, com 5 é necessário 8 e assim sucessivamente. Mas mesmo que você atinja a média na segunda época, há ainda mais uma regra. Se você tirar menos de 8,5, você fica com o 'I' de insuficiente em seu currículo. Se durante todo o ITA você acumular mais do 5 Is, você é desligado. Se você repete maid de suas matérias, você tem que refazer todos as outras do semestre. Você só pode trancar duas vezes: uma por nota e uma por saúde. Na prática, em minha época o pessoal acochambrava para deixar você usar o “continue” da saúde mesmo que a razão verdadeira fosse nota.

Mas são essas dificuldades e o fato de morar juntos que faz com que os integrantes da turma sejam muito unidos. Os mais safos ajudam aqueles com maior dificuldade e assim se formam amizades para uma vida inteira.

Um valor interessante, herdado das escolas militares, é muito interessante: a Disciplina Consciente (DC). Basicamente o conceito pode ser traduzido como honestidade, praticado através da confiança nesse valor. Como exemplo, é comum um professor passar provas e não ficar supervisionando a sala. Mais ainda: dar uma prova para se fazer em casa, com tempo de duração e sem consulta. Isso cria um ambiente ímpar. Mas como as regras são rígidas, quebrar esse valor é algo muito sério. Alunos que são pegos colando são expulsos, apesar de algumas vezes já terem acochambrado e apenas trancado alunos pegos com a boca na botija. Mas isso é muito incomum.

Enfim ,o primeiro ano do ITA foi relativamente tranquilo para mim. A boa base que o Colégio Naval me deu, mais 1 ano de cursinho Roquette (infelizmente falecido há poucos dias antes da publicação desse artigo) contribuíram para isso.

Infelizmente no fim do ano (talvez tenha sido no segundo ano) o Raissan trancou por conta de notas. Além disso, estávamos divididos em dois grupos no ap. Granola e Beraba estudavam e eram regrados. Os outros, eu incluso, tocávamos o zaralho: vídeo game até tarde, séries de TV, saidões. Por conta disso, acabamos decidindo por dividir o ap no segundo ano. Mas o segundo ano fica para um outro post.

Enfim, o ITA é um lugar incrível onde você encontra pessoas sensacionais, fazendo amizades para a vida inteira. As regras rígidas, estudo puxado e a DC é fórmula para a fama da instituição, materializado pelo assédio das empresas para contratarem os que se graduam na instituição. Além disso, esse fatores contribuem para a “máfia iteana”. Ela consiste em uma rede de contatos de ex-aluno que costuma se ajudar, principalmente no quesito mercado de trabalho.

Enfim, um lugar espetacular que tive o privilégio de estudar e que aconselho a todos que se interessarem e estiverem dispostos a pagar o preço exigido pelo foco no estudo.

Nesse ano de 2004 ainda cheguei a ir no baile da Escola Naval. Foi interessante encontrar os velhos amigos de Colégio Naval e poder dar a volta por cima. No ano seguinte e também fui ao baile, com histórias mais interessantes para contar, mas fica para o próximo post.