Slide 1

Slide 1 text

APIs seguras com OAuth2 Maceió Dev Meetup #2

Slide 2

Slide 2 text

Tony Messias Desenvolvedor Web há +4 anos Análise de Sistemas CESMAC @tony0x01

Slide 3

Slide 3 text

Cliente acessa recursos usando um Access Token obtido através de um fluxo de autorização

Slide 4

Slide 4 text

Fim :)

Slide 5

Slide 5 text

OAuth2 > OAuth1(a)

Slide 6

Slide 6 text

POST /resources HTTP/1.1 Host: api.example.com Authorization: OAuth oauth_consumer_key=" lWsZaXcyujT8ErqdIlbr0Sn9LaFYNlE2eVCczyvsFKnmBHiBnVrY3xo64 ByB", oauth_nonce="0Sn9LaFYN", oauth_signature=" lWsZaXcyujT8ErqdIlbr0Sn9LaFY", oauth_signature_method=" HMAC-SHA1", oauth_timestamp="1418836421", oauth_token=" 96403f692107210ef11f4a02cdbce4af", oauth_version="1.0" Content-Type: application/json { "lorem" : "ipsum" }

Slide 7

Slide 7 text

POST /resources HTTP/1.1 Host: api.example.com Authorization: OAuth oauth_consumer_key=" lWsZaXcyujT8ErqdIlbr0Sn9LaFYNlE2eVCczyvsFKnmBHiBnVrY3xo64 ByB", oauth_nonce="0Sn9LaFYN", oauth_signature=" lWsZaXcyujT8ErqdIlbr0Sn9LaFY", oauth_signature_method=" HMAC-SHA1", oauth_timestamp="1418836421", oauth_token=" 96403f692107210ef11f4a02cdbce4af", oauth_version="1.0" Content-Type: application/json { "lorem" : "ipsum" }

Slide 8

Slide 8 text

POST /resources HTTP/1.1 Host: api.example.com Authorization: Bearer vr5HmMkz123aksdmMibiJUusZwZCHueHue Content-Type: application/json { "lorem" : "ipsum" }

Slide 9

Slide 9 text

POST /resources HTTP/1.1 Host: api.example.com Authorization: Bearer vr5HmMkz123aksdmMibiJUusZwZCHueHue Content-Type: application/json { "lorem" : "ipsum" }

Slide 10

Slide 10 text

Mas o líder do projeto (OAuth2) deixou o projeto

Slide 11

Slide 11 text

Inseguro se não usar SSL/TSL

Slide 12

Slide 12 text

Inseguro se não usar SSL/TSL correto!

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Alguns termos:

Slide 15

Slide 15 text

Resource Owner também conhecido como “usuário”

Slide 16

Slide 16 text

Resource Server a sua API

Slide 17

Slide 17 text

Client uma aplicação usando o resource server a mando do resource owner

Slide 18

Slide 18 text

Client sua aplicação {web,mobile} que utiliza a API

Slide 19

Slide 19 text

Authorization Server Uma aplicação que fornece os Access Tokens aos clients

Slide 20

Slide 20 text

Fluxos de Autorização

Slide 21

Slide 21 text

Authorization Code o mais comum, com toda a “dança” de redirects

Slide 22

Slide 22 text

Bob usa uma aplicação web

Slide 23

Slide 23 text

Bob tem recursos nessa aplicação web

Slide 24

Slide 24 text

Bob quer usar esses recursos em uma aplicação de terceiros

Slide 25

Slide 25 text

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Bob é redirecionado de volta para a aplicação com um código https://oauth2client.com/callback?code=AUTH_CODE_HERE

Slide 28

Slide 28 text

A aplicação, então, utiliza esse código para solicitar um Access Token

Slide 29

Slide 29 text

POST https://api.oauth2server.com/token grant_type=authorization_code& code=AUTH_CODE_HERE& redirect_uri=REDIRECT_URI& client_id=CLIENT_ID& client_secret=CLIENT_SECRET Reponse: { "access_token":"RsT5OjbzRn430zqMLgV3Ia" }

Slide 30

Slide 30 text

Esse fluxo não é indicado se o client for SEU

Slide 31

Slide 31 text

Resource Owner Credentials

Slide 32

Slide 32 text

Mas o propósito do OAuth não é nunca utilizar credenciais do usuário?

Slide 33

Slide 33 text

Mais ou menos…

Slide 34

Slide 34 text

O propósito, na verdade, é você não precisar fornecer seu username e password para terceiros

Slide 35

Slide 35 text

Mas e quando VOCÊ que desenvolveu o client que consome a SUA API?

Slide 36

Slide 36 text

Não faz sentido ter um botão “login with X” quando o X é a sua própria aplicação

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Alice fornece seu usuário e senha

Slide 39

Slide 39 text

O client (aplicação web) utiliza essas credenciais para conseguir um Access Token

Slide 40

Slide 40 text

POST https://api.oauth2server.com/token grant_type=password& username=USERNAME& password=PASSWORD& client_id=CLIENT_ID Response: { “access_token”: “RsT5OjbzRn430zqMLgV3Ia” }

Slide 41

Slide 41 text

É isso! Sem mais redirects.

Slide 42

Slide 42 text

Client Credentials as máquinas também precisam de autorização!

Slide 43

Slide 43 text

Paracido com o Resource Owner Credentials, mas para aplicações

Slide 44

Slide 44 text

Exemplo: Microserviços POST https://api.oauth2server.com/token? grant_type=client_credentials& client_id=CLIENT_ID& client_secret=CLIENT_SECRET

Slide 45

Slide 45 text

Refresh Token porque Access Token deve ter um tempo de vida

Slide 46

Slide 46 text

Você pode fornecer, junto com o Access Token, um Refresh Token e um TTL

Slide 47

Slide 47 text

Adiciona mais complexidade aos clients

Slide 48

Slide 48 text

POSTahttps://api.oauth2server.com/token? grant_type=refresh_token&refresh_token=TOKEN { "access_token": “ACCESS_TOKEN”, "expires_at": timestamp, "refresh_token": “REFRESH_TOKEN” }

Slide 49

Slide 49 text

Sugestões

Slide 50

Slide 50 text

Envie os Access Token via Header

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

Cuidado com Single Page Apps

Slide 53

Slide 53 text

fim! agora é sério!

Slide 54

Slide 54 text

Referências ➔ https://speakerdeck.com/jacksonj04/oauth-101 ➔ https://leanpub.com/build-apis-you-wont-hate ➔ http://tools.ietf.org/html/rfc6749 ➔ http://alexbilbie.com/ ➔ http://oauth2.thephpleague.com/ ➔ https://github.com/reddit/reddit/wiki/OAuth2

Slide 55

Slide 55 text

Referências ➔ https://aaronparecki. com/articles/2012/07/29/1/oauth2-simplified ➔ http://bshaffer.github.io/oauth2-server-php- docs/overview/grant-types/ ➔ http://pt.slideshare.net/TiagoMarchettiDolphi/oauth2- uma-abordagem-para-segurana-de-aplicaes-e-apis- rest-devcamp-2014