Panduan Migrasi alur Out-Of-Band (OOB)

Ringkasan

Pada 16 Februari 2022, kami mengumumkan rencana untuk membuat interaksi Google OAuth lebih aman dengan menggunakan alur OAuth yang lebih aman. Panduan ini membantu Anda memahami perubahan dan langkah-langkah yang diperlukan agar berhasil bermigrasi dari alur out-of-band (OOB) OAuth ke alternatif yang didukung.

Upaya ini adalah tindakan perlindungan terhadap serangan phishing dan peniruan identitas aplikasi selama interaksi dengan endpoint otorisasi OAuth 2.0 Google.

Apa itu OOB?

Out-of-band (OOB) OAuth, yang juga disebut sebagai opsi salin dan tempel manual, adalah alur lama yang dikembangkan untuk mendukung klien terinstal yang tidak memiliki URI pengalihan untuk menerima kredensial setelah pengguna menyetujui permintaan izin OAuth. Alur OOB menimbulkan risiko phishing jarak jauh dan klien harus bermigrasi ke metode alternatif untuk melindungi dari kerentanan ini.

Alur OOB tidak digunakan lagi untuk semua jenis aplikasi—yaitu, aplikasi Web, Android, iOS, Universal Windows Platform (UWP), aplikasi Chrome, TV & perangkat input terbatas, aplikasi Desktop.

Tanggal penting kepatuhan

  • 28 Februari 2022 - penggunaan OAuth baru diblokir untuk alur OOB
  • 5 September 2022 - pesan peringatan yang ditampilkan kepada pengguna dapat ditampilkan untuk permintaan OAuth yang tidak mematuhi kebijakan
  • 3 Oktober 2022 - Alur OOB tidak digunakan lagi untuk klien OAuth yang dibuat sebelum 28 Februari 2022
  • 31 Januari 2023 - semua klien yang ada akan diblokir (termasuk klien yang dikecualikan)

Pesan error yang ditampilkan kepada pengguna akan ditampilkan untuk permintaan yang tidak mematuhi kebijakan. Pesan tersebut akan menyampaikan kepada pengguna bahwa aplikasi diblokir sekaligus menampilkan email dukungan yang telah Anda daftarkan di layar izin OAuth di Konsol Google Cloud.

Ada dua langkah utama untuk menyelesaikan proses migrasi:

  1. Tentukan apakah Anda terpengaruh.
  2. Bermigrasi ke alternatif yang lebih aman jika Anda terpengaruh.

Menentukan apakah Anda terpengaruh

