Enviar inscrições

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Na entrega por push, o Pub/Sub inicia solicitações ao seu aplicativo de assinante para entregar mensagens.

Antes de começar

Antes de ler este documento, verifique se você está familiarizado com o seguinte:

Propriedades de uma assinatura de push

Ao configurar uma assinatura push, você pode especificar as seguintes propriedades.

  • URL do endpoint (obrigatório) Um endereço HTTPS acessível publicamente. O servidor do endpoint de push precisa ter um certificado SSL válido assinado por uma autoridade de certificação. O serviço do Pub/Sub entrega mensagens para enviar endpoints da mesma região do Google Cloud em que o serviço do Pub/Sub armazena as mensagens. O serviço Pub/Sub entrega mensagens da mesma região do Google Cloud com base no melhor esforço.

    O Pub/Sub não exige mais comprovação de propriedade nos domínios de URL de assinatura push. Se o domínio receber solicitações POST inesperadas do Pub/Sub, denuncie o suspeita de abuso.

  • Ativar a autenticação. Quando ativadas, as mensagens entregues pelo Pub/Sub ao endpoint de push incluem um cabeçalho de autorização para permitir que o endpoint autentique a solicitação. Os mecanismos automáticos de autenticação e autorização estão disponíveis para os endpoints do App Engine Standard e do Cloud Functions hospedados no mesmo projeto que a assinatura.

    A configuração de autenticação de uma assinatura push autenticada consiste na conta de serviço e nos parâmetros de público especificados em uma chamada create, patch ou ModificarPushConfig:

    • Conta de serviço (obrigatória) Conta de serviço associada à assinatura de push. Esta conta é usada como a declaração email do JSON Web Token (JWT) gerado. Veja a seguir uma lista de requisitos para a conta de serviço:

    • Público. Uma única string que não diferencia maiúsculas de minúsculas e é usada pelo webhook para validar o público-alvo desse token específico.

Assinatura de push e VPC Service Controls

Não é possível criar novas assinaturas de push para projetos protegidos pelo VPC Service Controls, a menos que os endpoints de push sejam definidos para serviços do Cloud Run com URLs padrão de run.app. Os domínios personalizados não funcionam.

As assinaturas de push atuais não podem ser atualizadas para projetos protegidos pelo VPC Service Controls. As assinaturas de push atuais continuam funcionando, mas não são protegidas pelo VPC Service Controls.

Receber mensagens

Quando o Pub/Sub entrega uma mensagem para um endpoint de push, o Pub/Sub a envia no corpo de uma solicitação POST. O corpo da solicitação é um objeto JSON e os dados da mensagem estão no campo message.data. Os dados da mensagem são codificados em base64.

O exemplo a seguir é o corpo de uma solicitação POST para um endpoint de push:

{
    "message": {
        "attributes": {
            "key": "value"
        },
        "data": "SGVsbG8gQ2xvdWQgUHViL1N1YiEgSGVyZSBpcyBteSBtZXNzYWdlIQ==",
        "messageId": "2070443601311540",
        "message_id": "2070443601311540",
        "publishTime": "2021-02-26T19:13:55.749Z",
        "publish_time": "2021-02-26T19:13:55.749Z"
    },
   "subscription": "projects/myproject/subscriptions/mysubscription"
}

Para receber mensagens de assinaturas de push, use um webhook e processe as solicitações POST que o Pub/Sub envia para o endpoint de push. Para mais informações sobre como processar essas solicitações POST no App Engine, consulte Como gravar e responder a mensagens do Pub/Sub.

Depois de receber uma solicitação por push, retorne um código de status HTTP. Para confirmar a mensagem, retorne um dos seguintes códigos de status:

  • 102
  • 200
  • 201
  • 202
  • 204

Para enviar uma confirmação negativa para a mensagem, retorne qualquer outro código de status. Se você enviar uma confirmação negativa ou o prazo de confirmação expirar, o Pub/Sub reenviará a mensagem. Não é possível modificar o prazo de confirmação das mensagens individuais recebidas de assinaturas de push.

