Autentikasi Looker API menggunakan OAuth

Looker menggunakan OAuth untuk mengizinkan aplikasi klien OAuth melakukan autentikasi ke Looker API tanpa mengekspos client ID dan rahasia klien ke browser yang menjalankan aplikasi klien OAuth.

Aplikasi web yang menggunakan OAuth harus memenuhi persyaratan berikut:

  • Autentikasi menggunakan OAuth hanya tersedia dengan Looker API 4.0.
  • Aplikasi klien OAuth harus didaftarkan ke Looker terlebih dahulu menggunakan API sebelum pengguna aplikasi dapat melakukan autentikasi ke Looker.
  • Aplikasi klien harus menggunakan HTTPS untuk semua permintaan ke Looker API. Aplikasi klien yang ingin menggunakan SubtleCrypto API yang disediakan oleh browser harus dihosting HTTPS.

Dukungan CORS Looker API

Looker API mendukung pemanggilan di browser dan di seluruh origin menggunakan protokol Cross-Origin Resource Sharing (CORS). Dukungan CORS Looker memiliki persyaratan berikut:

  • Hanya origin yang tercantum dalam daftar domain tersemat yang diizinkan yang dapat memanggil API menggunakan CORS.
  • Hanya token akses yang diperoleh dari OAuth, atau dari pemanggilan endpoint /login API, yang dapat digunakan untuk melakukan panggilan ke Looker API menggunakan CORS.

    Endpoint /login API tidak dapat dipanggil menggunakan permintaan CORS. Aplikasi klien yang ingin memanggil Looker API menggunakan permintaan CORS harus menggunakan proses login OAuth yang dijelaskan dalam Melakukan Login Pengguna Menggunakan OAuth, atau mengambil token dari server aplikasi Anda atau dari panggilan API non-CORS.

Ringkasan autentikasi OAuth

Ringkasan proses autentikasi OAuth adalah sebagai berikut:

  1. Daftarkan aplikasi klien OAuth dengan Looker API.
  2. Tambahkan origin aplikasi klien OAuth Anda ke daftar domain tersemat yang diizinkan untuk panggilan API pertukaran kode dan panggilan CORS API berikutnya.
  3. Alihkan URL browser ke endpoint /auth di nama host UI Looker (bukan nama host Looker API) saat aplikasi klien OAuth mencoba mengautentikasi pengguna. Contoh, https://instance_name.looker.com.
  4. Jika pengguna berhasil diautentikasi dan login ke Looker, Looker akan segera menampilkan pengalihan OAuth ke aplikasi klien OAuth. Jika pengguna belum login ke Looker pada perangkat dan browser saat ini, layar login Looker akan ditampilkan dan pengguna diminta untuk login ke akun pengguna Looker menggunakan protokol autentikasi reguler.
  5. Dengan menggunakan kode otorisasi yang ditampilkan di pengalihan OAuth, aplikasi klien OAuth Anda selanjutnya harus melakukan panggilan ke endpoint /token pada nama host Looker API, misalnya, https://instance_name.looker.com:19999. Nama host API mungkin sama dengan atau berbeda dari nama host UI Looker. Endpoint /token hanya ada di host Looker API, dan endpoint /auth hanya ada di host UI Looker.
  6. Jika kode otorisasi yang diteruskan ke endpoint /token valid, Looker akan menampilkan API access_token yang diaktifkan untuk permintaan CORS API dari domain aplikasi klien OAuth.

Mendaftarkan aplikasi klien OAuth

Setiap aplikasi klien OAuth yang mencoba mengautentikasi ke Looker API menggunakan OAuth harus terlebih dahulu terdaftar dengan instance Looker sebelum Looker akan mengizinkan akses. Untuk mendaftarkan aplikasi klien OAuth:

  1. Buka API Explorer di instance Looker Anda.
  2. Menggunakan menu drop-down versi, pilih versi 4.0 - stabil API.
  3. Di bagian metode Auth, temukan endpoint register_oauth_client_app() API. Anda juga dapat menelusuri "aplikasi oauth" di kolom Penelusuran. Anda dapat menggunakan register_oauth_client_app() untuk mendaftarkan aplikasi klien OAuth dengan Looker. Klik tombol Run It, lalu masukkan parameter di API Explorer, lalu klik Run It lagi untuk mendaftarkan aplikasi klien OAuth, atau gunakan endpoint API register_oauth_client_app() secara terprogram. Parameter register_oauth_client_app() yang diperlukan adalah:

    • client_guid: ID unik global untuk aplikasi
    • redirect_uri: URI tempat aplikasi akan menerima pengalihan OAuth yang menyertakan kode otorisasi
    • display_name: Nama aplikasi yang ditampilkan kepada pengguna aplikasi
    • description: Deskripsi aplikasi yang ditampilkan kepada pengguna di halaman pengungkapan dan konfirmasi saat pengguna pertama kali login dari aplikasi

    Nilai dalam parameter client_guid dan redirect_uri harus sama dengan nilai yang akan diberikan aplikasi klien OAuth secara persis, atau autentikasi akan ditolak.

