Bagikan melalui


Autentikasi Menggunakan Skrip

Bagian ini menunjukkan cara menulis skrip yang menggunakan objek WinHttpRequest untuk mengakses data dari server yang memerlukan autentikasi HTTP.

Prasyarat dan Persyaratan

Selain pengetahuan kerja tentang Microsoft JScript, contoh ini memerlukan hal berikut:

  • Versi Kit Pengembangan Perangkat Lunak (SDK) Microsoft Windows saat ini.
  • Alat konfigurasi proksi untuk membuat pengaturan proksi untuk Microsoft Windows HTTP Services (WinHTTP), jika koneksi Anda ke Internet melalui server proksi. Lihat Proxycfg.exe, Alat Konfigurasi Proksi untuk informasi selengkapnya.
  • Keakraban dengan terminologi dan konsep jaringan.

Mengakses Situs Web Dengan Autentikasi

Untuk membuat skrip yang menunjukkan autentikasi, lakukan hal berikut:

  1. Buka editor teks seperti Microsoft Notepad.

  2. Salin kode berikut ke editor teks setelah mengganti "[authenticationSite]" dengan teks yang sesuai untuk menentukan URL situs yang memerlukan autentikasi HTTP.

    // Load the WinHttpRequest object.
    var WinHttpReq = 
              new ActiveXObject("WinHttp.WinHttpRequest.5.1");
    
    function getText1( )
    {
      // Specify the target resource.
      WinHttpReq.open( "GET", 
                       "https://[authenticationSite]", 
                       false;
    
      // Send a request to the server and wait for a response.
      WinHttpReq.send( );
    
      // Display the results of the request.
      WScript.Echo( "No Credentials: " );
      WScript.Echo( WinHttpReq.Status + "   " + WinHttpReq.StatusText);
      WScript.Echo( WinHttpReq.GetAllResponseHeaders);
      WScript.Echo( );
    };
    
    function getText2( )
    {
      // HttpRequest SetCredentials flags
      HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
    
      // Specify the target resource.
      WinHttpReq.open( "GET", 
                       "https://[authenticationSite]", 
                       false );
    
      // Set credentials for server.
      WinHttpReq.SetCredentials( "User Name", 
                                 "Password",
                                 HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
    
      // It might also be necessary to supply credentials 
      // to the proxy if you connect to the Internet 
      // through a proxy that requires authentication.
    
      // Send a request to the server and wait for 
      // a response.
      WinHttpReq.send( );
    
      // Display the results of the request.
      WScript.Echo( "Credentials: " );
      WScript.Echo( WinHttpReq.Status + "   " + WinHttpReq.StatusText );
      WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) );
      WScript.Echo( );
    };
    
    getText1( );
    getText2( );
    
  3. Simpan file sebagai "Auth.js".

  4. Dari prompt perintah, ketik "cscript Auth.js" dan tekan ENTER.

Anda sekarang memiliki program yang meminta sumber daya dengan dua cara berbeda. Metode pertama meminta sumber daya tanpa memasok kredensial. Kode status 401 dikembalikan untuk menunjukkan bahwa server memerlukan autentikasi. Header respons juga ditampilkan dan akan terlihat mirip dengan yang berikut ini:

Connection: Keep-Alive
Content-Length: 0
Date: Fri, 27 Apr 2001 01:47:18 GMT
Content-Type: text/html
Server: Microsoft-IIS/5.0
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
Cache-control: private

Meskipun respons menunjukkan bahwa akses ke sumber daya ditolak, respons masih mengembalikan beberapa header yang memberikan beberapa informasi tentang sumber daya. Header bernama "WWW-Authenticate" menunjukkan bahwa server memerlukan autentikasi untuk sumber daya ini. Jika ada header bernama "Proxy-Authenticate", itu akan menunjukkan bahwa server proksi memerlukan autentikasi. Setiap header autentikasi berisi skema autentikasi yang tersedia dan terkadang realm. Nilai realm peka huruf besar/kecil dan mendefinisikan sekumpulan server atau proksi yang kredensialnya sama harus diterima.

Ada dua header bernama "WWW-Authenticate", yang menunjukkan bahwa beberapa skema autentikasi didukung. Jika Anda memanggil metode GetResponseHeader untuk menemukan header "WWW-Authenticate", metode hanya mengembalikan konten header pertama dari nama tersebut. Dalam hal ini, ia mengembalikan nilai "NTLM". Untuk memastikan bahwa semua kemunculan header diproses, gunakan metode GetAllResponseHeaders sebagai gantinya.