Autenticação para assinatura push

Se uma assinatura push usar autenticação, o serviço do Pub/Sub assina um JWT e envia o JWT no cabeçalho de autorização da solicitação push. O JWT inclui declarações e uma assinatura.

Os assinantes podem validar o JWT e verificar o seguinte:

  • As declarações são precisas.
  • O serviço do Pub/Sub assinou as declarações.

Se os assinantes usam um firewall, eles não podem receber solicitações push. Para receber solicitações push, desative o firewall e verifique o JWT.

Formato JWT

O JWT é um JWT do OpenIDConnect que consiste em um cabeçalho, um conjunto de declarações e uma assinatura. O serviço Pub/Sub codifica o JWT como uma string base64 com delimitadores de período.

Por exemplo, o cabeçalho de autorização a seguir inclui um JWT codificado:

"Authorization" : "Bearer
eyJhbGciOiJSUzI1NiIsImtpZCI6IjdkNjgwZDhjNzBkNDRlOTQ3MTMzY2JkNDk5ZWJjMWE2MWMzZDVh
YmMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tIiwiYXpwIjoiMTEzNzc0M
jY0NDYzMDM4MzIxOTY0IiwiZW1haWwiOiJnYWUtZ2NwQGFwcHNwb3QuZ3NlcnZpY2VhY2NvdW50LmNvb
SIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE1NTAxODU5MzUsImlhdCI6MTU1MDE4MjMzNSwia
XNzIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEzNzc0MjY0NDYzMDM4MzIxO
TY0In0.QVjyqpmadTyDZmlX2u3jWd1kJ68YkdwsRZDo-QxSPbxjug4ucLBwAs2QePrcgZ6hhkvdc4UHY
4YF3fz9g7XHULNVIzX5xh02qXEH8dK6PgGndIWcZQzjSYfgO-q-R2oo2hNM5HBBsQN4ARtGK_acG-NGG
WM3CQfahbEjZPAJe_B8M7HfIu_G5jOLZCw2EUcGo8BvEwGcLWB2WqEgRM0-xt5-UPzoa3-FpSPG7DHk7
z9zRUeq6eB__ldb-2o4RciJmjVwHgnYqn3VvlX9oVKEgXpNFhKuYA-mWh5o7BCwhujSMmFoBOh6mbIXF
cyf5UiVqKjpqEbqPGo_AvKvIQ9VTQ" 

O cabeçalho e o conjunto de declarações são strings JSON. Depois de decodificadas, elas assumem o seguinte formato:

{"alg":"RS256","kid":"7d680d8c70d44e947133cbd499ebc1a61c3d5abc","typ":"JWT"}

{
   "aud":"https://example.com",
   "azp":"113774264463038321964",
   "email":"gae-gcp@appspot.gserviceaccount.com",
   "sub":"113774264463038321964",
   "email_verified":true,
   "exp":1550185935,
   "iat":1550182335,
   "iss":"https://accounts.google.com"
  }

Os tokens anexados às solicitações enviadas para os endpoints de push podem ter até uma hora.

Configurar o Pub/Sub para autenticação push

No exemplo a seguir, mostramos como definir a conta de serviço de autenticação push para uma conta de serviço de sua escolha e como conceder à conta de serviço gerenciada pelo Google service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com o papel iam.serviceAccountTokenCreator.

Console

  1. Acesse a página Assinaturas do Pub/Sub.

    Acessar a página "Assinaturas"

  2. Clique em Criar assinatura.

  3. No campo ID da assinatura, digite um nome.

  4. Selecione um tema.

  5. Selecione Push em Tipo de entrega.

  6. Insira o URL do endpoint.

  7. Marque Ativar autenticação.

  8. Selecione uma conta de serviço

  9. Opcional: clique em Conceder para conceder à conta de serviço gerenciada pelo Google service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com o papel iam.serviceAccountTokenCreator, se ela ainda não tiver o papel.

  10. Opcional: insira um público-alvo.

  11. Clique em Criar.

