Autentikasi Looker API menggunakan OAuth

Looker menggunakan OAuth untuk mengizinkan aplikasi klien OAuth melakukan autentikasi ke Looker API tanpa mengekspos ID klien 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 API SubtleCrypto yang disediakan oleh browser harus dihosting 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 sematan yang dapat memanggil API menggunakan CORS.
  • Hanya token akses yang diperoleh dari OAuth, atau dari panggilan endpoint API /login, yang dapat digunakan untuk melakukan panggilan ke Looker API menggunakan CORS.

    Endpoint API /login 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 yang diizinkan untuk domain sematan untuk panggilan API pertukaran kode dan panggilan API CORS berikutnya.
  3. Mengalihkan 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 mengizinkan akses. Untuk mendaftarkan aplikasi klien OAuth:

  1. Buka API Explorer di instance Looker Anda.
  2. Menggunakan menu drop-down versi, pilih versi API 4.0 - stable.
  3. Di bagian metode Auth, temukan endpoint API register_oauth_client_app(). 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 dan 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 secara global untuk aplikasi
    • redirect_uri: URI tempat aplikasi akan menerima pengalihan OAuth yang mencakup 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 persis dengan nilai yang akan diberikan oleh aplikasi klien OAuth, 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
    }
    

    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 agar pengguna menyetujui dan menerimanya. 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 menyetujui 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 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 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 berlaku satu bulan. Simpan refresh_token dengan aman.

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