Penghentian penggunaan ini hanya berlaku untuk aplikasi produksi (yaitu aplikasi dengan status publikasi yang ditetapkan ke Dalam Produksi. Alur ini akan terus berfungsi untuk aplikasi dengan Status publikasi pengujian.

Tinjau status publikasi Anda di halaman Branding OAuth di Konsol Google Cloud dan lanjutkan ke langkah berikutnya jika Anda menggunakan alur OOB dalam project dengan status publikasi "Dalam Produksi".

Cara menentukan apakah aplikasi Anda menggunakan alur OOB

Periksa kode aplikasi Anda atau panggilan jaringan keluar (jika aplikasi Anda menggunakan library OAuth) untuk menentukan apakah permintaan otorisasi Google OAuth yang dibuat aplikasi Anda menggunakan nilai URI pengalihan OOB.

Memeriksa kode aplikasi Anda

Tinjau bagian kode aplikasi tempat Anda melakukan panggilan ke endpoint otorisasi Google OAuth dan tentukan apakah parameter redirect_uri memiliki salah satu nilai berikut:

  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob

Contoh permintaan alur pengalihan OOB terlihat seperti berikut:

https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Memeriksa panggilan jaringan keluar

Metode untuk memeriksa panggilan jaringan akan bervariasi bergantung pada jenis aplikasi Anda.

Saat memeriksa panggilan jaringan, cari permintaan yang dikirim ke endpoint otorisasi Google OAuth dan tentukan apakah parameter redirect_uri memiliki salah satu nilai berikut:

  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob

Contoh permintaan alur pengalihan OOB terlihat seperti berikut:

https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Bermigrasi ke alternatif yang aman

Klien Seluler (Android dan iOS)

Jika Anda menentukan bahwa aplikasi Anda menggunakan alur OOB dengan jenis aplikasi OAuth Android atau iOS, Anda harus bermigrasi untuk menggunakan SDK yang direkomendasikan (Android, iOS).

SDK ini membantu Anda mengakses Google API dan menangani semua panggilan ke endpoint otorisasi OAuth 2.0 Google.

Link dokumentasi berikut memberikan informasi tentang cara menggunakan SDK yang direkomendasikan untuk mengakses Google API tanpa menggunakan URI pengalihan OOB.

Mengakses Google API di Android

Akses sisi klien

Contoh berikut menunjukkan cara mengakses Google API di sisi klien di Android menggunakan Library Android Google Identity Services yang direkomendasikan.

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest =
    AuthorizationRequest.builder()
        .setRequestedScopes(requestedScopes)
        .build();
Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener(
        authorizationResult -> {
          if (authorizationResult.hasResolution()) {
            // Access needs to be granted by the user
            PendingIntent pendingIntent =
                authorizationResult.getPendingIntent();
            try {
              startIntentSenderForResult(
                  pendingIntent.getIntentSender(),
                  REQUEST_AUTHORIZE, null, 0, 0, 0, null);
            } catch (IntentSender.SendIntentException e) {
              Log.e(
                  TAG,
                  "Couldn't start Authorization UI: "
                      + e.getLocalizedMessage());
            }
          } else {
            // Access already granted, continue with user action
            saveToDriveAppFolder(authorizationResult);
          }
        })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

Teruskan authorizationResult ke metode yang Anda tentukan untuk menyimpan konten ke folder drive pengguna. authorizationResult memiliki metode getAccessToken() yang menampilkan token akses.

Akses Sisi Server (offline)

Contoh berikut menunjukkan cara mengakses Google API di sisi server di Android.

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest =
    AuthorizationRequest.builder()
        .requestOfflineAccess(webClientId)
        .setRequestedScopes(requestedScopes)
        .build();
Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener(
        authorizationResult -> {
          if (authorizationResult.hasResolution()) {
            // Access needs to be granted by the user
            PendingIntent pendingIntent =
                authorizationResult.getPendingIntent();
            try {
              startIntentSenderForResult(
                  pendingIntent.getIntentSender(),
                  REQUEST_AUTHORIZE, null, 0, 0, 0, null);
            } catch (IntentSender.SendIntentException e) {
              Log.e(
                  TAG,
                  "Couldn't start Authorization UI: "
                      + e.getLocalizedMessage());
            }
          } else {
            String authCode =
                authorizationResult.getServerAuthCode();
          }
        })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

authorizationResult memiliki metode getServerAuthCode() yang menampilkan kode otorisasi yang dapat Anda kirim ke backend untuk mendapatkan token akses dan token refresh.

Mengakses Google API di Aplikasi iOS

Akses sisi klien

Contoh berikut menunjukkan cara mengakses Google API di sisi klien di iOS.

user.authentication.do { authentication, error in
  guard error == nil else { return }
  guard let authentication = authentication else { return }
  
  // Get the access token to attach it to a REST or gRPC request.
  let accessToken = authentication.accessToken
  
  // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
  // use with GTMAppAuth and the Google APIs client library.
  let authorizer = authentication.fetcherAuthorizer()
}

Gunakan token akses untuk memanggil API, baik dengan menyertakan token akses di header permintaan REST atau gRPC (Authorization: Bearer <var>ACCESS_TOKEN</var>), maupun dengan menggunakan pengizinan pengambil (GTMFetcherAuthorizationProtocol) dengan library klien Google API untuk Objective-C untuk REST.

Tinjau panduan akses sisi klien tentang cara mengakses Google API di sisi klien.

Akses sisi server (offline)

Contoh berikut menunjukkan cara mengakses Google API di sisi server untuk mendukung klien iOS.

GIDSignIn.sharedInstance.signIn(
    with: signInConfig, presenting: self
) { user, error in
  guard error == nil else { return }
  guard let user = user else { return }
  
  // request a one-time authorization code that your server exchanges for
  // an access token and refresh token
  let authCode = user.serverAuthCode
}

Tinjau panduan akses sisi server tentang cara mengakses Google API dari sisi server.

Klien Aplikasi Chrome

Jika Anda menentukan bahwa aplikasi Anda menggunakan alur OOB di klien aplikasi Chrome, Anda harus bermigrasi untuk menggunakan Chrome Identity API.

Contoh berikut menunjukkan cara mendapatkan semua kontak pengguna tanpa menggunakan URI pengalihan OOB.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {

  
  // retrieve access token
  chrome.identity.getAuthToken({interactive: true}, function(token) {
  
  // ..........


  // the following example shows how to use a retrieved access token with an
  // appropriate scope to call the Google People API contactGroups.get endpoint

  fetch(
    'https://people.googleapis.com/v1/contactGroups/all'
        + '?maxMembers=20&key=API_KEY',
    init)
    .then((response) => response.json())
    .then(function(data) {
      console.log(data)
    });
   });
 });
};