gcloud

# Configure the push subscription
gcloud pubsub subscriptions (create|update|modify-push-config) ${SUBSCRIPTION} \
 --topic=${TOPIC} \
 --push-endpoint=${PUSH_ENDPOINT_URI} \
 --push-auth-service-account=${SERVICE_ACCOUNT_EMAIL} \
 --push-auth-token-audience=${OPTIONAL_AUDIENCE_OVERRIDE}

# Only needed for projects created on or before April 8, 2021:
# Grant the Google-managed service account the `iam.serviceAccountTokenCreator` role
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
 --role='roles/iam.serviceAccountTokenCreator'

Se você usa uma assinatura push autenticada com um aplicativo do App Engine protegido pelo Identity-Aware Proxy, é necessário fornecer o ID do cliente do IAP como seu público-alvo de token de autenticação push. Para ativar o IAP no aplicativo do App Engine, consulte Como ativar o IAP. Para encontrar o ID do cliente do IAP, procure IAP-App-Engine-app, na página Credenciais.

Declarações

O JWT pode ser usado para validar que as declarações, incluindo email e aud, sejam assinadas pelo Google. Para mais informações sobre como as APIs do OAuth 2.0 do Google podem ser usadas para autenticação e autorização, consulte OpenID Connect.

Dois mecanismos tornam essas declarações significativas. Primeiro, o Pub/Sub exige que o usuário ou a conta de serviço que faz a chamada CreateSignature, UpdateSubscription ou ModifiquePushConfig tenha um papel com a permissão iam.serviceAccounts.actAs na conta de serviço de autenticação push. Um exemplo desse papel é o do roles/iam.serviceAccountUser.

Em segundo lugar, o acesso aos certificados utilizados para assinar os tokens é rigidamente controlado. Para criar o token, o Pub/Sub precisa chamar um serviço interno do Google usando uma identidade de conta de serviço de assinatura separada, que é a conta de serviço gerenciada pelo Google service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com. Essa conta de serviço de assinatura precisa ter a permissão iam.serviceAccounts.getOpenIdToken ou um papel de Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator) na conta de serviço de autenticação push (ou em qualquer recurso ancestral, como o projeto) da conta de serviço de autenticação push.

Validar tokens

A validação de tokens enviados pelo Pub/Sub para o endpoint de push envolve:

  • Verificar a integridade do token usando a validação da assinatura.
  • Garantir que as reivindicações de e-mail e de público no token correspondam aos valores definidos na configuração da assinatura de push.

Veja no exemplo a seguir como autenticar uma solicitação push para um aplicativo do App Engine não protegido com o Identity-Aware Proxy. Se o aplicativo do App Engine estiver protegido com IAP, o cabeçalho de solicitação HTTP que contém o JWT de IAP será x-goog-iap-jwt-assertion e precisará ser validado conforme necessário.

protocolo

Solicitação:

GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}

Saída:

200 OK
{
    "alg": "RS256",
    "aud": "example.com",
    "azp": "104176025330667568672",
    "email": "{SERVICE_ACCOUNT_NAME}@{YOUR_PROJECT_NAME}.iam.gserviceaccount.com",
    "email_verified": "true",
    "exp": "1555463097",
    "iat": "1555459497",
    "iss": "https://accounts.google.com",
    "kid": "3782d3f0bc89008d9d2c01730f765cfb19d3b70e",
    "sub": "104176025330667568672",
    "typ": "JWT"
}

C#

