Menggunakan AuthSub dengan .NET Client Library

Jeff Fisher, tim Google Data API
Agustus 2007

Pengantar: Mengapa AuthSub Penting?

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

Misalnya, Anda memiliki aplikasi web baru yang hebat yang ingin dikaitkan dengan data yang disimpan di layanan web Google. Sekarang, Anda ingin mengautentikasi untuk mengakses data pribadi ini. Mengapa tidak menggunakan sesuatu yang sederhana, seperti ClientLogin? Langkah ini akan berhasil, tetapi Anda kemudian bisa menangani data pribadi yang lebih besar: kredensial login pengguna. ClientLogin mengharuskan aplikasi Anda meminta nama pengguna dan sandi Google pengguna. Ini tidak masalah untuk aplikasi desktop yang berjalan di mesin pribadi pengguna, namun kurang ideal untuk aplikasi berbasis web. Selain kewajiban menangani kredensial ini di server Anda sendiri, mungkin beberapa pengguna yang lebih berhati-hati akan khawatir Anda akan 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 beberapa layanan lain (seperti Google Dokumen mereka). AuthSub menyelesaikan kedua masalah ini dengan mengizinkan pengguna melakukan autentikasi melalui server Google dan memungkinkan program Anda hanya meminta akses yang diperlukan.

Setelah Anda cukup membaca tentang teori di balik AuthSub, kini saatnya beralih ke coding! Untuk artikel ini, saya memilih untuk membuat semuanya sederhana dan melakukan segala sesuatu di dalam satu halaman ASP, tetapi Anda harus dapat dengan mudah mengintegrasikan teknik yang ditunjukkan di sini ke dalam aplikasi Anda sendiri.

Menangani Autentikasi

Jadi, apa yang diperlukan untuk 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 secara khusus. Hal ini 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 bagi Anda. Lihat 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. 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 terdaftar dengan Google dan akan menandatangani permintaan Anda ke server secara kriptografis. Argumen ini biasanya bernilai salah secara default, terutama saat bekerja di lingkungan pengujian.
  • session Ini adalah boolean lain yang menunjukkan bahwa Anda menginginkan "token sesi", bukan "token penggunaan satu kali". Peran argumen ini akan menjadi lebih jelas dalam beberapa saat.

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

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

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

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 bahwa "cl" yang digunakan di konstruktor untuk GAuthSubRequestFactory adalah nama layanan untuk Kalender. Anda dapat melihat FAQ Google Data API untuk mengetahui nama layanan lainnya.

AuthSub Aman (Terdaftar)

Jika memilih untuk mendaftarkan aplikasi web Anda, Anda dapat mengaktifkan tingkat keamanan tambahan saat menggunakan AuthSub. Tindakan ini memungkinkan Anda menandatangani semua permintaan yang dibuat oleh kode Anda secara digital, sehingga seseorang tidak dapat menggunakan token AuthSub yang diberikan kepada Anda, kecuali jika ia 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 lainnya yang harus Anda buat:

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

...

authFactory.PrivateKey = rsaKey;

Pertama-tama, perhatikan, bukan null, sekarang Anda 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 dari sertifikat x509 yang Anda daftarkan ke Google.

Membuat kunci pribadi RSA dan sertifikat yang ditandatangani sendiri dapat 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 menghasilkan kunci pribadi dan sertifikat X509 publik dalam format PEM yang masing-masing disebut "test_key.pem" dan "test_cert.pem",. Perhatikan bahwa sertifikat ditetapkan untuk didaftarkan ke "www.example.com" yang berbasis di Mountain View, CA, US. Ganti nilai yang tepat untuk perusahaan Anda di sini. File "test_cert.pem" berisi informasi yang perlu Anda kirim 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. Biasanya, 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 Kalender mereka.

<%@ 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 terkendali. Penggunaan library klien .NET memudahkan Anda mengintegrasikan situs berbasis ASP dengan layanan Google. Artikel ini dimaksudkan untuk membantu Anda memulai, tetapi ada referensi tambahan yang sebaiknya Anda lihat: