forked from er1c/gattica
-
Notifications
You must be signed in to change notification settings - Fork 48
/
auth.rb
53 lines (40 loc) · 1.71 KB
/
auth.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
require 'net/http'
require 'net/https'
module Gattica
# Authenticates a user against the Google Client Login system
class Auth
include Convertible
SCRIPT_NAME = '/accounts/ClientLogin'
HEADERS = { 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby Net::HTTP' } # Google asks that you be nice and provide a user-agent string
OPTIONS = { :source => 'gattica-'+Gattica::VERSION, :service => 'analytics' } # Google asks that you provide the name of your app as a 'source' parameter in your POST
attr_reader :tokens
# Try to authenticate the user
def initialize(http, user)
options = OPTIONS.merge(user.to_h)
options.extend HashExtensions
response, data = http.post(SCRIPT_NAME, options.to_query, HEADERS)
if response.code != '200'
case response.code
when '403'
raise GatticaError::CouldNotAuthenticate, 'Your email and/or password is not recognized by the Google ClientLogin system (status code: 403)'
else
raise GatticaError::UnknownAnalyticsError, response.body + " (status code: #{response.code})"
end
end
@tokens = parse_tokens(data)
end
private
# Parse the authentication tokens out of the response and makes them available as a hash
#
# tokens[:auth] => Google requires this for every request (added to HTTP headers on GET requests)
# tokens[:sid] => Not used
# tokens[:lsid] => Not used
def parse_tokens(data)
tokens = {}
data.split("\n").each do |t|
tokens.merge!({ t.split('=').first.downcase.to_sym => t.split('=').last })
end
return tokens
end
end
end