Ir para o conteúdo

Autenticação


1
import hello_world

Criar Usuário com Email e Senha

mutation {
  createPasswordUser(
    user: {
      displayName: "Usuário Exemplo"
      email: "email@gmail.com"
      password: "123456"
    }
    url: "https://mysite.com/user_profile"
    iOS: {
      bundleId: "com.farias_brito.app_simulados.ios"
    }
    android: {
      packageName: "com.farias_brito.app_simulado"
      installApp: true
      minimumVersion: "1.0.2"
    }
  ) {
    uid
    displayName
    email
    emailVerified
    customToken
    customClaims {
      role
    }
  }
}
  • Criar um Usuário que faz Login com Email e Senha:

    • Retorna todos os dados disponíveis do Usuário

    • Envia Email de confirmação para o Email do Usuário

    • Qualquer verificação de Autenticação irá falhar caso o Email dele não esteja verificado
    • Os campos iOS, android e url são utilizados para definir para onde o Usuário vai ser redirecionado após confirmação de Email

    Campos de Redirecionamento (iOS/Android/Web)

    Usar esses campos de acordo com a origem do App do Usuário sendo utilizado para dar informação do App para a API, assim o Usuário irá ser redirecionado de volta para o App/Site após criar sua conta.

    android: {
      # Nome do pacote do App Android a ser aberto
      packageName: "com.farias_brito.app_simulado"
    
      # Procurar App na Playstore caso Usuário não o tenha baixado
      installApp: true
    
      # Versão mínima a ser utilizada, irá pedir para
      # o Usuário atualizar o app na Playstore caso a dele
      # seja inferior a versão passada aqui
      minimumVersion: "1.0.2"
    }
    
    iOS: {
      # ID do Bundle do App iOS
      bundleId: "com.farias_brito.app_simulados.ios"
    }
    
    # URL para redirecionar o Usuário após criação de conta
    url: "https://mysite.com/user_profile"
    
  • Um campo adicional customClaims seria criado e retornado também, ele é um objeto contendo o campo role, que é o campo de Cargo do Usuário, usado para definição de permissões

    {
      "customClaims": {
        "role": "user"
      }
    }
    
    {
      "customClaims": {
        "role": "admin"
      }
    }
    
  • Um campo customToken será retornado com os dados do Usuário, utilizado para uniciar uma sessão pelo firebase-client. Ler Mais.

    try {
      firebase.auth().signInWithCustomToken(user.customToken)
    } catch (error) {
      const errorCode = error.code;
      const errorMessage = error.message;
    }
    
  • Mensagens de Erro:

    • Mensagens de Erro podem normalmente ser passadas diretamente para um alerta para o Usuário, visto que elas virão do Firebase e são traduzidas, exemplo:

      {
        "errors": [
          {
            "message": "O e-mail fornecido já está em uso.",
            "locations": [
              {
                "line": 2,
                "column": 3
              }
            ],
            "path": [
              "createPasswordUser"
            ]
          }
        ],
        "data": {
          "createPasswordUser": null
        }
      }
      
  • Email de Confirmação Padrão do Firebase


Login de Usuário com Email e Senha

mutation {
  loginPasswordUser(email: "email@gmail.com", password: "123456") {
    _id
    uid
    email
    emailVerified
    stsTokenManager {
      accessToken
      refreshToken
      expirationTime
      apiKey
    }
  }
}
  • Login com Email e Senha:

    • Retorna informações sobre Tokens de Autenticação, para serem usados nos Headers de Autorização

      {
        "stsTokenManager": {
          "accessToken": "eyJhbGciOiJSUzI1Ni (...)",
          "refreshToken": "AEu4IL0ojlzj4t (...)",
          "expirationTime": "1575485599954",
          "apiKey": "AIzaSyBSd7MN5HzoL_Z4Nhiybwg8sivV9GupkQ4"
        }
      }
      

    accessToken Token de acesso de Autenticação

    Expiram após 1 hora depois de serem criados

    refreshToken Token de refresh de Autenticação

    Utilizado para gerar um novo accessToken, não expira a não ser que o Usuário seja desabilitado, é usado da seguinte forma:

    mutation {
      # Passar refreshToken como 'token'
      refreshIdToken(token: "AEu4IL2dnPWqC (...)") {
      tokenType
      idToken
      userId
      expiresIn
      projectId
      refreshToken
      }
    }
    

    expirationTime Tempo até o accessToken expirar

    Ele é uma string e não int por Limitações do GraphQL

    > const expirationTime = "1575485599954"
    > const date = new Date(Number.parseInt(expirationTime))
    > date
    2019-12-04T18:53:19.954Z
    

