JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
APIs seguras com OAuth2
-
Upload
luiz-messias -
Category
Software
-
view
133 -
download
2
Transcript of APIs seguras com OAuth2
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!
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
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