使用 Business Profile API 導入 OAuth

應用程式傳送至 Business Profile API 的每項要求都必須 然後包含授權權杖授權權杖可用來識別 要求 Google 存取 Business Profile API。 您的應用程式必須使用 OAuth 2.0 通訊協定來授權要求

本指南將說明可導入哪些不同的方法 OAuth 2.0。Google Identity Platform 提供了 Google 登入和 OAuth 功能, 指南。

為進一步瞭解如何運用網路伺服器的使用者 Oauth 2.0 請參閱這份指南

導入 OAuth 2.0 的優點如下:

  • 保護業主資料的存取權。
  • 建立商家擁有者的身分 Google 帳戶。
  • 確定合作夥伴平台或應用程式可以存取及修改 未經業主明確同意儲存位置資料。擁有者可以 稍後撤銷此存取權。
  • 建立合作夥伴平台的身分。
  • 讓合作夥伴平台代表 就能取得這項資訊包括回覆評論、建立貼文,以及 對選單項目所做的更新

使用 OAuth 2.0 存取 API

開始之前,您必須先設定 Google Cloud 專案並啟用 Business Profile API。詳情請參閱 基本設定

請按照下列步驟建立憑證和同意畫面:

  1. 透過「憑證」頁面 在 API 控制台中,按一下「建立憑證」,然後選取「OAuth 用戶端 ID」來自 建立下拉式清單
  2. 選擇你的應用程式類型並填寫相關資訊,然後按一下 建立
  3. 按一下 [儲存]
  4. 更新 OAuth 同意畫面設定。 您可以在這裡更新應用程式名稱和標誌 附上您的服務條款和隱私權政策連結。

下圖顯示 OAuth 中的應用程式名稱和標誌欄位 同意畫面:

下圖顯示 OAuth 同意聲明中的其他欄位 螢幕:

下圖為範例,顯示了使用者在提供圖片前看到的內容 同意聲明:

納入 OAuth 2.0 的方法

您可以使用下列方法實作 OAuth 2.0:

下列內容提供這些方法的相關資訊 OAuth 2.0。

授權範圍

需要下列其中一種 OAuth 範圍:

  • https://www.googleapis.com/auth/business.manage
  • https://www.googleapis.com/auth/plus.business.manage

Plus.business.manage 範圍已淘汰,可進行維護 現有實作的回溯相容性

用戶端程式庫

本頁所列語言使用 Google API 用戶端程式庫 實作 OAuth 2.0 授權。如要執行程式碼範例,您必須先 按照您的語言安裝用戶端程式庫。

用戶端程式庫支援下列語言:

Google 登入

Google 登入可讓您以最快速度 將 OAuth 整合至平台。支援 Android、iOS、網頁 等等。

Google 登入是一種安全的驗證系統,可讓使用者登入帳戶 登入自己的 Google 帳戶 (這和他們用來登入的帳戶) 和其他 Google 服務一樣。使用者登入後,即可同意 應用程式,以便呼叫 Business Profile API 用於取得重新整理和存取權杖的授權碼。

離線存取

即使您在 使用者離線。建議平台納入上述做法 因為您還能隨時編輯、查看及管理商家資訊, 使用者已登入並表示同意。

Google 會假設使用者已登入其 Google 帳戶, 已同意您的應用程式呼叫 Business Profile API;且 交換用來取得更新權杖的授權碼,且 存取權杖使用者可安全地儲存更新權杖,並使用 之後隨時取得新的存取權杖如需更多資訊,請參閱 伺服器端適用的 Google 登入功能 應用程式

下列程式碼片段說明如何在 應用程式。如要執行這段程式碼,請參閱執行範例

<!-- The top of file index.html -->
<html itemscope itemtype="http://schema.org/Article">
<head>
  <!-- BEGIN Pre-requisites -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">
  </script>
  <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer>
  </script>
  <!-- END Pre-requisites -->