Dados do Usuário atualmente autenticado

campo historicoAproveitamento deprecado (v1.0.1)

Utilizar o Query historicoAproveitamento no lugar

  • Retorna dados do Usuário atualmente logado, requer accessToken presente nos Headers de Autorização, pode retornar também dados do Histórico de Aproveitamento de Simulados do Usuário

    query {
      currentUser {
        uid
        email
        historicoAproveitamento {
          createdAt
          updatedAt
          materias {
            updatedAt
            createdAt
            nome
            aproveitamento
            acertos
            total
            erros
          }
        }
      }
    }
    
    {
      "data": {
        "currentUser": {
          "uid": "COoq3Gu9dmWWFfao8eelXjs1Hf62",
          "email": "email@gmail.com",
          "historicoAproveitamento": {
            "createdAt": "1581963085536",
            "updatedAt": "1581963085536",
            "materias": [
              {
                "updatedAt": null,
                "createdAt": "1581963085535",
                "nome": "Biologia",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085535",
                "nome": "Espanhol",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085535",
                "nome": "Filosofia",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": "1581963085535",
                "createdAt": "1581963085535",
                "nome": "Física",
                "aproveitamento": 100,
                "acertos": 5,
                "total": 5,
                "erros": 0
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085535",
                "nome": "Geografia",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": "1581963085535",
                "createdAt": "1581963085535",
                "nome": "História",
                "aproveitamento": 25,
                "acertos": 5,
                "total": 20,
                "erros": 15
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085535",
                "nome": "Inglês",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": "1581963085535",
                "createdAt": "1581963085535",
                "nome": "Matemática",
                "aproveitamento": 50,
                "acertos": 5,
                "total": 10,
                "erros": 5
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085535",
                "nome": "Português",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085536",
                "nome": "Química",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              },
              {
                "updatedAt": null,
                "createdAt": "1581963085536",
                "nome": "Sociologia",
                "aproveitamento": 0,
                "acertos": 0,
                "total": 0,
                "erros": 0
              }
            ]
          }
        }
      }
    }
    

Reset de Senha de Usuário

mutation {
  sendPasswordResetEmail(
    email: "johnvictorfs@gmail.com"
    url: "https://mysite.com/login"
    iOS: {
      bundleId: "com.farias_brito.app_simulados.ios"
    }
    android: {
      packageName: "com.farias_brito.app_simulado"
      installApp: true
      minimumVersion: "1.0.2"
    }
  )
}
  • Envia Email para Usuário reiniciar Senha, não requer Autenticação
  • Campos url, iOS e android funcionam da mesma forma que os mesmos campos de Confirmação de Email


Usuários de Redes Sociais

  • Login OAuth pelo Google

  • Login OAuth pelo Facebook

  • Login OAuth pela Apple

  • Após realizar Cadastro de Conta utilizando Redes sociais, um idToken será retornado, esse idToken deverá ser usado como Token de autenticação nos Headers de Autorização para usar na API.

  • Após a criação de um Usuário usando Rede Social pelo Firebase, será necessário enviar uma Mutation para a API, para poder salvar o Usuário no banco de dados da API

    mutation {
        saveSocialMediaUser
    }
    
  • Passar idToken nos Headers de Autorização

    {"authorization": "eyJhbGciOiJSUzI1Ni (...)"}
    

Re-enviar Email de Confirmação

mutation {
  resendConfirmationEmail(
    email: "email@gmail.com"
    password: "123456"
    url: "https://mysite.com/login"
    iOS: {
      bundleId: "com.farias_brito.app_simulados.ios"
    }
    android: {
      packageName: "com.farias_brito.app_simulado"
      installApp: true
      minimumVersion: "1.0.2"
    }
  )
}
  • Não requer Token de Autorização, irá utilizar as credenciais passadas (email e password) para realizar a Autenticação, irá enviar o mesmo Email enviado ao Criar um Usuário com Senha e faz uso dos mesmos campos da mesma forma

Atualizar Dados de Usuário

mutation {
  updateUser(user: { displayName: "Usuário Teste Updated" }) {
    uid
    displayName
    email
    emailVerified
  }
}
{"authorization": "eyJhbGciOiJSUzI1Ni (...)"}
{
  "data": {
    "updateUser": {
      "uid": "COoq3Gu9dmWWFfao8eelXjs1Hf62",
      "displayName": "Usuário Teste Updated",
      "email": "test@gmail.com",
      "emailVerified": true
    }
  }
}
  • Requer Token de Acesso nos Headers de Autorização
  • Campos que podem ser atualizados por essa Mutation: displayName, photoURL e phoneNumber