google_drive-persistent_session 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b5bdef8e2f0bd44da8d68b3a5ce2532ca972c8c3ddee6acbb328323b2dfd7c2
|
4
|
+
data.tar.gz: 7f4df6909ee4be4cf3fb68307d89ab34488b67f6918e89ced9aa3a99a040491e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03bb11202767d968a0aff3fdef3aa6bda9568e2cdd193c9279f59e77e0e64b1f4cd67cfc11e95b2843a323f4226708efef2f0d829897f61ca2d1039cfe459ccf
|
7
|
+
data.tar.gz: 7433eedb639ccd7803a105570b918b59ad408b4a2f0f8fc1296ebbee9c21aecce63466ec2885231a247c0031111a22570b33f50ddf7a9d59d77ae425e7601481
|
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'uri'
|
3
|
+
require 'webrick'
|
4
|
+
|
1
5
|
class GoogleDrive::PersistentSession
|
2
6
|
extend Forwardable
|
3
7
|
include GoogleDrive::CredentialStorage
|
@@ -35,6 +39,42 @@ class GoogleDrive::PersistentSession
|
|
35
39
|
client_secret = ask('Enter CLIENT SECRET: ') {|q| q.echo = false }
|
36
40
|
puts # line break
|
37
41
|
|
42
|
+
# Use loopback IP address redirect option
|
43
|
+
# https://developers.google.com/identity/protocols/oauth2/native-app#redirect-uri_loopback
|
44
|
+
server = WEBrick::HTTPServer.new(Port: 0, AccessLog: [])
|
45
|
+
queue = Thread::SizedQueue.new(1)
|
46
|
+
health_token = SecureRandom.uuid
|
47
|
+
server.mount_proc('/') do |req, resp|
|
48
|
+
resp.content_type = 'text/plain'
|
49
|
+
if req.request_method != 'GET'
|
50
|
+
resp.status = 405
|
51
|
+
res.body = 'Method Not Allowed'
|
52
|
+
next
|
53
|
+
end
|
54
|
+
|
55
|
+
case req.path
|
56
|
+
when '/'
|
57
|
+
# redirect
|
58
|
+
params = URI.decode_www_form(req.query_string).to_h
|
59
|
+
if params.key?('code')
|
60
|
+
code = params.fetch('code')
|
61
|
+
resp.status = 200
|
62
|
+
resp.body = 'Successfully authorized. Back to console'
|
63
|
+
queue.push(code)
|
64
|
+
else
|
65
|
+
resp.status = 400
|
66
|
+
resp.body = 'Failed to authorize: code is missing'
|
67
|
+
queue.push(nil)
|
68
|
+
end
|
69
|
+
when '/health'
|
70
|
+
resp.status = 200
|
71
|
+
resp.body = health_token
|
72
|
+
else
|
73
|
+
resp.status = 404
|
74
|
+
resp.body = 'not found'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
server_thread = Thread.start { server.start }
|
38
78
|
credential = Google::Auth::UserRefreshCredentials.new(
|
39
79
|
:client_id => client_id,
|
40
80
|
:client_secret => client_secret,
|
@@ -42,18 +82,45 @@ class GoogleDrive::PersistentSession
|
|
42
82
|
'https://www.googleapis.com/auth/drive',
|
43
83
|
'https://spreadsheets.google.com/feeds/'
|
44
84
|
],
|
45
|
-
:redirect_uri =>
|
85
|
+
:redirect_uri => "http://127.0.0.1:#{server.config[:Port]}",
|
46
86
|
:grant_type => 'authorization_code'
|
47
87
|
)
|
48
88
|
|
49
|
-
|
89
|
+
server_launched = false
|
90
|
+
60.times do |i|
|
91
|
+
begin
|
92
|
+
resp = Net::HTTP.get_response('127.0.0.1', '/health', server.config[:Port])
|
93
|
+
resp.value
|
94
|
+
if resp.body == health_token
|
95
|
+
server_launched = true
|
96
|
+
break
|
97
|
+
else
|
98
|
+
$stderr.puts " Server returned unknown response: #{resp.body}"
|
99
|
+
sleep 1
|
100
|
+
end
|
101
|
+
rescue => e
|
102
|
+
$stderr.puts " Waiting server launch: #{e.class}: #{e.message}"
|
103
|
+
sleep 1
|
104
|
+
end
|
105
|
+
end
|
106
|
+
unless server_launched
|
107
|
+
server.shutdown
|
108
|
+
server_thread.join
|
109
|
+
raise 'Failed to start HTTP server'
|
110
|
+
end
|
111
|
+
fetch_access_token(credential, queue, server, server_thread)
|
50
112
|
storage.write_credentials(credential)
|
51
113
|
end
|
52
114
|
|
53
|
-
def fetch_access_token(credential)
|
54
|
-
|
55
|
-
|
56
|
-
|
115
|
+
def fetch_access_token(credential, queue, server, server_thread)
|
116
|
+
puts "Open this page in web browser: #{credential.authorization_uri}"
|
117
|
+
code = queue.pop
|
118
|
+
server.shutdown
|
119
|
+
server_thread.join
|
120
|
+
unless code
|
121
|
+
raise 'authorization failed'
|
122
|
+
end
|
123
|
+
credential.code = code
|
57
124
|
|
58
125
|
credential.fetch_access_token!
|
59
126
|
storage.write_credentials(credential)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_drive-persistent_session
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google_drive
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: webrick
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
117
|
- !ruby/object:Gem::Version
|
104
118
|
version: '0'
|
105
119
|
requirements: []
|
106
|
-
rubygems_version: 3.
|
120
|
+
rubygems_version: 3.3.7
|
107
121
|
signing_key:
|
108
122
|
specification_version: 4
|
109
123
|
summary: Persist credential for google-drive-ruby.
|