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 terlebih dahulu ke Looker 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 di HTTPS.

Dukungan CORS Looker API

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

  • Hanya origin yang tercantum dalam daftar yang diizinkan untuk domain tersemat yang dapat memanggil API menggunakan CORS.

  • Hanya token akses yang diperoleh dari OAuth, atau dari memanggil endpoint API /login, yang dapat digunakan untuk melakukan panggilan ke Looker API menggunakan CORS.

Ringkasan autentikasi OAuth

Ringkasan proses autentikasi OAuth adalah sebagai berikut:

  1. Daftarkan aplikasi klien OAuth dengan instance Looker Anda.
  2. Tambahkan origin aplikasi klien OAuth Anda ke daftar yang diizinkan untuk domain tersemat untuk panggilan API pertukaran kode dan panggilan API CORS 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 di perangkat dan browser, layar login Looker akan ditampilkan dan pengguna akan diminta untuk login ke akun pengguna Looker menggunakan protokol autentikasi reguler mereka.

  5. Dengan menggunakan kode otorisasi yang ditampilkan dalam pengalihan OAuth, aplikasi klien OAuth Anda selanjutnya harus melakukan panggilan ke endpoint /token di nama host Looker API, misalnya, https://instance_name.looker.com:19999. Nama host API mungkin sama atau berbeda dengan 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 access_token API yang diaktifkan untuk permintaan API CORS dari domain aplikasi klien OAuth.

Mendaftarkan aplikasi klien OAuth

Setiap aplikasi klien OAuth yang mencoba melakukan autentikasi ke Looker API menggunakan OAuth harus didaftarkan terlebih dahulu ke instance Looker sebelum Looker akan mengizinkan akses.

Admin Looker dapat mendaftarkan dan mengelola aplikasi klien OAuth kustom langsung di panel Admin Looker di halaman Manage OAuth Clients (Admin > Authentication > Manage OAuth clients). Antarmuka ini memungkinkan admin melakukan tugas berikut:

  • Konfigurasi satu atau beberapa URI Pengalihan yang diizinkan untuk aplikasi guna mendukung beberapa lingkungan dan port.
  • Membatasi akses otorisasi ke anggota grup pengguna Looker tertentu (Restrict to Group ID).
  • Melihat, mengedit, mengaktifkan, menonaktifkan, atau menghapus aplikasi kustom terdaftar.

Untuk petunjuk langkah demi langkah tentang cara mendaftarkan klien kustom di panel Admin, lihat halaman dokumentasi Setelan admin - Mengelola Klien OAuth.

Pendaftaran terprogram menggunakan API

Atau, administrator dapat mendaftarkan aplikasi klien OAuth secara terprogram dengan memanggil endpoint Register OAuth App secara langsung atau dengan menjalankannya di Looker API Explorer. Parameter tersebut mencakup:

  • client_guid: ID string unik untuk aplikasi (tidak boleh diawali dengan com.looker.).
  • redirect_uris: Array URI callback yang diizinkan tempat aplikasi akan menerima pengalihan OAuth dan kode otorisasi.
  • display_name: Nama aplikasi yang ditampilkan kepada pengguna.
  • description: Deskripsi aplikasi klien OAuth.
  • group_id (opsional): ID numerik grup Looker untuk membatasi akses.

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
    }
    

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

    • Jika pengguna sudah login ke Looker di browser saat ini (artinya ada status cookie login aktif), pengguna tidak akan diminta untuk memasukkan kredensial loginnya.
    • Jika ini adalah pertama kalinya pengguna ini login menggunakan aplikasi klien OAuth ini, Looker akan menampilkan halaman pengungkapan dan konfirmasi untuk diakui dan disetujui oleh pengguna. Teks dari parameter description yang digunakan saat aplikasi didaftarkan akan ditampilkan. Deskripsi harus menunjukkan apa yang ingin dilakukan aplikasi dengan akun Looker pengguna. Saat pengguna mengklik terima, 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 dilakukan secara instan 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 ini, kode otorisasi 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 access_token API kepada aplikasi klien OAuth. Respons 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.