<!-- Continuing the <head> section -->
  <script>
    function start() {
      gapi.load('auth2', function() {
        auth2 = gapi.auth2.init({
          client_id: 'YOUR_CLIENT_ID.apps.googleusercontent.com',
          // Scopes to request in addition to 'profile' and 'email'
          scope: 'https://www.googleapis.com/auth/business.manage',
          immediate: true
        });
      });
    }
  </script>
</head>
<body>
  <!-- Add where you want your sign-in button to render -->
<!-- Use an image that follows the branding guidelines in a real app, more info here:
 https://developers.google.com/identity/branding-guidelines
-->
<h1>Business Profile Offline Access Demo</h1>

<p> This demo demonstrates the use of Google Identity Services and OAuth to gain authorization to call the Business Profile APIs on behalf of the user, even when the user is offline.

When a refresh token is acquired, store this token securely on your database. You will then be able to use this token to refresh the OAuth credentials and make offline API calls on behalf of the user. 

The user may revoke access at any time from the <a href='https://myaccount.google.com/permissions'>Account Settings</a> page.
</p>

<button id="signinButton">Sign in with Google</button><br>
<input id="authorizationCode" type="text" placeholder="Authorization Code" style="width: 60%"><button id="accessTokenButton" disabled>Retrieve Access/Refresh Token</button><br>
 <input id="refreshToken" type="text" placeholder="Refresh Token, never expires unless revoked" style="width: 60%"><button id="refreshSubmit">Refresh Access Token</button><br>
 <input id="accessToken" type="text" placeholder="Access Token" style="width: 60%"><button id="gmbAccounts">Get Business Profile Accounts</button><br>
 <p>API Responses:</p>
<script>
    //Will be populated after sign in.
    var authCode;
  $('#signinButton').click(function() {
    // signInCallback
    auth2.grantOfflineAccess().then(signInCallback);
  });

  $('#accessTokenButton').click(function() {
    // signInCallback defined in step 6.
    retrieveAccessTokenAndRefreshToken(authCode);
  });

  $('#refreshSubmit').click(function() {
    // signInCallback defined in step 6.
    retrieveAccessTokenFromRefreshToken($('#refreshToken').val());
  });

   $('#gmbAccounts').click(function() {
    // signInCallback defined in step 6.
    retrieveGoogleMyBusinessAccounts($('#accessToken').val());
  });




function signInCallback(authResult) {
    //the 'code' field from the response, used to retrieve access token and bearer token
  if (authResult['code']) {
    // Hide the sign-in button now that the user is authorized, for example:
    $('#signinButton').attr('style', 'display: none');
    authCode = authResult['code'];

    $("#accessTokenButton").attr( "disabled", false );

    //Pretty print response
    var e = document.createElement("pre")
    e.innerHTML = JSON.stringify(authResult, undefined, 2);
    document.body.appendChild(e);

    //autofill authorization code input
    $('#authorizationCode').val(authResult['code'])

    
  } else {
    // There was an error.
  }
}

//WARNING: THIS FUNCTION IS DISPLAYED FOR DEMONSTRATION PURPOSES ONLY. YOUR CLIENT_SECRET SHOULD NEVER BE EXPOSED ON THE CLIENT SIDE!!!!
function retrieveAccessTokenAndRefreshToken(code) {
      $.post('https://www.googleapis.com/oauth2/v4/token',
      { //the headers passed in the request
        'code' : code,
        'client_id' : 'YOUR_CLIENT_ID.apps.googleusercontent.com',
        'client_secret' : 'YOUR_CLIENT_SECRET',
        'redirect_uri' : 'http://localhost:8000',
        'grant_type' : 'authorization_code'
      },
      function(returnedData) {
        console.log(returnedData);
        //pretty print JSON response
        var e = document.createElement("pre")
        e.innerHTML = JSON.stringify(returnedData, undefined, 2);
        document.body.appendChild(e);
        $('#refreshToken').val(returnedData['refresh_token'])
      });
}

