appengine/flexible/ruby31-and-earlier/pubsub/app.rb (62 lines of code) (raw):

# Copyright 2016 Google, Inc # # 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. require "sinatra" require "slim" require "json" require "base64" require "google/cloud/pubsub" require "googleauth" pubsub = Google::Cloud::Pubsub.new # [START gae_flex_pubsub_env] topic = pubsub.topic ENV["PUBSUB_TOPIC"] PUBSUB_VERIFICATION_TOKEN = ENV["PUBSUB_VERIFICATION_TOKEN"] # [END gae_flex_pubsub_env] claims = [] # [START gae_flex_pubsub_messages] # List of all messages received by this instance messages = [] # [END gae_flex_pubsub_messages] # [START gae_flex_pubsub_index] get "/" do @claims = claims @messages = messages slim :index end post "/publish" do topic.publish params[:payload] redirect "/", 303 end # [END gae_flex_pubsub_index] # [START gae_flex_pubsub_push] post "/pubsub/push" do halt 400 if params[:token] != PUBSUB_VERIFICATION_TOKEN message = JSON.parse request.body.read payload = Base64.decode64 message["message"]["data"] messages.push payload end # [END gae_flex_pubsub_push] # [START gaestd_ruby_pubsub_auth_push] 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 # [END gaestd_ruby_pubsub_auth_push] __END__ @@index doctype html html head title Pub/Sub Ruby on Google App Engine Managed VMs body p Print CLAIMS: ul - @claims.each do |claim| li = claim p Messages received by this instance: ul - @messages.each do |message| li = message p small | Note: because your application is likely running multiple instances, | each instance will have a different list of messages. form method="post" action="publish" textarea name="payload" placeholder="Enter message here." input type="submit" value="Send"