/FirstSailsProject

Aprendendo a programar web com sails

Primary LanguageJavaScript

RateSite

Aprendendo a montar um site com SailsJS. Escolhi por criar o projeto RateSite. Esse programa terá dois usuários padrão. Um prestatador de serviço e um cliente. Exemplo de uso: Chaveiro/Cliente; Médico/Paciente; Possuidor de Carro/Cliente; Manicure/Cliente ....

Fase 1

  1. Criei um projeto no Cloud9
  2. Criei o projeto 'RateSite' no Sails
  3. Primeiro Commit

Fase 2

  1. Implementar o Passport básico criado por Giancarlo Soverini - commit
  2. Criar uma tela que apenas logados podem entrar (com logout) - commit
  3. Criar uma mensagem de erro para o usuário, informando que ele não está logado - commit
    1. Noob: O nome dessa mensagem e flash() - req.flash()
    2. Info: O Chrome volta e meia manda dois POSTs iguais, com isso as vezes mando um flash duplicado. Não consegui impedir de passar na policy a segunda vez.
    3. Info: A maioria dos flash() que criarei no projeto serão no próprio cliente (quando eu usar o AngularJS), não preciso de um modelo muito complexo.
    4. Eu quero fazer um req.flash() e req.redirect('/') na policies/isAuthenticated.js
    5. Eu pensei em usar a proposta de um serviço 'FlashService' + política 'flash', mas acho que é mais complexo do que eu preciso, i.e. temos que adicionar a policy sempre antes de outras policies que precisam do flash, e principalmente, não podemos fazer um flash e redirect() como era o objectivo. 6. Acabei usando a ideia do req.flash() simples. Criando um partial EJS para cuidar disso - alterei o EJS da resposta para fazer para um for no req.flash() [mais robusto]
  4. Enviar o password encriptado para o servidor.
    1. Vou continua enviando plain text porque usamos HTTPS
    2. Explicação¹
    3. Javascript Cryptography
  5. Criar esqueci minha senha
    1. Etapas: (Usuário pede para resetar senha em /forgotPassword) -> (Servidor Envia email) -> (Usuário redefine a senha passando como parâmetro o token recebido no email) -> (Servidor atualiza a senha e invalida token). Segui o tutorial do Sahat Yalkabov
    2. Permitir mandar email. Utilizei o sails-hook-email (tive muito problema de timeout. Acho melhor usar a API do mailGun) - commit
      1. Para as configurações do Email (principalmente a senha) não ficarem no repositório, eu as coloquei no config.local que não é versionado por default.
      2. Eu estava com problema para enviar email pelo Gmail. Para resolver eu ativei o 2-steps verification e adicionei um 'App Password'. Também tentei usar o Mailgun
    3. Permitir resetar a senha e verifica se o token expirou Criar token com expiration - commit
  6. Criar login pelo Google commit
    1. Seguir os passos para criar seu app no Google API - Tutorial do Jenkins
    2. Implementar o Google Auth via passport-google-oauth seguindo o tutorial do sails-social-auth-example e o tutorial do Michael Herman
    3. Note que não precisamos fazer o google/callback porque o controller pega todos os google/* FIX
    4. Me ajudou ler essa pergunta do Stackoverflow

Fase 3 Colocar verificações no cliente

Acaba Fase de Login; Entra fase de Rate [negócio]

Fase 4 Buitify. Colocar favicon; usar foundation

Detalhes de implementação

  • Para o front/CSS vamos usar Foundation
  • Utilizei async para algumas tarefas ao invés de callback diretamente - tutorial. Pessoalmente eu prefiro Promise que já uso no angular.js, mas as libs são feitas com callback, por isso preferi utilizar o async a usar uma Promise com wrapper

Dificuldades

Eu não consegui usar o config/local.js, nem o config/env/*.js dentro do config/passport.js. Gostaria de usa-lo para salvar o appURL e o GoogleAPI. Depois de algum estudo, verifiquei que o Sails não tem um suporte 100% para esse tipo de uso. Então decidi colocar o appURL (variável com a URL) como uma variável do ambiente APP_URL="http://falcon-medico-makah.c9users.io:8080/" sails lift - preferia ter colocado em config/env/*. commit Já o GoogleAPI eu coloquei o workarround require(./local) - Stackoverflow