Antes de tentar esse exemplo, siga as instruções de configuração do C# em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C#.

        /// <summary>
        /// Extended JWT payload to match the pubsub payload format.
        /// </summary>
        public class PubSubPayload : JsonWebSignature.Payload
        {
            [JsonProperty("email")]
            public string Email { get; set; }
            [JsonProperty("email_verified")]
            public string EmailVerified { get; set; }
        }
        /// <summary>
        /// Handle authenticated push request coming from pubsub.
        /// </summary>
        [HttpPost]
        [Route("/AuthPush")]
        public async Task<IActionResult> AuthPushAsync([FromBody] PushBody body, [FromQuery] string token)
        {
            // Get the Cloud Pub/Sub-generated "Authorization" header.
            string authorizaionHeader = HttpContext.Request.Headers["Authorization"];
            string verificationToken = token ?? body.message.attributes["token"];
            // JWT token comes in `Bearer <JWT>` format substring 7 specifies the postion of first JWT char.
            string authToken = authorizaionHeader.StartsWith("Bearer ") ? authorizaionHeader.Substring(7) : null;
            if (verificationToken != _options.VerificationToken || authToken is null)
            {
                return new BadRequestResult();
            }
            // Verify and decode the JWT.
            // Note: For high volume push requests, it would save some network
            // overhead if you verify the tokens offline by decoding them using
            // Google's Public Cert; caching already seen tokens works best when
            // a large volume of messages have prompted a single push server to
            // handle them, in which case they would all share the same token for
            // a limited time window.
            var payload = await JsonWebSignature.VerifySignedTokenAsync<PubSubPayload>(authToken);

            // IMPORTANT: you should validate payload details not covered
            // by signature and audience verification above, including:
            //   - Ensure that `payload.Email` is equal to the expected service
            //     account set up in the push subscription settings.
            //   - Ensure that `payload.Email_verified` is set to true.

            var messageBytes = Convert.FromBase64String(body.message.data);
            string message = System.Text.Encoding.UTF8.GetString(messageBytes);
            s_authenticatedMessages.Add(message);
            return new OkResult();
        }

Go

// receiveMessagesHandler validates authentication token and caches the Pub/Sub
// message received.
func (a *app) receiveMessagesHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != "POST" {
		http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
		return
	}

	// Verify that the request originates from the application.
	// a.pubsubVerificationToken = os.Getenv("PUBSUB_VERIFICATION_TOKEN")
	if token, ok := r.URL.Query()["token"]; !ok || len(token) != 1 || token[0] != a.pubsubVerificationToken {
		http.Error(w, "Bad token", http.StatusBadRequest)
		return
	}

	// Get the Cloud Pub/Sub-generated JWT in the "Authorization" header.
	authHeader := r.Header.Get("Authorization")
	if authHeader == "" || len(strings.Split(authHeader, " ")) != 2 {
		http.Error(w, "Missing Authorization header", http.StatusBadRequest)
		return
	}
	token := strings.Split(authHeader, " ")[1]
	// Verify and decode the JWT.
	// If you don't need to control the HTTP client used you can use the
	// convenience method idtoken.Validate instead of creating a Validator.
	v, err := idtoken.NewValidator(r.Context(), option.WithHTTPClient(a.defaultHTTPClient))
	if err != nil {
		http.Error(w, "Unable to create Validator", http.StatusBadRequest)
		return
	}
	// Please change http://example.com to match with the value you are
	// providing while creating the subscription.
	payload, err := v.Validate(r.Context(), token, "http://example.com")
	if err != nil {
		http.Error(w, fmt.Sprintf("Invalid Token: %v", err), http.StatusBadRequest)
		return
	}
	if payload.Issuer != "accounts.google.com" && payload.Issuer != "https://accounts.google.com" {
		http.Error(w, "Wrong Issuer", http.StatusBadRequest)
		return
	}

	// IMPORTANT: you should validate claim details not covered by signature
	// and audience verification above, including:
	//   - Ensure that `payload.Claims["email"]` is equal to the expected service
	//     account set up in the push subscription settings.
	//   - Ensure that `payload.Claims["email_verified"]` is set to true.
	if payload.Claims["email"] != "test-service-account-email@example.com" || payload.Claims["email_verified"] != true {
		http.Error(w, "Unexpected email identity", http.StatusBadRequest)
		return
	}

	var pr pushRequest
	if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {
		http.Error(w, fmt.Sprintf("Could not decode body: %v", err), http.StatusBadRequest)
		return
	}

	a.messagesMu.Lock()
	defer a.messagesMu.Unlock()
	// Limit to ten.
	a.messages = append(a.messages, pr.Message.Data)
	if len(a.messages) > maxMessages {
		a.messages = a.messages[len(a.messages)-maxMessages:]
	}

	fmt.Fprint(w, "OK")
}

