Autentikasi Looker API menggunakan OAuth

Looker menggunakan OAuth untuk mengizinkan aplikasi klien OAuth mengautentikasi 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 mengautentikasi 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 yang diizinkan untuk domain tersemat yang dapat memanggil API menggunakan CORS.
  • Hanya token akses yang diperoleh dari OAuth, atau dari memanggil endpoint /login API, 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 asal aplikasi klien OAuth Anda ke daftar yang diizinkan domain tersemat untuk panggilan API pertukaran kode dan panggilan API CORS berikutnya.
  3. Arahkan 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 di 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 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 access_token API 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 didaftarkan terlebih dahulu ke instance Looker sebelum Looker memberikan otorisasi akses. Untuk mendaftarkan aplikasi klien OAuth:

  1. Buka API Explorer di instance Looker Anda.
  2. Dengan menggunakan menu drop-down versi, pilih API versi 4.0 - stabil.
  3. Di bagian metode Auth, temukan endpoint API register_oauth_client_app(). Anda juga dapat menelusuri "aplikasi oauth" di kolom Telusuri. Anda dapat menggunakan register_oauth_client_app() untuk mendaftarkan aplikasi klien OAuth dengan Looker. Klik tombol Run It, masukkan parameter di API Explorer, lalu klik Run It lagi untuk mendaftarkan aplikasi klien OAuth, atau gunakan endpoint register_oauth_client_app() API 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 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 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 digunakan untuk mengonfigurasi 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 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 redirect_uri aplikasi.
    • Jika pengguna sudah login ke Looker di browser saat ini dan telah mengonfirmasi halaman pengungkapan, login OAuth akan langsung dilakukan 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 ke 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.