apis seguras com oauth2

Post on 20-Jul-2015

133 Views

Category:

Software

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

APIs seguras comOAuth2

Maceió Dev Meetup #2

Tony Messias

Desenvolvedor Web há +4 anos

Análise de Sistemas CESMAC

@tony0x01

Cliente acessa recursos

usando um Access Token

obtido através de um

fluxo de autorização

Fim :)

OAuth2 > OAuth1(a)

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" }

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" }

POST /resources HTTP/1.1

Host: api.example.com

Authorization: Bearer vr5HmMkz123aksdmMibiJUusZwZCHueHue

Content-Type: application/json

{ "lorem" : "ipsum" }

POST /resources HTTP/1.1

Host: api.example.com

Authorization: Bearer vr5HmMkz123aksdmMibiJUusZwZCHueHue

Content-Type: application/json

{ "lorem" : "ipsum" }

Mas o líder do projeto

(OAuth2) deixou o projeto

Inseguro se não

usar SSL/TSL

Inseguro se não

usar SSL/TSL

correto

!

Alguns termos:

Resource Owner

também conhecido

como “usuário”

Resource Server

a sua API

Client

uma aplicação usando o

resource server a mando do

resource owner

Client

sua aplicação {web,mobile}

que utiliza a API

Authorization Server

Uma aplicação que fornece

os Access Tokens aos clients

Fluxos de Autorização

Authorization Code

o mais comum, com toda a

“dança” de redirects

Bob usa

uma aplicação web

Bob tem recursos

nessa aplicação web

Bob quer usar esses

recursos em uma

aplicação de terceiros

<a href=”https://oauth2server.com/auth?response_type=code& client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos”>

Login with Facebook</a>

Bob é redirecionado de volta

para a aplicação com um

código

https://oauth2client.com/callback?code=AUTH_CODE_HERE

A aplicação, então, utiliza

esse código para solicitar um

Access Token

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"}

Esse fluxo não é indicado

se o client for SEU

Resource Owner

Credentials

Mas o propósito do OAuth

não é nunca utilizar

credenciais do usuário?

Mais ou menos…

O propósito, na verdade, é

você não precisar fornecer

seu username e password

para terceiros

Mas e quando VOCÊ que

desenvolveu o client que

consome a SUA API?

Não faz sentido ter um

botão “login with X” quando

o X é a sua própria aplicação

Alice fornece seu

usuário e senha

O client (aplicação web)

utiliza essas credenciais para

conseguir um Access Token

POST https://api.oauth2server.com/token grant_type=password& username=USERNAME& password=PASSWORD& client_id=CLIENT_ID

Response:{

“access_token”: “RsT5OjbzRn430zqMLgV3Ia”}

É isso! Sem mais redirects.

Client Credentials

as máquinas também

precisam de autorização!

Paracido com o Resource

Owner Credentials, mas para

aplicações

Exemplo: Microserviços

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

Refresh Token

porque Access Token deve

ter um tempo de vida

Você pode fornecer, junto

com o Access Token, um

Refresh Token e um TTL

Adiciona mais

complexidade aos clients

POSTahttps://api.oauth2server.com/token?

grant_type=refresh_token&refresh_token=TOKEN

{

"access_token": “ACCESS_TOKEN”,

"expires_at": timestamp,

"refresh_token": “REFRESH_TOKEN”

}

Sugestões

Envie os Access Token

via Header

Cuidado com

Single Page Apps

fim!

agora é sério!

top related