Java

@WebServlet(value = "/pubsub/authenticated-push")
public class PubSubAuthenticatedPush extends HttpServlet {
  private final String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN");
  private final MessageRepository messageRepository;
  private final GoogleIdTokenVerifier verifier =
      new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new JacksonFactory())
          /**
           * Please change example.com to match with value you are providing while creating
           * subscription as provided in @see <a
           * href="https://github.com/GoogleCloudPlatform/java-docs-samples/tree/main/appengine-java8/pubsub">README</a>.
           */
          .setAudience(Collections.singletonList("example.com"))
          .build();
  private final Gson gson = new Gson();
  private final JsonParser jsonParser = new JsonParser();

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    // Verify that the request originates from the application.
    if (req.getParameter("token").compareTo(pubsubVerificationToken) != 0) {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      return;
    }
    // Get the Cloud Pub/Sub-generated JWT in the "Authorization" header.
    String authorizationHeader = req.getHeader("Authorization");
    if (authorizationHeader == null
        || authorizationHeader.isEmpty()
        || authorizationHeader.split(" ").length != 2) {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      return;
    }
    String authorization = authorizationHeader.split(" ")[1];

    try {
      // Verify and decode the JWT.
      // Note: For high volume push requests, it would save some network overhead
      // if you verify the tokens offline by decoding them using Google's Public
      // Cert; caching already seen tokens works best when a large volume of
      // messsages have prompted a single push server to handle them, in which
      // case they would all share the same token for a limited time window.
      GoogleIdToken idToken = verifier.verify(authorization);

      GoogleIdToken.Payload payload = idToken.getPayload();
      // IMPORTANT: you should validate claim details not covered by signature
      // and audience verification above, including:
      //   - Ensure that `payload.getEmail()` is equal to the expected service
      //     account set up in the push subscription settings.
      //   - Ensure that `payload.getEmailVerified()` is set to true.

      messageRepository.saveToken(authorization);
      messageRepository.saveClaim(payload.toPrettyString());
      // parse message object from "message" field in the request body json
      // decode message data from base64
      Message message = getMessage(req);
      messageRepository.save(message);
      // 200, 201, 204, 102 status codes are interpreted as success by the Pub/Sub system
      resp.setStatus(102);
      super.doPost(req, resp);
    } catch (Exception e) {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    }
  }

  private Message getMessage(HttpServletRequest request) throws IOException {
    String requestBody = request.getReader().lines().collect(Collectors.joining("\n"));
    JsonElement jsonRoot = jsonParser.parse(requestBody);
    String messageStr = jsonRoot.getAsJsonObject().get("message").toString();
    Message message = gson.fromJson(messageStr, Message.class);
    // decode from base64
    String decoded = decode(message.getData());
    message.setData(decoded);
    return message;
  }

  private String decode(String data) {
    return new String(Base64.getDecoder().decode(data));
  }

  PubSubAuthenticatedPush(MessageRepository messageRepository) {
    this.messageRepository = messageRepository;
  }

  public PubSubAuthenticatedPush() {
    this(MessageRepositoryImpl.getInstance());
  }
}

Node.js

