// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package google.cloud.recaptchaenterprise.v1; import "google/api/annotations.proto"; import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "Google.Cloud.RecaptchaEnterprise.V1"; option go_package = "google.golang.org/genproto/googleapis/cloud/recaptchaenterprise/v1;recaptchaenterprise"; option java_multiple_files = true; option java_outer_classname = "RecaptchaEnterpriseProto"; option java_package = "com.google.recaptchaenterprise.v1"; option objc_class_prefix = "GCRE"; option php_namespace = "Google\\Cloud\\RecaptchaEnterprise\\V1"; option ruby_package = "Google::Cloud::RecaptchaEnterprise::V1"; // Service to determine the likelihood an event is legitimate. service RecaptchaEnterpriseService { option (google.api.default_host) = "recaptchaenterprise.googleapis.com"; option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; // Creates an Assessment of the likelihood an event is legitimate. rpc CreateAssessment(CreateAssessmentRequest) returns (Assessment) { option (google.api.http) = { post: "/v1/{parent=projects/*}/assessments" body: "assessment" }; option (google.api.method_signature) = "parent,assessment"; } // Annotates a previously created Assessment to provide additional information // on whether the event turned out to be authentic or fradulent. rpc AnnotateAssessment(AnnotateAssessmentRequest) returns (AnnotateAssessmentResponse) { option (google.api.http) = { post: "/v1/{name=projects/*/assessments/*}:annotate" body: "*" }; option (google.api.method_signature) = "name,annotation"; } // Creates a new reCAPTCHA Enterprise key. rpc CreateKey(CreateKeyRequest) returns (Key) { option (google.api.http) = { post: "/v1/{parent=projects/*}/keys" body: "key" }; } // Returns the list of all keys that belong to a project. rpc ListKeys(ListKeysRequest) returns (ListKeysResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*}/keys" }; } // Returns the specified key. rpc GetKey(GetKeyRequest) returns (Key) { option (google.api.http) = { get: "/v1/{name=projects/*/keys/*}" }; } // Updates the specified key. rpc UpdateKey(UpdateKeyRequest) returns (Key) { option (google.api.http) = { patch: "/v1/{key.name=projects/*/keys/*}" body: "key" }; } // Deletes the specified key. rpc DeleteKey(DeleteKeyRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1/{name=projects/*/keys/*}" }; } } // The create assessment request message. message CreateAssessmentRequest { // Required. The name of the project in which the assessment will be created, // in the format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Required. The assessment details. Assessment assessment = 2 [(google.api.field_behavior) = REQUIRED]; } // The request message to annotate an Assessment. message AnnotateAssessmentRequest { // Enum that reprensents the types of annotations. enum Annotation { // Default unspecified type. ANNOTATION_UNSPECIFIED = 0; // Provides information that the event turned out to be legitimate. LEGITIMATE = 1; // Provides information that the event turned out to be fraudulent. FRAUDULENT = 2; // Provides information that the event was related to a login event in which // the user typed the correct password. PASSWORD_CORRECT = 3; // Provides information that the event was related to a login event in which // the user typed the incorrect password. PASSWORD_INCORRECT = 4; } // Required. The resource name of the Assessment, in the format // "projects/{project}/assessments/{assessment}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Assessment" } ]; // Required. The annotation that will be assigned to the Event. Annotation annotation = 2 [(google.api.field_behavior) = REQUIRED]; } // Empty response for AnnotateAssessment. message AnnotateAssessmentResponse { } // A recaptcha assessment resource. message Assessment { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/Assessment" pattern: "projects/{project}/assessments/{assessment}" }; // Output only. The resource name for the Assessment in the format // "projects/{project}/assessments/{assessment}". string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; // The event being assessed. Event event = 2; // Output only. The risk analysis result for the event being assessed. RiskAnalysis risk_analysis = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Properties of the provided event token. TokenProperties token_properties = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; } message Event { // Optional. The user response token provided by the reCAPTCHA client-side integration // on your site. string token = 1 [(google.api.field_behavior) = OPTIONAL]; // Optional. The site key that was used to invoke reCAPTCHA on your site and generate // the token. string site_key = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. The user agent present in the request from the user's device related to // this event. string user_agent = 3 [(google.api.field_behavior) = OPTIONAL]; // Optional. The IP address in the request from the user's device related to this event. string user_ip_address = 4 [(google.api.field_behavior) = OPTIONAL]; // Optional. The expected action for this type of event. This should be the same action // provided at token generation time on client-side platforms already // integrated with recaptcha enterprise. string expected_action = 5 [(google.api.field_behavior) = OPTIONAL]; } // Risk analysis result for an event. message RiskAnalysis { // LINT.IfChange(classification_reason) // Reasons contributing to the risk analysis verdict. enum ClassificationReason { // Default unspecified type. CLASSIFICATION_REASON_UNSPECIFIED = 0; // Interactions matched the behavior of an automated agent. AUTOMATION = 1; // The event originated from an illegitimate environment. UNEXPECTED_ENVIRONMENT = 2; // Traffic volume from the event source is higher than normal. TOO_MUCH_TRAFFIC = 3; // Interactions with the site were significantly different than expected // patterns. UNEXPECTED_USAGE_PATTERNS = 4; // Too little traffic has been received from this site thus far to generate // quality risk analysis. LOW_CONFIDENCE_SCORE = 5; } // Legitimate event score from 0.0 to 1.0. // (1.0 means very likely legitimate traffic while 0.0 means very likely // non-legitimate traffic). float score = 1; // Reasons contributing to the risk analysis verdict. repeated ClassificationReason reasons = 2; } message TokenProperties { // LINT.IfChange // Enum that represents the types of invalid token reasons. enum InvalidReason { // Default unspecified type. INVALID_REASON_UNSPECIFIED = 0; // If the failure reason was not accounted for. UNKNOWN_INVALID_REASON = 1; // The provided user verification token was malformed. MALFORMED = 2; // The user verification token had expired. EXPIRED = 3; // The user verification had already been seen. DUPE = 4; // The user verification token was not present. MISSING = 5; } // Whether the provided user response token is valid. When valid = false, the // reason could be specified in invalid_reason or it could also be due to // a user failing to solve a challenge or a sitekey mismatch (i.e the sitekey // used to generate the token was different than the one specified in the // assessment). bool valid = 1; // Reason associated with the response when valid = false. InvalidReason invalid_reason = 2; // The timestamp corresponding to the generation of the token. google.protobuf.Timestamp create_time = 3; // The hostname of the page on which the token was generated. string hostname = 4; // Action name provided at token generation. string action = 5; } // The create key request message. message CreateKeyRequest { // Required. The name of the project in which the key will be created, in the // format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Required. Information to create a reCAPTCHA Enterprise key. Key key = 2 [(google.api.field_behavior) = REQUIRED]; } // The list keys request message. message ListKeysRequest { // Required. The name of the project that contains the keys that will be // listed, in the format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Optional. The maximum number of keys to return. Default is 10. Max limit is // 1000. int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. The next_page_token value returned from a previous. // ListKeysRequest, if any. string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; } // Response to request to list keys in a project. message ListKeysResponse { // Key details. repeated Key keys = 1; // Token to retrieve the next page of results. It is set to empty if no keys // remain in results. string next_page_token = 2; } // The get key request message. message GetKeyRequest { // Required. The name of the requested key, in the format // "projects/{project}/keys/{key}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Key" } ]; } // The update key request message. message UpdateKeyRequest { // Required. The key to update. Key key = 1 [(google.api.field_behavior) = REQUIRED]; // Optional. The mask to control which field of the key get updated. If the mask is not // present, all fields will be updated. google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = OPTIONAL]; } // The delete key request message. message DeleteKeyRequest { // Required. The name of the key to be deleted, in the format // "projects/{project}/keys/{key}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Key" } ]; } // A key used to identify and configure applications (web and/or mobile) that // use reCAPTCHA Enterprise. message Key { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/Key" pattern: "projects/{project}/keys/{key}" }; // The resource name for the Key in the format // "projects/{project}/keys/{key}". string name = 1; // Human-readable display name of this key. Modifiable by user. string display_name = 2; // Platform specific settings for this key. The key can only be used on one // platform, the one it has settings for. oneof platform_settings { // Settings for keys that can be used by websites. WebKeySettings web_settings = 3; // Settings for keys that can be used by Android apps. AndroidKeySettings android_settings = 4; // Settings for keys that can be used by iOS apps. IOSKeySettings ios_settings = 5; } // Optional. See // Creating and managing labels. map labels = 6 [(google.api.field_behavior) = OPTIONAL]; // The timestamp corresponding to the creation of this Key. google.protobuf.Timestamp create_time = 7; } // Settings specific to keys that can be used by websites. message WebKeySettings { // Enum that represents the integration types for web keys. enum IntegrationType { // Default type that indicates this enum hasn't been specified. This is not // a valid IntegrationType, one of the other types must be specified // instead. INTEGRATION_TYPE_UNSPECIFIED = 0; // Only used to produce scores. It doesn't display the "I'm not a robot" // checkbox and never shows captcha challenges. SCORE = 1; // Displays the "I'm not a robot" checkbox and may show captcha challenges // after it is checked. CHECKBOX = 2; // Doesn't display the "I'm not a robot" checkbox, but may show captcha // challenges after risk analysis. INVISIBLE = 3; } // Enum that represents the possible challenge frequency and difficulty // configurations for a web key. enum ChallengeSecurityPreference { // Default type that indicates this enum hasn't been specified. CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED = 0; // Key tends to show fewer and easier challenges. USABILITY = 1; // Key tends to show balanced (in amount and difficulty) challenges. BALANCE = 2; // Key tends to show more and harder challenges. SECURITY = 3; } // If set to true, it means allowed_domains will not be enforced. bool allow_all_domains = 3; // Domains or subdomains of websites allowed to use the key. All subdomains // of an allowed domain are automatically allowed. A valid domain requires a // host and must not include any path, port, query or fragment. // Examples: 'example.com' or 'subdomain.example.com' repeated string allowed_domains = 1; // Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. bool allow_amp_traffic = 2 [(google.api.field_behavior) = REQUIRED]; // Required. Describes how this key is integrated with the website. IntegrationType integration_type = 4 [(google.api.field_behavior) = REQUIRED]; // Settings for the frequency and difficulty at which this key triggers // captcha challenges. This should only be specified for IntegrationTypes // CHECKBOX and INVISIBLE. ChallengeSecurityPreference challenge_security_preference = 5; } // Settings specific to keys that can be used by Android apps. message AndroidKeySettings { // Android package names of apps allowed to use the key. // Example: 'com.companyname.appname' repeated string allowed_package_names = 1; } // Settings specific to keys that can be used by iOS apps. message IOSKeySettings { // iOS bundle ids of apps allowed to use the key. // Example: 'com.companyname.productname.appname' repeated string allowed_bundle_ids = 1; }