Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OCSIM: Um framework open source para autenticaç...

OCSIM: Um framework open source para autenticação e autorização, TDC Floripa 2020

OCSIM é a solução desenvolvida pelo Olist para melhorar a performance e segurança das nossas APIs. É um framework open source, construído sobre o Django REST framework. Nessa palestra vou apresentar como o OCSIM foi desenvolvido, as lições aprendidas e como usá-lo para melhorar a autenticação e autorização de APIs.

More Decks by Jessica Pauli de C Bonson

Other Decks in Technology

Transcript

  1. OCSIM Um framework open source para autenticação e autorização Jéssica

    Bonson Principal Engineer no Olist TDC Floripa 2020, Trilha Python
  2. Jéssica Pauli de C Bonson • +-8 anos de exp

    em pesquisa/desenvolvimento • graduação/mestrado em Ciências da Computação • foco em dev backend, machine learning e big data Jogos RPG Canto Hobbies:
  3. Maior loja nos principais marketplaces do Brasil. Arquitetura em microsserviços

    e serverless. Python. Go. PostgreSQL. AWS. Heroku. 20+ APIs 120+ serviços 3m+ produtos 30k+ logistas 10m+ anúncios 200k+ pedidos em maio/2020
  4. Tipos de Autenticação de APIs • Basic curl "https://example.com/" -H

    "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
  5. Tipos de Autenticação de APIs • API Key curl "https://example.com/"

    -H "Authorization: Token 7h2aa9d9172f329b1k67113a9f5cc9ns2f”
  6. Tipos de Autenticação de APIs • OAuth 2.0 curl "https://example.com/"

    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtZXNzYWdlIjoiSldUIFJ1bGVzISIs ImlhdCI6MTQ1OTQ0ODExOSwiZXhwIjoxNDU5NDU0NTE5fQ.-yIVBD5b73C7 5osbmwwshQNRC7frWUYrqaTjTpza2y4"
  7. Tipos de Autenticação de APIs • OAuth 2.0 curl "https://example.com/"

    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtZXNzYWdlIjoiSldUIFJ1bGVzISI sImlhdCI6MTQ1OTQ0ODExOSwiZXhwIjoxNDU5NDU0NTE5fQ.-yIVBD5b73C 75osbmwwshQNRC7frWUYrqaTjTpza2y4"
  8. Tipos de Autenticação de APIs • OAuth 2.0 curl "https://example.com/"

    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtZXNzYWdlIjoiSldUIFJ1bGVzISIs ImlhdCI6MTQ1OTQ0ODExOSwiZXhwIjoxNDU5NDU0NTE5fQ.-yIVBD5b73C7 5osbmwwshQNRC7frWUYrqaTjTpza2y4" Formato: header.payload.signature
  9. Tokens JWT (JSON Web Token) • Header {"typ": "JWT", "alg":

    "HS256"} • Payload {"message": "JWT Rules!", "iat": 1459448119, "exp": 1459454519} • Signature Valida que o token não foi alterado e é de origem confiável
  10. Tipos de Autenticação de APIs • API Key curl "https://example.com/"

    -H "Authorization: Token 7h2aa9d9172f329b1k67113a9f5cc9ns2f”
  11. Vantagens • Melhor performance das APIs • Maior segurança das

    APIs • Rastreabilidade • Permissionamento
  12. Características da Arquitetura • APIs usam o Django Rest Framework

    (DRF) • Usamos microserviços ◦ 20+ APIs ◦ 100+ serviços
  13. OCSIM • Foi construído em cima do django-oauth-toolkit, a biblioteca

    recomendada pelo Django Rest Framework (DRF), que implementa o OAuth 2.0 • Adicionamos suporte ao padrão OIDC • Solução pronta para uso
  14. Um Identity Manager composto por: • Authorization Server • Biblioteca

    para integração de APIs em DRF • Autenticador Usado há quase 1 ano em produção. Ainda está em desenvolvimento.
  15. Comandos: Criar Aplicação python ocsim/manage.py applications create --name "dummy-service" --client-type="confidential"

    --auth-grant-type="client-credentials" --organization-name "Olist" Application: dummy-service Client ID: 93pKbKujRiO8hAkdTNyf8yA2A4OEliDfbQo6kIxE Client Secret: mOiUxPoyNfFure5cZwsL8dFkJjg2lBiW18TC08bo1vLuGjA2e48XuAV4LEed PBVzH7Hw30MtoyjJqvEJylw025IvPtxFpsM7ZOCMHTbZVez2yxz81ndqVlJ DAZWbdKoZ
  16. Comandos: Criar Permissão python ocsim/manage.py permissions create --name="Dummy API: Get

    product" --orn="orn:dummy-api:products:retrieve" Permission created. NAME: Dummy API: Get product ORN: orn:dummy-api:products:retrieve
  17. Comandos: Aplicação com Permissões python ocsim/manage.py applications add-permission --client-id 93pKbKujRiO8hAkdTNyf8yA2A4OEliDfbQo6kIxE

    --orn orn:dummy-api:products:retrieve python ocsim/manage.py applications remove-permission --client-id 93pKbKujRiO8hAkdTNyf8yA2A4OEliDfbQo6kIxE --orn orn:dummy-api:products:retrieve
  18. Como usar? curl -X POST -d "client_id=<client_id>" -d "client_secret=<client_secret>" -d

    "grant_type=client_credentials" https://example.com/o/token/ {"id_token": "<token>", "token_type": "Bearer", "expires_in": 3600} https://example.com/o/token/
  19. Setup Adicionar a variável de ambiente: • OIDC_RSA_PRIVATE_KEY (ou obtê-la

    do AWS Secrets) • Instalação de dependências • Criação do banco de dados Postgres • Configuração no Heroku
  20. Setup Adicionar as variáveis de ambiente: OIDC_RSA_PUBLIC_KEY e API_NAME Alterar

    no REST_FRAMEWORK do settings.py: "DEFAULT_AUTHENTICATION_CLASSES": ( "ocsim_drf.authentication.OCSIMAuthentication", ), "DEFAULT_PERMISSION_CLASSES": ( "ocsim_drf.permissions.ORNPermission", ),
  21. • Tokens criptografados? (JWE) • O que fazer com a

    autenticação por API Key? • Como invalidar um token? • Impacto na performance de um aplicativo • Tempo de expiração