app.post('/pubsub/authenticated-push', jsonBodyParser, async (req, res) => {
  // Verify that the request originates from the application.
  if (req.query.token !== PUBSUB_VERIFICATION_TOKEN) {
    res.status(400).send('Invalid request');
    return;
  }

  // Verify that the push request originates from Cloud Pub/Sub.
  try {
    // Get the Cloud Pub/Sub-generated JWT in the "Authorization" header.
    const bearer = req.header('Authorization');
    const [, token] = bearer.match(/Bearer (.*)/);
    tokens.push(token);

    // Verify and decode the JWT.
    // Note: For high volume push requests, it would save some network
    // overhead if you verify the tokens offline by decoding them using
    // Google's Public Cert; caching already seen tokens works best when
    // a large volume of messages have prompted a single push server to
    // handle them, in which case they would all share the same token for
    // a limited time window.
    const ticket = await authClient.verifyIdToken({
      idToken: token,
      audience: 'example.com',
    });

    const claim = ticket.getPayload();

    // IMPORTANT: you should validate claim details not covered
    // by signature and audience verification above, including:
    //   - Ensure that `claim.email` is equal to the expected service
    //     account set up in the push subscription settings.
    //   - Ensure that `claim.email_verified` is set to true.

    claims.push(claim);
  } catch (e) {
    res.status(400).send('Invalid token');
    return;
  }

  // The message is a unicode string encoded in base64.
  const message = Buffer.from(req.body.message.data, 'base64').toString(
    'utf-8'
  );

  messages.push(message);

  res.status(200).send();
});

Python

@app.route('/push-handlers/receive_messages', methods=['POST'])
def receive_messages_handler():
    # Verify that the request originates from the application.
    if (request.args.get('token', '') !=
            current_app.config['PUBSUB_VERIFICATION_TOKEN']):
        return 'Invalid request', 400

    # Verify that the push request originates from Cloud Pub/Sub.
    try:
        # Get the Cloud Pub/Sub-generated JWT in the "Authorization" header.
        bearer_token = request.headers.get('Authorization')
        token = bearer_token.split(' ')[1]
        TOKENS.append(token)

        # Verify and decode the JWT. `verify_oauth2_token` verifies
        # the JWT signature, the `aud` claim, and the `exp` claim.
        # Note: For high volume push requests, it would save some network
        # overhead if you verify the tokens offline by downloading Google's
        # Public Cert and decode them using the `google.auth.jwt` module;
        # caching already seen tokens works best when a large volume of
        # messages have prompted a single push server to handle them, in which
        # case they would all share the same token for a limited time window.
        claim = id_token.verify_oauth2_token(token, requests.Request(),
                                             audience='example.com')

        # IMPORTANT: you should validate claim details not covered by signature
        # and audience verification above, including:
        #   - Ensure that `claim["email"]` is equal to the expected service
        #     account set up in the push subscription settings.
        #   - Ensure that `claim["email_verified"]` is set to true.

        CLAIMS.append(claim)
    except Exception as e:
        return 'Invalid token: {}\n'.format(e), 400

    envelope = json.loads(request.data.decode('utf-8'))
    payload = base64.b64decode(envelope['message']['data'])
    MESSAGES.append(payload)
    # Returning any 2xx status indicates successful receipt of the message.
    return 'OK', 200

Ruby

post "/pubsub/authenticated-push" do
  halt 400 if params[:token] != PUBSUB_VERIFICATION_TOKEN

  begin
    bearer = request.env["HTTP_AUTHORIZATION"]
    token = /Bearer (.*)/.match(bearer)[1]
    claim = Google::Auth::IDTokens.verify_oidc token, aud: "example.com"

    # IMPORTANT: you should validate claim details not covered by signature
    # and audience verification above, including:
    #   - Ensure that `claim["email"]` is equal to the expected service
    #     account set up in the push subscription settings.
    #   - Ensure that `claim["email_verified"]` is set to true.

    claims.push claim
  rescue Google::Auth::IDTokens::VerificationError => e
    puts "VerificationError: #{e.message}"
    halt 400, "Invalid token"
  end

  message = JSON.parse request.body.read
  payload = Base64.decode64 message["message"]["data"]

  messages.push payload
