向请求授权

注意:本文档介绍了用于请求访问其他方数据的三足式 OAuth2 流程。如果您要开发一种第三方应用,此应用需要访问客户的 Merchant Center 帐号,请使用此身份验证流程。如果您要开发一种内部应用,此应用仅访问您自己的 Merchant Center 帐号,请查看服务帐号指南。

您的应用发送到 Google Content API for Shopping 的每个请求都必须包含授权令牌。Google 也可通过此令牌来识别您的应用。

关于授权协议

您的应用必须使用 OAuth 2.0 向请求授权。其他任何授权协议均不受支持。如果您的应用使用 Google 登录功能,则系统会代您执行授权方面的某些操作。

使用 OAuth 2.0 向请求授权

所有对 Google Content API for Shopping 的请求必须由经过身份验证的用户授权。

根据您所开发的应用的种类,OAuth 2.0 的具体授权流程可能会有所不同。下面是适用于所有应用类型的常规流程:

  1. 开发应用时,您需要使用 Google API 控制台注册该应用。然后,Google 会提供您后面需要用到的信息,例如客户端 ID 和客户端密钥。
  2. 在 Google API 控制台中激活 Google Content API for Shopping。(如果 API 控制台中未列出该 API,请跳过此步骤。)
  3. 当您的应用需要访问用户数据时,它会请求 Google 提供特定的访问权限范围
  4. Google 会向相应用户显示同意屏幕,让用户授权您的应用请求他们的某些数据。
  5. 用户批准之后,Google 会为您的应用提供一个短期访问令牌
  6. 您的应用会请求获取用户数据,并在请求中随附访问令牌。
  7. 如果 Google 确定您的请求和令牌有效,会返回您请求的数据。

部分流程还包括其他步骤,例如通过刷新令牌获取新的访问令牌。有关各种应用类型的流程的详情,请参阅 Google 的 OAuth 2.0 文档

以下是 Google Content API for Shopping 的 OAuth 2.0 范围信息:

范围 含义
https://www.googleapis.com/auth/content 读取/写入权限。

要通过 OAuth 2.0 请求访问权限,您的应用既需要范围信息,也需要 Google 在您注册应用时提供的相关信息(如客户端 ID 和客户端密钥)。

提示:Google API 客户端库可代您处理部分授权流程,并且支持多种编程语言;有关详情,请参阅包含库和示例的页面

授权示例

以下代码演示了如何使用 OAuth 2.0 为已安装的应用配置客户端以及向请求授权。我们的示例和库页面上提供了其他语言。

Java

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.Details;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;

import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;

import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;

import com.google.api.services.content.ShoppingContent;

import com.google.common.collect.Lists;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.security.GeneralSecurityException;

...

  public void setUp() throws GeneralSecurityException, IOException {
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

    // Go to the Google API Console, open your application's
    // credentials page, and copy the client ID and client secret.
    // Then paste them into the following code.
    Details details = new Details();
    details.setClientId("YOUR_CLIENT_ID");
    details.setClientSecret("YOUR_CLIENT_SECRET");

    // Or your redirect URL for web based applications.
    String redirectUrl = "urn:ietf:wg:oauth:2.0:oob";
    String scope = "https://www.googleapis.com/auth/content";

    GoogleClientSecrets clientSecrets = new GoogleClientSecrets();
    clientSecrets.setInstalled(details);

    GoogleAuthorizationCodeFlow authorizationFlow = new GoogleAuthorizationCodeFlow
        .Builder(httpTransport, jsonFactory, clientSecrets, Lists.newArrayList(scope))
        .setAccessType("offline").build();

    String authorizeUrl =
        authorizationFlow.newAuthorizationUrl().setRedirectUri(redirectUrl).build();
    System.out.println("Paste this url in your browser: \n" + authorizeUrl + '\n');

    // Wait for the authorization code.
    System.out.println("Type the code you received here: ");
    String authorizationCode = new BufferedReader(new InputStreamReader(System.in)).readLine();

    // Authorize the OAuth2 token.
    GoogleAuthorizationCodeTokenRequest tokenRequest =
        authorizationFlow.newTokenRequest(authorizationCode);
    tokenRequest.setRedirectUri(redirectUrl);
    GoogleTokenResponse tokenResponse = tokenRequest.execute();

    // Create the OAuth2 credential.
    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(new NetHttpTransport())
        .setJsonFactory(new JacksonFactory())
        .setClientSecrets(clientSecrets)
        .build();

    // Set authorized credentials.
    credential.setFromTokenResponse(tokenResponse);

    ShoppingContent service = new ShoppingContent
        .Builder(httpTransport, jsonFactory, credential)
        .setApplicationName("YOUR_APPLICATION_NAME")
        .build();
    ...
  }
...

PHP

此示例使用 Web 应用流。重定向 URI 应该是此 PHP 页面的 URI。

<?php
require_once 'Google/Client.php';

session_start();

$client = new Google_Client();
$client->setApplicationName('Sample Content API application');
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URI');
$client->setScopes('https://www.googleapis.com/auth/content');

if (isset($_SESSION['oauth_access_token'])) {
  $client->setAccessToken($_SESSION['oauth_access_token']);
} elseif (isset($_GET['code'])) {
  $token = $client->authenticate($_GET['code']);
  $_SESSION['oauth_access_token'] = $token;
} else {
  header('Location: ' . $client->createAuthUrl());
  exit;
}

您已经过身份验证,可以创建一个服务对象来发出 API 请求了。

require_once 'Google/Service/ShoppingContent.php';

$service = new Google_Service_ShoppingContent($client);