Melakukan login pengguna menggunakan OAuth

  1. Arahkan pengguna ke endpoint /auth di host UI. Contoh:

    async function oauth_login() {
      const code_verifier = secure_random(32)
      const code_challenge = await sha256_hash(code_verifier)
      const params = {
        response_type: 'code',
        client_id: '123456',
        redirect_uri: 'https://mywebapp.com:3000/authenticated',
        scope: 'cors_api',
        state: '1235813',
        code_challenge_method: 'S256',
        code_challenge: code_challenge,
      }
      const url = `${base_url}?${new URLSearchParams(params).toString()}` // Replace base_url with your full Looker instance's UI host URL, plus the `/auth` endpoint.
      log(url)
    
      // Stash the code verifier we created in sessionStorage, which
      // will survive page loads caused by login redirects
      // The code verifier value is needed after the login redirect
      // to redeem the auth_code received for an access_token
      //
      sessionStorage.setItem('code_verifier', code_verifier)
    
      document.location = url
    }
    
    function array_to_hex(array) {
      return Array.from(array).map(b => b.toString(16).padStart(2,'0')).join('')
    }
    
    function secure_random(byte_count) {
      const array = new Uint8Array(byte_count);
      crypto.getRandomValues(array);
      return array_to_hex(array)
    }
    
    async function sha256_hash(message) {
      const msgUint8 = new TextEncoder().encode(message)
      const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8)
      return base64.urlEncode(hashBuffer))  // Refers to the implementation of base64.encode stored at https://gist.github.com/jhurliman/1250118
    }
    

    Kode contoh di atas bergantung pada SubtleCrypto API yang disediakan oleh browser, tetapi browser akan mengizinkan penggunaan fungsi ini hanya dari halaman web (HTTPS) yang aman.

    Looker akan mencoba mengautentikasi pengguna menggunakan sistem autentikasi yang instance Looker-nya dikonfigurasi.

    • Jika pengguna sudah login ke Looker di browser saat ini (artinya, ada status cookie login aktif), pengguna tidak akan diminta untuk memasukkan kredensial login.
    • Jika ini adalah pertama kalinya pengguna ini login menggunakan aplikasi klien OAuth, Looker akan menampilkan halaman pengungkapan dan konfirmasi untuk diterima dan disetujui pengguna. Teks dari parameter description yang digunakan ketika aplikasi didaftarkan akan ditampilkan. Deskripsi harus menunjukkan tindakan yang akan dilakukan aplikasi dengan akun Looker pengguna. Ketika pengguna mengklik setuju, halaman akan dialihkan ke aplikasi redirect_uri.
    • Jika pengguna sudah login ke Looker di browser saat ini dan telah mengonfirmasi halaman pengungkapan, login OAuth akan langsung berjalan tanpa gangguan visual.
  2. Looker API akan menampilkan pengalihan OAuth ke aplikasi klien OAuth. Simpan kode otorisasi yang tercantum dalam parameter URI. Berikut adalah contoh URI pengalihan OAuth:

    https://mywebapp.com:3000/authenticated?&code=asdfasdfassdf&state=...
    

    Kode otorisasi ditampilkan setelah &code= di URI. Dalam contoh di atas, kode otorisasinya adalah asdfasdfassdf.

  3. Buat permintaan web ke endpoint /token di Looker API, dengan meneruskan kode otorisasi dan informasi aplikasi Anda. Contoh:

    async function redeem_auth_code(response_str) {
      const params = new URLSearchParams(response_str)
      const auth_code = params.get('code')
    
      if (!auth_code) {
        log('ERROR: No authorization code in response')
        return
      }
      log(`auth code received: ${auth_code}`)
      log(`state: ${params.get('state')}`)
    
      const code_verifier = sessionStorage.getItem('code_verifier')
      if (!code_verifier) {
        log('ERROR: Missing code_verifier in session storage')
        return
      }
      sessionStorage.removeItem('code_verifier')
      const response = await
      fetch('https://mycompany.looker.com:19999/api/token', {  // This is the URL of your Looker instance's API web service
        method: 'POST',
        mode: 'cors',    // This line is required so that the browser will attempt a CORS request.
        body: stringify({
          grant_type: 'authorization_code',
          client_id: '123456',
          redirect_uri: 'https://mywebapp.com:3000/authenticated',
          code: auth_code,
          code_verifier: code_verifier,
        }),
        headers: {
          'x-looker-appid': 'Web App Auth & CORS API Demo', // This header is optional.
          'Content-Type': 'application/json;charset=UTF-8'  // This header is required.
        },
      }).catch((error) => {
        log(`Error: ${error.message}`)
      })
    
      const info = await response.json()
      log(`/api/token response: ${stringify(info)}`)
    
      // Store the access_token and other info,
      // which in this example is done in sessionStorage
    
      const expires_at = new Date(Date.now() + (info.expires_in * 1000))
      info.expires_at = expires_at
      log(`Access token expires at ${expires_at.toLocaleTimeString()} local time.`)
      sessionStorage.setItem('access_info', stringify(info))
      access_info = info
    }
    

    Respons yang berhasil akan memberikan API access_token untuk aplikasi klien OAuth. Responsnya juga akan berisi refresh_token, yang dapat Anda gunakan nanti untuk mendapatkan access_token baru tanpa interaksi pengguna. refresh_token memiliki masa aktif satu bulan. Simpan refresh_token dengan aman.

    Semua token dalam sistem ini dapat dicabut oleh admin Looker kapan saja.