Menggunakan AuthSub dengan Library Klien .NET

Jeff Fisher, tim Google Data API
Agustus 2007

Pengantar: Mengapa AuthSub Penting?

Keunggulan Google Data API ("GData" untuk singkatnya) adalah kemampuannya untuk memungkinkan developer membuat aplikasi yang berinteraksi dengan layanan Google. Lebih khusus lagi, izin ini memungkinkan Anda mengakses data pribadi pengguna untuk digunakan di aplikasi Anda. API ini memungkinkan Anda menulis aplikasi untuk menyinkronkan, mengimpor, mengekspor, dan mengelola data tersebut. Meskipun API ini memberi Anda kemampuan yang canggih, Anda harus ingat untuk menggunakannya secara bertanggung jawab. Karena data pengguna adalah informasi pribadi, tentu saja Anda ingin mengaksesnya dengan cara yang aman. Bagian penting dari hal ini adalah kemampuan untuk mengautentikasi ke server Google dengan cara yang aman.

Misalnya, Anda memiliki aplikasi web baru yang bagus dan ingin mengikatnya ke data yang disimpan di layanan web Google. Sekarang Anda ingin melakukan autentikasi untuk mengakses data pribadi ini. Mengapa tidak menggunakan sesuatu yang sederhana, seperti ClientLogin? Cara tersebut memang akan berhasil, tetapi Anda akan menangani lebih banyak data pribadi: kredensial login pengguna. ClientLogin mewajibkan aplikasi Anda meminta nama pengguna dan sandi Google pengguna. Hal ini tidak masalah untuk aplikasi desktop yang berjalan di komputer pribadi pengguna, tetapi kurang ideal untuk aplikasi berbasis web. Selain kewajiban menangani kredensial ini di server Anda sendiri, mungkin beberapa pengguna Anda yang lebih berhati-hati akan takut bahwa Anda mungkin menyimpan informasi mereka. Kekhawatiran umum lainnya dari pengguna adalah jika mereka hanya ingin memberikan akses program ke satu layanan tertentu (seperti acara di Google Kalender mereka), tetapi tidak ke layanan lain (seperti Google Dokumen mereka). AuthSub memecahkan kedua masalah ini dengan memungkinkan pengguna melakukan autentikasi melalui server Google dan memungkinkan program Anda hanya meminta akses yang diperlukan.

Setelah Anda membaca cukup banyak tentang teori di balik AuthSub, sekarang saatnya beralih ke beberapa coding. Untuk artikel ini, saya memilih untuk menyederhanakan dan melakukan semuanya di dalam satu halaman ASP, tetapi Anda dapat dengan mudah mengintegrasikan teknik yang ditunjukkan di sini ke dalam aplikasi Anda sendiri.

Menangani Autentikasi

Jadi, apa yang diperlukan untuk benar-benar menggunakan AuthSub di aplikasi web Anda? Pertama, ada beberapa impor standar dari library klien GData:

<%@ Import Namespace="Google.GData.Client" %>
<%@ Import Namespace="Google.GData.Extensions" %>
<%@ Import Namespace="System.Net" %>

Sekarang, hal pertama yang harus Anda lakukan adalah mengarahkan pengguna ke URL yang dibuat khusus. Inilah yang memungkinkan server Google menangani autentikasi, lalu mengalihkan pengguna kembali ke situs Anda. Untungnya, Anda tidak perlu membuat URL ini secara manual, karena ada metode untuk melakukannya. Perhatikan contoh berikut:

authSubUrl = AuthSubUtil.getRequestUrl(target, scope, secure, session);
  • target Ini adalah string yang berisi URL ke aplikasi web Anda. Di sinilah pengguna akan dialihkan setelah melakukan autentikasi.
  • scope String ini ditentukan oleh API yang Anda gunakan. Kolom ini sesuai dengan salah satu feed di GData API. Misalnya, feed yang berisi semua informasi kalender untuk pengguna adalah "http://www.google.com/calendar/feeds/default/private/full".
  • secure Ini adalah boolean yang memberi tahu server bahwa Anda telah mendaftar ke Google dan akan menandatangani permintaan Anda ke server secara kriptografis. Argumen ini biasanya salah secara default, terutama saat bekerja di lingkungan pengujian.
  • session Ini adalah boolean lain yang menunjukkan bahwa Anda menginginkan "token sesi" dan bukan "token penggunaan satu kali". Peran argumen ini akan menjadi lebih jelas sesaat lagi.

Setelah pengguna mengklik URL yang dibuat, mereka akan diarahkan ke halaman Akun Google yang memungkinkan mereka login ke Akun Google mereka. Kemudian, pengguna akan dialihkan kembali ke halaman web yang Anda tentukan dalam variabel "target", tetapi dengan parameter kueri "token" yang berisi token penggunaan satu kali. Biasanya, token ini dapat digunakan tepat satu kali. Artinya, API ini dapat digunakan untuk melakukan satu tindakan pada feed tertentu. Namun, jika Anda menentukan parameter "session" sebagai true, parameter tersebut dapat ditukar dengan "token sesi" yang dapat digunakan kembali hingga pengguna mengakhiri sesi. Anda dapat melakukannya dengan cara berikut:

String token = Request.QueryString["token"];
Session["token"] = AuthSubUtil.exchangeForSessionToken(token, null).ToString();

Di sini, Anda mengekstrak token dari parameter kueri dan menukarkannya dengan "token sesi". Kemudian, agar dapat disimpan untuk digunakan nanti, Anda dapat memilih untuk menyimpannya dalam array Session otomatis .NET. Tentu saja, Anda juga dapat memilih untuk menyimpan token dalam database. Langkah selanjutnya adalah menggunakan token ini untuk membuat permintaan terautentikasi:

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "My-Cool-Application");
authFactory.Token = (String) Session["token"];
CalendarService service = new CalendarService(authFactory.ApplicationName);
service.RequestFactory = authFactory;

Di sini Anda menyiapkan objek CalendarService untuk berinteraksi dengan Google Calendar API menggunakan AuthSub untuk autentikasi. Perhatikan "cl" yang digunakan dalam konstruktor untuk GAuthSubRequestFactory adalah nama layanan untuk Kalender. Anda dapat melihat FAQ Google Data API untuk nama layanan lainnya.

AuthSub Aman (Terdaftar)

Jika Anda memilih untuk mendaftarkan aplikasi web Anda, Anda dapat mengaktifkan tingkat keamanan tambahan saat menggunakan AuthSub. Hal ini memungkinkan Anda menandatangani semua permintaan yang dibuat oleh kode Anda secara digital, sehingga seseorang tidak dapat menggunakan token AuthSub yang dikeluarkan untuk Anda kecuali jika mereka memiliki kunci pribadi Anda. Langkah pertama adalah memastikan Anda membuat link AuthSub yang benar saat memanggil AuthSubUtil.getRequestUrl dengan menyetel argumen "secure" ke true. Ada dua perubahan kode lain yang perlu Anda lakukan:

String token = Request.QueryString["token"];
Session["token"] = AuthSubUtil.exchangeForSessionToken(token, rsaKey).ToString();

...

authFactory.PrivateKey = rsaKey;

Pertama, perhatikan bahwa alih-alih null, Anda sekarang meneruskan variabel "rsaKey" ke metode exchangeForSessionToken. Variabel yang sama ini juga digunakan untuk menetapkan properti GAuthSubRequestFactory saat menyiapkan koneksi ke layanan. Variabel "rsaKey" adalah RSACryptoServiceProvider yang sesuai dengan komponen kunci pribadi sertifikat x509 yang Anda daftarkan ke Google.

Membuat kunci pribadi RSA dan sertifikat yang ditandatangani sendiri bisa sedikit membingungkan, terutama karena framework .NET tidak memahami kunci atau sertifikat yang disimpan dalam format PEM. Perintah berikut menunjukkan cara membuat kunci pribadi dan sertifikat publik menggunakan rangkaian alat OpenSSL:

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \
  '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \
  test_key.pem -out test_cert.pem

openssl pkcs12 -export -in test_cert.pem -inkey test_key.pem \
  -out test_cert.pfx -name "Testing Certificate"

