Entenda como funciona a segurança em aplicações e o protocolo OIDC
Neste módulo final teórico, você vai aprender como manter suas aplicações e jogos seguros, proteger dados dos usuários e implementar sistemas de login modernos usando padrões profissionais como OAuth 2.0 e OpenID Connect (OIDC).
São conceitos diferentes mas que trabalham juntos:
Exemplo do dia a dia: Quando você entra em um prédio, o segurança verifica sua identidade (autenticação), e depois seu crachá mostra em quais andares você pode entrar (autorização).
OAuth 2.0 é um protocolo de autorização que permite que aplicações acessem recursos em nome do usuário SEM conhecer sua senha.
Imagine que você vai viajar e deixa a chave do seu apartamento com um amigo para regar suas plantas. Você não deu a senha do cofre, apenas acesso temporário para uma tarefa específica. OAuth funciona assim: dá permissões temporárias e limitadas.
OpenID Connect (OIDC) é uma camada de autenticação construída sobre OAuth 2.0. Adiciona a capacidade de verificar a identidade do usuário e obter informações básicas de perfil.
Foco: Autorização
Uso: "Permite que este app acesse suas fotos"
Retorna: Access Token
Foco: Autenticação + Autorização
Uso: "Login com Google"
Retorna: ID Token + Access Token
Veja como funciona quando você clica em "Login com Google":
1. 👤 Usuário: Clica em "Login com Google" no seu app
2. 🔄 App: Redireciona para Google
3. 🔐 Google: Pede login (se necessário)
4. ✅ Usuário: Aprova o acesso
5. 🎫 Google: Devolve um código de autorização
6. 🔄 App: Troca o código por tokens
7. 🎉 App: Recebe ID Token (quem é o usuário) + Access Token (o que pode fazer)
8. 👋 App: Usuário está logado!
Contém informações sobre o usuário:
Formato: JSON Web Token (JWT) - 3 partes separadas por pontos
Permite acessar recursos protegidos:
Validade: Curta (minutos/horas)
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkw...
Dividido em 3 partes:
1. HEADER (cabeçalho): tipo e algoritmo
2. PAYLOAD (dados): informações do usuário
3. SIGNATURE (assinatura): garante que não foi alterado
import base64
import json
def decodificar_jwt(token):
partes = token.split('.')
# Decodificar header e payload (não a assinatura)
header = json.loads(base64.b64decode(partes[0] + '=='))
payload = json.loads(base64.b64decode(partes[1] + '=='))
return header, payload
# Exemplo
token_exemplo = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvYW8iLCJlbWFpbCI6ImpvYW9AZXhhbXBsZS5jb20ifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
header, payload = decodificar_jwt(token_exemplo)
print("Header:", header)
print("Payload:", payload)
# ❌ PÉSSIMA IDEIA!
senha = input("Digite sua senha: ")
if senha == "senha123": # senha hardcoded
print("Login OK")
# ❌ NUNCA salve assim no banco:
database.save(username="joao", password="minhasenha123")
import hashlib
import os
def hash_senha(senha):
"""Hashear senha com salt"""
salt = os.urandom(32)
hash = hashlib.pbkdf2_hmac('sha256', senha.encode('utf-8'), salt, 100000)
return salt + hash
def verificar_senha(senha_digitada, hash_armazenado):
"""Verificar se senha corresponde ao hash"""
salt = hash_armazenado[:32]
hash_armazenado = hash_armazenado[32:]
hash_novo = hashlib.pbkdf2_hmac('sha256', senha_digitada.encode('utf-8'), salt, 100000)
return hash_novo == hash_armazenado
# Uso
senha_usuario = "minhasenha123"
hash_seguro = hash_senha(senha_usuario)
# Salve hash_seguro no banco, não a senha!
# Na verificação
if verificar_senha("minhasenha123", hash_seguro):
print("Login OK!")
Se você gostou deste módulo, explore o Reino OIDC - um guia completo e lúdico sobre OpenID Connect com personagens, história e exemplos práticos!
Revise os conceitos de Segurança Digital e Autenticação com flashcards interativos! Teste seus conhecimentos sobre OAuth 2.0, OIDC, tokens, JWT, PKCE e muito mais.