Class: AlexaWebService::Verify

Inherits:
Object
  • Object
show all
Defined in:
lib/alexa_web_service/verify.rb

Instance Method Summary collapse

Constructor Details

#initialize(request_env, request_body) ⇒ Verify

Returns a new instance of Verify.



4
5
6
7
8
9
10
# File 'lib/alexa_web_service/verify.rb', line 4

def initialize(request_env, request_body)
  @request_body = request_body
  @timestamp = JSON.parse(request_body)["request"]["timestamp"]
  @url = request_env["HTTP_SIGNATURECERTCHAINURL"]
  @signature = request_env["HTTP_SIGNATURE"]
  @digest = OpenSSL::Digest::SHA1.new
end

Instance Method Details

#check_signature(certificate) ⇒ Object



37
38
39
# File 'lib/alexa_web_service/verify.rb', line 37

def check_signature(certificate)
  certificate.public_key.verify(@digest, Base64.decode64(@signature), @request_body) rescue false
end

#get_certificateObject



27
28
29
30
31
32
33
34
35
# File 'lib/alexa_web_service/verify.rb', line 27

def get_certificate
  begin
    OpenSSL::X509::Certificate.new HTTParty.get(@url)
  rescue TypeError
    "Bad Request"
  rescue OpenSSL::SSL::SSLError
    "Bad Request"
  end
end

#valid_address?Boolean

Returns:

  • (Boolean)


12
13
14
15
# File 'lib/alexa_web_service/verify.rb', line 12

def valid_address?
  valid_address = /^https:\/\/s3.amazonaws.com(:443)?\/echo.api\/.*?$/
  @url == @url.match(valid_address)[0] rescue false
end

#valid_certificate?(certificate) ⇒ Boolean

Returns:

  • (Boolean)


21
22
23
24
25
# File 'lib/alexa_web_service/verify.rb', line 21

def valid_certificate?(certificate)
  certificate.subject.to_a.last.include?("echo-api.amazon.com") && 
  Time.now.utc > certificate.not_before && 
  Time.now.utc < certificate.not_after
end

#valid_timestamp?Boolean

Returns:

  • (Boolean)


17
18
19
# File 'lib/alexa_web_service/verify.rb', line 17

def valid_timestamp?
  Time.now < DateTime.parse(@timestamp).to_time + 150 rescue false
end

#verify_requestObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/alexa_web_service/verify.rb', line 41

def verify_request

  if valid_address? && valid_timestamp?
    @certificate = get_certificate
  else
    "Bad Request"
  end

  if valid_certificate?(@certificate)
    @verify = check_signature(@certificate)
  else
    "Invalid Certificate"
  end

  if @verify
    "OK"
  else
    "Invalid Signature"
  end
end