• Save
Lezione12: Autenticazione e gestione delle sessioni in REST
Upcoming SlideShare
Loading in...5
×
 

Lezione12: Autenticazione e gestione delle sessioni in REST

on

  • 4,306 views

✦ Autenticazione

✦ Autenticazione
✦ I cookie e la gestione delle sessioni

Statistics

Views

Total Views
4,306
Views on SlideShare
4,254
Embed Views
52

Actions

Likes
5
Downloads
0
Comments
0

3 Embeds 52

http://bizarro.iobloggo.com 27
http://www.slideshare.net 20
http://static.slidesharecdn.com 5

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Lezione12: Autenticazione e gestione delle sessioni in REST Lezione12: Autenticazione e gestione delle sessioni in REST Presentation Transcript

  • Lezione 12: Autenticazione e gestione delle sessioni in REST Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno 1
  • Outline ✦ Autenticazione ✦ I cookie e la gestione delle sessioni 2
  • Autenticazione ✦ In un WS Restful l’autenticazione delle richieste può essere gestita in tre livelli diversi del software: • nel protocollo di trasporto (SSL/TLS) • nel protocollo HTTP • nell’applicazione 3
  • Autenticazione SSL/TLS ✦ Per usare l’autenticazione nel livello di trasporto, si adotta il protocollo HTTPS invece di HTTP • HTTPS = HTTP + SSL/TLS • l’url comincia con https:// • in un client Java occorre semplicemente impostare i KeyStore e TrustStore usando le System Properties 4
  • Autenticazione SSL/TLS ✦ L’autenticazione a livello trasporto è normalmente usata per verificare l’identità del server, ma non quella del client • sarebbe complicato definire un certificato per ogni utente • l’autenticazione del client deve perciò essere fatta con altri metodi • HTTPS è comunque usato per rendere la comunicazione sicura crittograficamente 5
  • Autenticazione HTTP ✦ Il protocollo HTTP prevede due schemi di autenticazione del client • basic authentication: il client invia in chiaro insieme alla richiesta il suo username e la password • digest authentication: il server invia una stringa casuale al client (“challenge”), e il client risponde con il suo username e un digest ottenuto dalla stringa casuale e dalla password 6
  • Autenticazione HTTP ✦ In entrambi i casi, se la risorsa richiesta necessita di autenticazione, il server invia come risposta lo status 401 • insieme allo status 401 viene inviata l’eventuale challenge in un header della risposta ✦ Il client ripete la richiesta inserendo in un header i dati di autenticazione 7
  • Autenticazione HTTP ✦ Lo schema di basic authentication non è molto sicuro (la password viaggia in chiaro), ma può essere appropriato in congiunzione con HTTPS ✦ Lo schema di digest authentication invece non consente a un intruso di scoprire direttamente la password • può comunque essere opportuno usare HTTPS per aumentare la sicurezza e per garantire la riservatezza dei dati 8
  • Autenticazione HTTP ✦ In un client Java, l’autenticazione HTTP viene gestita automaticamente da HttpURLConnection ✦ Occorre però definire una classe che fornisca a HTTPURLConnection lo username e la password quando richiesti 9
  • Autenticazione HTTP ✦ La classe deve essere derivata da Authenticator, e deve ridefinire il metodo: getPasswordAuthentication ✦ Un’istanza di questa classe deve essere registrata con il metodo static di Authenticator: • static void setDefault(Authenticator auth) 10
  • Autenticazione HTTP ✦ Esempio import java.net.*; import java.io.*; public class EsempioAuthenticator { static class MyAuthenticator extends Authenticator { protected PasswordAuthentication getPasswordAuthentication() { String user="paperino"; String password="pippobaudo"; return new PasswordAuthentication(user, password.toCharArray()); } } public static void main(String args[]) throws Exception { Authenticator auth=new MyAuthenticator(); Authenticator.setDefault(auth); // Etc etc etc } } 11
  • Autenticazione ✦ L’autenticazione può essere effettuata a livello applicazione, inviando come parte dei dati della richiesta lo username e la password • Poco conforme allo stile REST • Può avere senso se si decide di implementare un servizio stateful (con gestione delle sessioni), in modo da effettuare l’autenticazione solo all’inizio della sessione 12
  • Gestione delle sessioni ✦ Un WS RESTful dovrebbe essere stateless (ogni richiesta è indipendente dalle altre) ✦ Molte web applications sono però stateful: le richieste di una stessa sessione di lavoro sono considerate collegate tra loro • è possibile realizzare WS RESTful che usano gli stessi meccanismi per mantenere traccia delle sessioni di lavoro 13
  • Cookie ✦ Il principale meccanismo usato da HTTP per la gestione delle sessioni è costituito dai cookie ✦ I cookie sono coppie chiave-valore inviate dal server al client e ripresentate dal client al server nelle richieste successive che fanno parte della stessa sessione • tipicamente viene usato un solo cookie che contiene un “session ID” generato casualmente • il server usa questo session ID come chiave per una tabella che contiene le informazioni di stato sulle singole sessioni 14
  • Cookie ✦ Il server invia i cookie usando nella risposta l’header Set-Cookie • il valore di questo header ha il formato: key=value; options • le opzioni sono usate per specificare, ad esempio, per quanto tempo il client deve conservare il cookie ✦ Il client restituisce i cookie al server usando nella richiesta l’header Cookie • il valore deve essere costituito solo dalla coppia key=value 15
  • Cookie ✦ Esempio • per mostrare l’uso dei cookie definiamo una classe ausiliaria che mantiene l’elenco dei cookie ricevuti dal server • prima di inviare una richiesta, il metodo putCookiesInRequest inserirà i cookies nei request header • dopo aver ottenuto una risposta, il metodo getCookiesFromResponse preleverà gli eventuali altri cookies inviati dal server 16
  • Cookie ✦ Esempio import java.net.*; import java.util.*; public class CookieHolder { private List<String> cookies; public CookieHolder() { cookies=new ArrayList<String>(); } public void getCookiesFromResponse(HttpURLConnection conn) { Map<String, List<String>> headers=conn.getHeaderFields(); if (headers.containsKey("Set-Cookie")) for(String cookie : headers.get("Set-Cookie")) { int i=cookie.indexOf(";"); if (i>=0) cookie=cookie.substring(0, i); cookies.add(cookie); } } public void putCookiesInRequest(HttpURLConnection conn) { for(String cookie: cookies) { conn.addRequestProperty("Cookie", cookie); } } } 17
  • Cookie ✦ Esempio (continua) import java.net.*; import java.io.*; public class EsempioGetCookie { public static void main(String args[]) throws Exception { CookieHolder cookies=new CookieHolder(); URL url=new URL("http://en.wikipedia.org/wiki/Representational_State_Transfer"); HttpURLConnection conn=(HttpURLConnection)url.openConnection(); cookies.putCookiesInRequest(conn); int status=conn.getResponseCode(); cookies.getCookiesFromResponse(conn); System.out.println("RESPONSE CODE: "+status); System.out.println("CONTENT TYPE: "+conn.getContentType()); // etc etc etc } } 18