Tinjau panduan Chrome Identity API untuk mengetahui informasi selengkapnya tentang cara mengakses pengguna yang diautentikasi dan memanggil endpoint Google dengan Chrome Identity API.

Aplikasi Web

Jika Anda menentukan bahwa aplikasi Anda menggunakan alur OOB untuk aplikasi web, Anda harus bermigrasi untuk menggunakan salah satu library klien Google API kami. Lihat daftar library klien Google API untuk berbagai bahasa pemrograman.

Library ini menyederhanakan akses ke Google API dan menangani semua panggilan ke endpoint Google.

Akses sisi server (offline)

Mode akses sisi server (offline) mengharuskan Anda melakukan hal berikut :

  • Siapkan server dan tentukan endpoint yang dapat diakses secara publik (URI pengalihan) untuk menerima kode otorisasi.
  • Konfigurasikan URI pengalihan di halaman Klien di Konsol Google Cloud

Cuplikan kode berikut menunjukkan contoh NodeJS penggunaan Google Drive API untuk mencantumkan file Google Drive pengguna di sisi server tanpa menggunakan URI pengalihan OOB.

async function main() {
  const server = http.createServer(async function (req, res) {

  if (req.url.startsWith('/oauth2callback')) {
    let q = url.parse(req.url, true).query;

    if (q.error) {
      console.log('Error:' + q.error);
    } else {
      
      // Get access and refresh tokens (if access_type is offline)
      let { tokens } = await oauth2Client.getToken(q.code);
      oauth2Client.setCredentials(tokens);

      // Example of using Google Drive API to list filenames in user's Drive.
      const drive = google.drive('v3');
      drive.files.list({
        auth: oauth2Client,
        pageSize: 10,
        fields: 'nextPageToken, files(id, name)',
      }, (err1, res1) => {
        // TODO(developer): Handle response / error.
      });
    }
  }
}

Tinjau panduan aplikasi web sisi server tentang cara mengakses Google API dari sisi server.

Akses Sisi Klien

Cuplikan kode berikut, dalam JavaScript, menunjukkan contoh penggunaan Google API untuk mengakses acara kalender pengguna di sisi klien.


// initTokenClient() initializes a new token client with your
// web app's client ID and the scope you need access to

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  
  // callback function to handle the token response
  callback: (tokenResponse) => {
    if (tokenResponse && tokenResponse.access_token) { 
      gapi.client.setApiKey('YOUR_API_KEY');
      gapi.client.load('calendar', 'v3', listUpcomingEvents);
    }
  },
});

function listUpcomingEvents() {
  gapi.client.calendar.events.list(...);
}

Tinjau panduan aplikasi web sisi klien tentang cara mengakses Google API dari sisi klien.

Klien desktop

Jika Anda menentukan bahwa aplikasi Anda menggunakan alur OOB pada klien desktop, Anda harus bermigrasi untuk menggunakan alur alamat IP loopback (localhost atau 127.0.0.1).