end

Para informações sobre a variável de ambiente PUBSUB_VERIFICATION_TOKEN usada nas amostras de código acima, consulte Como gravar e responder a mensagens do Pub/Sub.

Veja outros exemplos de como validar o JWT do portador neste Guia de Login do Google para sites. Para mais informações sobre os tokens do OpenID, acesse o guia do OpenID Connect, que inclui uma lista das bibliotecas de cliente que ajudam a validar os JWTs.

Autenticação de outros serviços do Google Cloud

O Cloud Run, o App Engine e o Cloud Functions autenticam chamadas HTTP do Pub/Sub verificando os tokens gerados pelo Pub/Sub. A única configuração necessária é conceder os papéis do IAM necessários à conta de autor da chamada.

Consulte os seguintes guias e tutoriais para diferentes casos de uso com estes serviços:

Cloud Run:

Google App Engine:

Funções do Cloud:

  • Acionadores HTTP: sua conta de serviço de autenticação push precisa ter o papel roles/cloudfunctions.invoker para invocar uma função se você pretende usar solicitações de push do Pub/Sub como acionadores HTTP para a função.
  • Gatilhos do Google Cloud Pub/Sub: os papéis e as permissões do IAM serão configurados automaticamente se você usar gatilhos do Pub/Sub para invocar uma função

Parar e retomar a entrega de mensagens

Para interromper temporariamente o envio de solicitações do Pub/Sub para o endpoint de push, altere a assinatura para pull. A alteração pode levar vários minutos para entrar em vigor.

Para retomar a entrega por push, defina o URL para um endpoint válido novamente. Caso queira interromper a entrega permanentemente, exclua a assinatura.

Cotas e limites

As assinaturas de push estão sujeitas a um conjunto de cotas e limites de recursos.

Espera de push

Se um assinante de push enviar confirmações negativas, o Pub/Sub poderá enviar mensagens usando uma espera. Quando o Pub/Sub usa uma espera de push, ele interrompe a entrega de mensagens por um período de 100 milissegundos a 60 segundos e depois começa a entregar mensagens novamente.

A espera de push é uma espera exponencial que impede que um assinante de push receba mensagens que não pode processar. A quantidade de tempo que o Pub/Sub para de entregar mensagens depende do número de confirmações negativas enviadas aos assinantes.

Por exemplo, se um assinante de push receber cinco mensagens por segundo e enviar uma confirmação negativa por segundo, o Pub/Sub entregará mensagens aproximadamente a cada 500 milissegundos. Se o assinante de push enviar cinco confirmações negativas por segundo, o Pub/Sub entrega mensagens a cada 30 a 60 segundos.

Taxa de envio

O Pub/Sub ajusta o número de solicitações de push simultâneas usando um algoritmo de inicialização lenta. O número máximo permitido de solicitações de push simultâneas é a janela de push. A janela de push aumenta em qualquer entrega bem-sucedida e diminui qualquer falha. O sistema começa com um tamanho pequeno de janela de um dígito.

Quando um assinante confirma mensagens, a janela aumenta exponencialmente. Para assinaturas em que os assinantes reconhecem mais de 99% das mensagens e média de menos de um segundo de latência na solicitação de push, a janela de push precisa ser expandida o suficiente para acompanhar qualquer capacidade de publicação.

A latência da solicitação de push inclui o seguinte:

Após 3.000 mensagens pendentes por região, a janela aumenta linearmente para evitar que o endpoint de push receba muitas mensagens. Se a latência média exceder um segundo ou o assinante confirmar menos de 99% das solicitações, a janela diminuirá para o limite inferior de 3.000 mensagens pendentes.

Para mais informações sobre as métricas que podem ser usadas para monitorar a entrega por push, consulte Como monitorar assinaturas de push.