Anwendungen authentifizieren

Auf dieser Seite wird erläutert, wie Sie von Nutzern verwaltete Dienstkonten und deren private Schlüssel verwenden, um eine Anwendung bei der Cloud IoT Core API zu authentifizieren.

Sie können Anwendungen zum Verwalten von Registries und Geräten verwenden. Beispiele finden Sie in den Codebeispielen für Cloud IoT Core.

Mit Dienstkonten authentifizieren

Ein nutzerverwaltetes Dienstkonto ist eine Art von Google-Konto, das eine Anwendung darstellt. Nutzerverwaltete Dienstkonten werden hauptsächlich für die Server-zu-API-Authentifizierung verwendet.

Cloud IoT Core verwendet zwei Arten der Authentifizierung. Zur Authentifizierung von Geräten bei Cloud IoT Core verwenden Sie private/öffentliche Schlüsselpaare und JSON-Webtokens. Bei der Authentifizierung einer Anwendung bei der Cloud IoT Core API müssen Sie jedoch die GCP-Authentifizierung in Form von nutzerverwalteten Dienstkonten verwenden.

Nutzerverwaltete Dienstkonten haben eigene private Schlüssel, die in verschiedenen Formaten vorliegen. Durch das Bereitstellen des privaten Schlüssels eines vom Nutzer verwalteten Dienstkontos für eine Anwendung können Sie Anmeldedaten erstellen und die Anwendung authentifizieren.

Die empfohlene Methode zur Authentifizierung von Anwendungen ist die Verwendung von nutzerverwalteten Dienstkonten und privaten JSON-Schlüsseln, da diese die am häufigsten unterstützten und flexiblen Methoden sind. Sie können ein nutzerverwaltetes Dienstkonto erstellen und einen privaten JSON-Schlüssel herunterladen. Führen Sie dazu die Schritte unter Erste Schritte bei der Authentifizierung aus.

In den folgenden Beispielen wird gezeigt, wie Sie mit dem privaten JSON-Schlüssel eines nutzerverwalteten Dienstkontos eine Anwendung bei der Cloud IoT Core API authentifizieren:

C#

Beachten Sie, dass das C#-Beispiel nicht explizit eine JSON-Schlüsseldatei angibt, sondern den in der Umgebungsvariablen GOOGLE_APPLICATION_CREDENTIALS angegebenen Speicherort verwendet. Die Clientbibliothek kann dann die Anmeldedaten implizit bestimmen.
public static CloudIotService CreateAuthorizedClient()
{
    GoogleCredential credential =
        GoogleCredential.GetApplicationDefaultAsync().Result;
    // Inject the Cloud IoT Core Service scope
    if (credential.IsCreateScopedRequired)
    {
        credential = credential.CreateScoped(new[]
        {
            CloudIotService.Scope.CloudPlatform // Used for IoT + PubSub + IAM
            //CloudIotService.Scope.Cloudiot // Can be used if not accessing Pub/Sub
        });
    }
    return new CloudIotService(new BaseClientService.Initializer
    {
        HttpClientInitializer = credential,
        GZipEnabled = false
    });
}

Go

Beachten Sie, dass im Go-Beispiel nicht explizit eine JSON-Schlüsseldatei angegeben wird. Vielmehr wird der in der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS angegebene Standort verwendet. Die Clientbibliothek kann dann die Anmeldedaten implizit bestimmen. Das Beispiel wird auch beim Erstellen einer Registry verwendet. Die eigentliche Authentifizierung wird unten hervorgehoben.

// createRegistry creates a IoT Core device registry associated with a PubSub topic
func createRegistry(w io.Writer, projectID string, region string, registryID string, topicName string) (*cloudiot.DeviceRegistry, error) {
	client, err := getClient()
	if err != nil {
		return nil, err
	}

	registry := cloudiot.DeviceRegistry{
		Id: registryID,
		EventNotificationConfigs: []*cloudiot.EventNotificationConfig{
			{
				PubsubTopicName: topicName,
			},
		},
	}

	parent := fmt.Sprintf("projects/%s/locations/%s", projectID, region)
	response, err := client.Projects.Locations.Registries.Create(parent, &registry).Do()
	if err != nil {
		return nil, err
	}

	fmt.Fprintln(w, "Created registry:")
	fmt.Fprintf(w, "\tID: %s\n", response.Id)
	fmt.Fprintf(w, "\tHTTP: %s\n", response.HttpConfig.HttpEnabledState)
	fmt.Fprintf(w, "\tMQTT: %s\n", response.MqttConfig.MqttEnabledState)
	fmt.Fprintf(w, "\tName: %s\n", response.Name)

	return response, nil
}

Java

Beachten Sie, dass im Java-Beispiel nicht explizit eine JSON-Schlüsseldatei angegeben wird. Vielmehr wird der in der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS angegebene Standort verwendet. Die Clientbibliothek kann dann die Anmeldedaten implizit bestimmen. Das Beispiel wird auch beim Erstellen einer Registry verwendet. Die eigentliche Authentifizierung wird unten hervorgehoben.
/** Create a registry for Cloud IoT. */
protected static void createRegistry(
    String cloudRegion, String projectId, String registryName, String pubsubTopicPath)
    throws GeneralSecurityException, IOException {
  GoogleCredentials credential =
      GoogleCredentials.getApplicationDefault().createScoped(CloudIotScopes.all());
  JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
  HttpRequestInitializer init = new HttpCredentialsAdapter(credential);
  final CloudIot service =
      new CloudIot.Builder(GoogleNetHttpTransport.newTrustedTransport(), jsonFactory, init)
          .setApplicationName(APP_NAME)
          .build();

  final String projectPath = "projects/" + projectId + "/locations/" + cloudRegion;
  final String fullPubsubPath = "projects/" + projectId + "/topics/" + pubsubTopicPath;

  DeviceRegistry registry = new DeviceRegistry();
  EventNotificationConfig notificationConfig = new EventNotificationConfig();
  notificationConfig.setPubsubTopicName(fullPubsubPath);
  List<EventNotificationConfig> notificationConfigs = new ArrayList<EventNotificationConfig>();
  notificationConfigs.add(notificationConfig);
  registry.setEventNotificationConfigs(notificationConfigs);
  registry.setId(registryName);

  DeviceRegistry reg =
      service.projects().locations().registries().create(projectPath, registry).execute();
  System.out.println("Created registry: " + reg.getName());
}

Node.js

// Client retrieved in callback
// const cloudRegion = 'us-central1';
// const projectId = 'adjective-noun-123';
// const registryId = 'my-registry';
// function errCb = lookupRegistry; // Lookup registry if already exists.
const iot = require('@google-cloud/iot');

// Lookup the pubsub topic
const topicPath = `projects/${projectId}/topics/${pubsubTopicId}`;

const iotClient = new iot.v1.DeviceManagerClient({
  // optional auth parameters.
});

async function createDeviceRegistry() {
  // Construct request
  const newParent = iotClient.locationPath(projectId, cloudRegion);
  const deviceRegistry = {
    eventNotificationConfigs: [
      {
        pubsubTopicName: topicPath,
      },
    ],
    id: registryId,
  };
  const request = {
    parent: newParent,
    deviceRegistry: deviceRegistry,
  };

  const [response] = await iotClient.createDeviceRegistry(request);

  console.log('Successfully created registry');
  console.log(response);
}

createDeviceRegistry();

PHP

Beachten Sie, dass im PHP-Beispiel nicht explizit eine JSON-Schlüsseldatei angegeben wird. Vielmehr wird der in der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS angegebene Standort verwendet. Die Clientbibliothek kann dann die Anmeldedaten implizit bestimmen. Das Beispiel wird auch beim Erstellen einer Registry verwendet. Die eigentliche Authentifizierung wird unten hervorgehoben.
use Google\Cloud\Iot\V1\DeviceManagerClient;

/**
 * List all registries in the project.
 *
 * @param string $projectId Google Cloud project ID
 * @param string $location (Optional) Google Cloud region
 */
function list_registries(
    $projectId,
    $location = 'us-central1'
) {
    print('Listing Registries' . PHP_EOL);

    // The Google Cloud Client Library automatically checks the environment
    // variable GOOGLE_APPLICATION_CREDENTIALS for the Service Account
    // credentials, and defaults scopes to [
    //    'https://www.googleapis.com/auth/cloud-platform',
    //    'https://www.googleapis.com/auth/cloudiot'
    // ].
    $deviceManager = new DeviceManagerClient();
    $locationName = $deviceManager->locationName($projectId, $location);

    $response = $deviceManager->listDeviceRegistries($locationName);

    foreach ($response->iterateAllElements() as $registry) {
        printf(' - Id: %s, Name: %s' . PHP_EOL,
            $registry->getId(),
            $registry->getName());
    }
}

Python

Beachten Sie, dass im Python-Beispiel nicht explizit eine JSON-Schlüsseldatei angegeben wird. Vielmehr wird der in der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS angegebene Standort verwendet. Die Clientbibliothek kann dann die Anmeldedaten implizit bestimmen.
# project_id = 'YOUR_PROJECT_ID'
# cloud_region = 'us-central1'
# pubsub_topic = 'your-pubsub-topic'
# registry_id = 'your-registry-id'
client = iot_v1.DeviceManagerClient()
parent = f"projects/{project_id}/locations/{cloud_region}"

if not pubsub_topic.startswith("projects/"):
    pubsub_topic = "projects/{}/topics/{}".format(project_id, pubsub_topic)

body = {
    "event_notification_configs": [{"pubsub_topic_name": pubsub_topic}],
    "id": registry_id,
}

try:
    response = client.create_device_registry(
        request={"parent": parent, "device_registry": body}
    )
    print("Created registry")
    return response
except HttpError:
    print("Error, registry not created")
    raise
except AlreadyExists:
    print("Error, registry already exists")
    raise

Ruby

Beachten Sie, dass im Ruby-Beispiel nicht explizit eine JSON-Schlüsseldatei angegeben wird. Vielmehr wird der in der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS angegebene Standort verwendet. Die Clientbibliothek kann dann die Anmeldedaten implizit bestimmen. Das Beispiel wird auch beim Erstellen einer Registry verwendet. Die eigentliche Authentifizierung wird unten hervorgehoben.
# project_id   = "Your Google Cloud project ID"
# location_id  = "The Cloud region that you created the registry in"
# registry_id  = "The Google Cloud IoT Core device registry identifier"
# pubsub_topic = "The Google Cloud PubSub topic to use for this registry"

require "google/apis/cloudiot_v1"

# Initialize the client and authenticate with the specified scope
Cloudiot   = Google::Apis::CloudiotV1
iot_client = Cloudiot::CloudIotService.new
iot_client.authorization = Google::Auth.get_application_default(
  "https://www.googleapis.com/auth/cloud-platform"
)

# The project / location where the registry is created.
parent = "projects/#{project_id}/locations/#{location_id}"

registry = Cloudiot::DeviceRegistry.new
registry.id = registry_id
registry.event_notification_configs = [Cloudiot::EventNotificationConfig.new]
registry.event_notification_configs[0].pubsub_topic_name = pubsub_topic

registry = iot_client.create_project_location_registry(
  parent, registry
)

puts "Created registry: #{registry.name}"