Lezione 12:
    Autenticazione e gestione
      delle sessioni in REST
         Corso di Programmazione in Rete
        La...
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
      dive...
Autenticazione SSL/TLS

    ✦ Per usare l’autenticazione nel livello di
      trasporto, si adotta il protocollo HTTPS
   ...
Autenticazione SSL/TLS
    ✦ L’autenticazione a livello trasporto è
      normalmente usata per verificare
      l’identit...
Autenticazione HTTP

    ✦ Il protocollo HTTP prevede due schemi di
      autenticazione del client
     •   basic authent...
Autenticazione HTTP

    ✦ In entrambi i casi, se la risorsa richiesta
      necessita di autenticazione, il server invia
...
Autenticazione HTTP
    ✦ Lo schema di basic authentication non è
      molto sicuro (la password viaggia in
      chiaro)...
Autenticazione HTTP

    ✦ In un client Java, l’autenticazione HTTP
      viene gestita automaticamente da
      HttpURLCo...
Autenticazione HTTP

     ✦ La classe deve essere derivata da
       Authenticator, e deve ridefinire il metodo:
       ge...
Autenticazione HTTP
      ✦ Esempio

     import java.net.*;
     import java.io.*;
     public class EsempioAuthenticator...
Autenticazione
     ✦ L’autenticazione può essere effettuata a
       livello applicazione, inviando come parte
       dei...
Gestione delle sessioni
     ✦ Un WS RESTful dovrebbe essere stateless
       (ogni richiesta è indipendente dalle altre)
...
Cookie
     ✦ Il principale meccanismo usato da HTTP
       per la gestione delle sessioni è costituito
       dai cookie
...
Cookie
     ✦ Il server invia i cookie usando nella
       risposta l’header Set-Cookie
      •   il valore di questo head...
Cookie
     ✦ Esempio
      •   per mostrare l’uso dei cookie definiamo una classe
          ausiliaria che mantiene l’ele...
Cookie
       ✦ Esempio
     import java.net.*;
     import java.util.*;

     public class CookieHolder {
     	   privat...
Cookie
        ✦ Esempio (continua)
     import java.net.*;
     import java.io.*;
     public class EsempioGetCookie {
  ...
Upcoming SlideShare
Loading in...5
×

Lezione12: Autenticazione e gestione delle sessioni in REST

3,742

Published on

✦ Autenticazione
✦ I cookie e la gestione delle sessioni

Published in: Education
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,742
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Lezione12: Autenticazione e gestione delle sessioni in REST

  1. 1. 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
  2. 2. Outline ✦ Autenticazione ✦ I cookie e la gestione delle sessioni 2
  3. 3. 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
  4. 4. 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
  5. 5. 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
  6. 6. 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
  7. 7. 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
  8. 8. 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
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. 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
  16. 16. 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
  17. 17. 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
  18. 18. 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

×