Langkah pertama membuat kunci pribadi dan sertifikat X509 publik dalam format PEM yang masing-masing disebut "test_key.pem" dan "test_cert.pem". Perhatikan bahwa sertifikat disetel untuk didaftarkan ke "www.example.com" yang berlokasi di Mountain View, CA, AS. Ganti nilai yang tepat untuk perusahaan Anda di sini. File "test_cert.pem" berisi informasi yang perlu Anda kirimkan di halaman pendaftaran AuthSub.

Langkah kedua membuat file PFX dari kunci pribadi dan sertifikat Anda. File ini dapat diimpor ke library klien .NET untuk menandatangani permintaan yang dibuat ke GData API secara digital. Kode berikut menunjukkan cara mengimpor kunci pribadi dari file PFX ke dalam aplikasi web:

protected AsymmetricAlgorithm getRsaKey()
{

  X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx","");
  RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider;

  return privateKey;
}

Fungsi getRsaKey() yang ditentukan oleh cuplikan ini dapat digunakan sebagai pengganti variabel "rsaKey" yang ditampilkan di atas saat digunakan untuk mengautentikasi ke API. Tentu saja, jalur file harus diganti dengan lokasi yang sesuai dari file PFX yang Anda buat.

Daftar Kode Lengkap

Cara termudah untuk menunjukkan cara menggunakan metode yang ditunjukkan di bagian sebelumnya adalah dengan contoh langsung. Kode contoh berikut adalah halaman ASP sederhana yang menggunakan AuthSub untuk mengautentikasi pengguna, lalu mencetak acara Google Kalendernya.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@ Import Namespace="Google.GData.Client" %>
<%@ Import Namespace="Google.GData.Extensions" %>
<%@ Import Namespace="Google.GData.Calendar" %>
<%@ Import Namespace="System.Net" %>

<script runat="server">
    void PrintCalendar() {

        GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "TesterApp");
        authFactory.Token = (String) Session["token"];
        CalendarService service = new CalendarService(authFactory.ApplicationName);
        service.RequestFactory = authFactory;

        EventQuery query = new EventQuery();

        query.Uri = new Uri("http://www.google.com/calendar/feeds/default/private/full");

        try
        {
            EventFeed calFeed = service.Query(query);
            foreach (Google.GData.Calendar.EventEntry entry in calFeed.Entries)
            {
                Response.Write("Event: " + entry.Title.Text + "<br/>");
            }
        }
        catch (GDataRequestException gdre)
        {
            HttpWebResponse response = (HttpWebResponse)gdre.Response;
            
            //bad auth token, clear session and refresh the page
            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                Session.Clear();
                Response.Redirect(Request.Url.AbsolutePath, true);
            }
            else
            {
                Response.Write("Error processing request: " + gdre.ToString());
            }
        }
    }

</script>


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Test Site</title>
</head>
<body>

    <form id="form1" runat="server">
    <h1>AuthSub Sample Page</h1>
    <div>
    <%
        GotoAuthSubLink.Visible = false;
        
        if (Session["token"] != null)
        {
            PrintCalendar();
        }
        else if (Request.QueryString["token"] != null)
        {
            String token = Request.QueryString["token"];
            Session["token"] = AuthSubUtil.exchangeForSessionToken(token, null).ToString();
            Response.Redirect(Request.Url.AbsolutePath, true);
        }
        else //no auth data, print link
        {
            GotoAuthSubLink.Text = "Login to your Google Account";
            GotoAuthSubLink.Visible = true;
            GotoAuthSubLink.NavigateUrl = AuthSubUtil.getRequestUrl(Request.Url.ToString(),
                "http://www.google.com/calendar/feeds/",false,true);
        }
        
     %>
    <asp:HyperLink ID="GotoAuthSubLink" runat="server"/>

    </div>
    </form>
</body>
</html>

Kesimpulan

AuthSub memungkinkan aplikasi web Anda mengakses data yang disimpan di Akun Google pengguna dengan cara yang aman dan terkontrol. Dengan menggunakan library klien .NET, Anda dapat dengan mudah mengintegrasikan situs berbasis ASP dengan layanan Google. Artikel ini dimaksudkan untuk membantu Anda memulai, tetapi ada referensi tambahan yang sebaiknya Anda baca: