Slide 1

Slide 1 text

OCSIM Um framework open source para autenticação e autorização Jéssica Bonson Principal Engineer no Olist TDC Floripa 2020, Trilha Python

Slide 2

Slide 2 text

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:

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

O que é autenticação e autorização?

Slide 5

Slide 5 text

Tipos de Autenticação de APIs ● Basic curl "https://example.com/" -H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="

Slide 6

Slide 6 text

Tipos de Autenticação de APIs ● Basic curl "https://example.com/" -H "Authorization: Basic username:password"

Slide 7

Slide 7 text

Tipos de Autenticação de APIs ● API Key curl "https://example.com/" -H "Authorization: Token 7h2aa9d9172f329b1k67113a9f5cc9ns2f”

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

OAuth 2.0: Authorization Code

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

OAuth 2.0: Resource Owner Password Credentials

Slide 12

Slide 12 text

OAuth 2.0: Client Credentials

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

OAuth 2.0 + Token JWT

Slide 17

Slide 17 text

OpenID Connect (OIDC) OAuth 2.0 + ID Token (Token JWT) + Endpoints (API HTTP RESTful)

Slide 18

Slide 18 text

OpenID Connect (OIDC): ID Token { "iss": "https://server.example.com", "sub": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs", "aud": "https://api.example.org", "exp": 1311281970, "iat": 1311280970 }

Slide 19

Slide 19 text

Arquitetura do Olist

Slide 20

Slide 20 text

Tipos de Autenticação de APIs ● API Key curl "https://example.com/" -H "Authorization: Token 7h2aa9d9172f329b1k67113a9f5cc9ns2f”

Slide 21

Slide 21 text

OpenID Connect (OIDC) OAuth 2.0 + ID Token (Token JWT) + Endpoints (API HTTP RESTful)

Slide 22

Slide 22 text

Vantagens ● Melhor performance das APIs ● Maior segurança das APIs ● Rastreabilidade ● Permissionamento

Slide 23

Slide 23 text

Características da Arquitetura ● APIs usam o Django Rest Framework (DRF) ● Usamos microserviços ○ 20+ APIs ○ 100+ serviços

Slide 24

Slide 24 text

Requisitos ● Facilidade de instalação ● Retrocompatibilidade ● Token auto-contido ● Não reinventar a roda

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

O que é o OCSIM?

Slide 27

Slide 27 text

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.

Slide 28

Slide 28 text

Authorization Server Endpoints, Banco de Dados, Comandos

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Como usar? curl -X POST -d "client_id=" -d "client_secret=" -d "grant_type=client_credentials" https://example.com/o/token/ {"id_token": "", "token_type": "Bearer", "expires_in": 3600} https://example.com/o/token/

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Biblioteca Validação de tokens na API

Slide 35

Slide 35 text

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", ),

Slide 36

Slide 36 text

Debates

Slide 37

Slide 37 text

● 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

Slide 38

Slide 38 text

Próximos Passos

Slide 39

Slide 39 text

Valeu! @jpbonson @jessica.bonson

Slide 40

Slide 40 text

Referências https://auth0.com/learn/token-based-authentication-made-easy/ https://thiagolima.blog.br/parte-3-seguran%C3%A7a-em-apis-restful-a780bd9f186a https://oauth.net/2/ https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth https://medium.com/google-cloud/understanding-oauth2-and-building-a-basic-authorization-server-o f-your-own-a-beginners-guide-cf7451a16f66 https://connect2id.com/learn/openid-connect https://openid.net/specs/openid-connect-core-1_0.html https://auth0.com/docs/protocols/oidc

Slide 41

Slide 41 text

Referências https://blog.bearer.sh/the-three-most-common-api-authentication-methods/ https://nordicapis.com/3-common-methods-api-authentication-explained/ https://nordicapis.com/why-api-keys-are-not-enough/ https://nordicapis.com/api-security-oauth-openid-connect-depth/ https://nordicapis.com/how-to-control-user-identity-within-microservices/ https://swagger.io/docs/specification/authentication/bearer-authentication/ https://medium.com/@darutk/understanding-id-token-5f83f50fa02e