//WARNING: THIS FUNCTION IS DISPLAYED FOR DEMONSTRATION PURPOSES ONLY. YOUR CLIENT_SECRET SHOULD NEVER BE EXPOSED ON THE CLIENT SIDE!!!!
function retrieveAccessTokenFromRefreshToken(refreshToken) {
    $.post('https://www.googleapis.com/oauth2/v4/token', 
        { // the headers passed in the request
        'refresh_token' : refreshToken,
        'client_id' : 'YOUR_CLIENT_ID.apps.googleusercontent.com',
        'client_secret' : 'YOUR_CLIENT_SECRET',
        'redirect_uri' : 'http://localhost:8000',
        'grant_type' : 'refresh_token'
      },
      function(returnedData) {
        var e = document.createElement("pre")
        e.innerHTML = JSON.stringify(returnedData, undefined, 2);
        document.body.appendChild(e);
        $('#accessToken').val(returnedData['access_token'])
      });
}

function retrieveGoogleMyBusinessAccounts(accessToken) {
    $.ajax({
        type: 'GET',
        url: 'https://mybusinessaccountmanagement.googleapis.com/v1/accounts',
        headers: {
            'Authorization' : 'Bearer ' + accessToken
        },
        success: function(returnedData) {
            var e = document.createElement("pre")
            e.innerHTML = JSON.stringify(returnedData, undefined, 2);
            document.body.appendChild(e);
        }
    });
}
</script>
</body>
</html>

僅限線上存取

為方便導入,系統可能會執行 Business Profile API 的呼叫 無需快取使用者更新權杖然而,使用者必須先登入 可讓平台以使用者的身分 執行 API 呼叫

下列程式碼片段示範如何實作 Google 登入 以及如何發出使用者專屬 API 呼叫在使用者透過以下帳戶登入後 使用者的 Google 帳戶 並授予應用程式存取權 。這個存取權杖可用來識別使用者,且必須做為 Business Profile API 請求中的標頭。

如要執行這段程式碼,請參閱執行範例

<!-- The top of file index.html -->
<html lang="en">
  <head>
    <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/business.manage">
    <meta name="google-signin-client_id" content="YOUR_CLIENT_ID.apps.googleusercontent.com">
    <script src="https://apis.google.com/js/platform.js" async defer></script>
  </head>
  <body>
    <div class="g-signin2" data-onsuccess="onSignIn" data-theme="dark"></div>
    <script>
      var gmb_api_version = 'https://mybusinessaccountmanagement.googleapis.com/v1';
      function onSignIn(googleUser) {
        // Useful data for your client-side scripts:
        var profile = googleUser.getBasicProfile();
        console.log('Full Name: ' + profile.getName());
        console.log("Email: " + profile.getEmail());
        var access_token = googleUser.getAuthResponse().access_token;

        //Using the sign in data to make a Business Profile APIs call
        var req = gmb_api_version + '/accounts';
        var xhr = new XMLHttpRequest();
        xhr.open('GET', req);
        xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);

        //Displaying the API response
        xhr.onload = function () {
          document.body.appendChild(document.createTextNode(xhr.responseText));
        }
        xhr.send();
      }
    </script>
  </body>
</html>

執行範例

請執行下列步驟,執行提供的程式碼範例:

  1. 將程式碼片段儲存至標題為 index.html 的檔案。請確認您已在檔案中設定用戶端 ID。
  2. 使用工作目錄中的下列指令啟動網路伺服器:

    Python 2.X

    python -m SimpleHTTPServer 8000

    Python 3.X

    python -m http.server 8000
  3. 從「Credentials」(憑證) 頁面 頁面,選取所使用的用戶端 ID。

  4. 在「授權的 JavaScript 來源」欄位下方輸入網站網址。目的地: 執行本指南中的程式碼範例,您也必須新增 http://localhost:8000

  5. 在瀏覽器中載入下列網址:

    http://localhost:8000/index.html