Panggilan metode kedua meminta sumber daya yang sama, tetapi pertama-tama memasok kredensial autentikasi dengan memanggil metode SetCredentials . Bagian kode berikut menunjukkan bagaimana metode ini digunakan.

WinHttpReq.SetCredentials( "User Name", "Password",
                               HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);

Metode ini mengatur nama pengguna ke "UserName", kata sandi ke "Kata Sandi", dan menunjukkan bahwa kredensial otorisasi berlaku untuk server sumber daya. Kredensial autentikasi juga dapat dikirim ke proksi.

Ketika kredensial disediakan, server mengembalikan kode status 200 yang menunjukkan bahwa dokumen dapat diambil.

Memeriksa Kode Status

Contoh sebelumnya bersifat instruksional, tetapi mengharuskan pengguna secara eksplisit menyediakan kredensial. Aplikasi yang memasok kredensial ketika diperlukan dan tidak menyediakan kredensial ketika tidak diperlukan lebih berguna. Untuk mengimplementasikan fitur yang melakukan ini, Anda harus memodifikasi contoh Anda untuk memeriksa kode status yang dikembalikan dengan respons.

Untuk daftar lengkap kemungkinan kode status, bersama dengan deskripsi, lihat Kode Status HTTP. Namun, untuk contoh ini, Anda hanya harus menemukan salah satu dari tiga kode. Kode status 200 menunjukkan bahwa sumber daya tersedia dan sedang dikirim dengan respons. Kode status 401 menunjukkan bahwa server memerlukan autentikasi. Kode status 407 menunjukkan bahwa proksi memerlukan autentikasi.

Ubah contoh yang Anda buat di bagian terakhir dengan mengganti fungsi "getText2" dengan kode berikut (ganti "[authenticationSite]" dengan teks Anda sendiri untuk menentukan URL situs yang memerlukan autentikasi HTTP):

function getText2() {
  WScript.Echo( "Credentials: " );

  // HttpRequest SetCredentials flags.
  HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
  HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1;

  // Specify the target resource.
  var targURL = "https://[authenticationSite]";
  WinHttpReq.open( "GET", targURL, false );

  var Done = false;
  var Attempts = 0;
  do
  {
    // Keep track of the number of request attempts.
    Attempts++;

    // Send a request to the server and wait for a response.
    WinHttpReq.send( );

    // Obtain the status code from the response.
    var Status = WinHttpReq.Status;

    switch (Status)
    {
      // A 200 status indicates that the resource was retrieved.
      case 200:
        Done = true;
        break;

      // A 401 status indicates that the server 
      // requires authentication.
      case 401:
        WScript.Echo( "Requires Server UserName and Password." );

        // Specify the target resource.
        WinHttpReq.open( "GET", targURL, false );

        // Set credentials for the server.
        WinHttpReq.SetCredentials( "User Name", 
                             "Password",
                              HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
        break;

      // A 407 status indicates that the proxy 
      // requires authentication.
      case 407:
        WScript.Echo( "Requires Proxy UserName and Password." );

        // Specify the target resource.
        WinHttpReq.open( "GET", targURL, false );

        // Set credentials for the proxy.
        WinHttpReq.SetCredentials( "User Name", 
                              "Password",
                              HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
        break;
    }
  } while( ( !Done ) && ( Attempts < 3 ) );

  // Display the results of the request.
  WScript.Echo( WinHttpReq.Status + "   " + WinHttpReq.StatusText );
  WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) );
  WScript.Echo( );
};

Sekali lagi, simpan dan jalankan file. Metode kedua masih mengambil dokumen, tetapi hanya menyediakan kredensial jika diperlukan. Fungsi "getText2" menjalankan metode Buka dan Kirim seolah-olah autentikasi tidak diperlukan. Status diambil dengan properti Status dan pernyataan pengalih merespons kode status yang dihasilkan. Jika statusnya adalah 401 (server memerlukan autentikasi) atau 407 (proksi memerlukan autentikasi), metode Buka dijalankan lagi. Ini diikuti oleh metode SetCredentials , yang mengatur nama pengguna dan kata sandi. Kode kemudian mengulang kembali ke metode Kirim . Jika, setelah tiga upaya, sumber daya tidak dapat berhasil diambil, maka fungsi menghentikan eksekusi.

Autentikasi di WinHTTP

WinHttpRequest

SetCredentials

HTTP/1.1 Permintaan Komentar (RFC 2616)