Class: Raindrop::OAuth

Inherits:
Object
  • Object
show all
Defined in:
lib/raindrop/oauth.rb

Constant Summary collapse

BASE_URL =
"https://api.raindrop.io/v1"
AUTHORIZATION_URL =
"#{BASE_URL}/oauth/authorize"
DEFAULT_REDIRECT_URI =
"http://127.0.0.1:42813/callback"

Instance Method Summary collapse

Constructor Details

#initialize(connection: nil) ⇒ OAuth

Returns a new instance of OAuth.



16
17
18
# File 'lib/raindrop/oauth.rb', line 16

def initialize(connection: nil)
  @connection = connection || default_connection
end

Instance Method Details

#authorization_url(client_id:, redirect_uri:) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/raindrop/oauth.rb', line 20

def authorization_url(client_id:, redirect_uri:)
  query = URI.encode_www_form(
    "response_type" => "code",
    "client_id" => client_id,
    "redirect_uri" => redirect_uri
  )
  "#{AUTHORIZATION_URL}?#{query}"
end

#exchange_code(client_id:, client_secret:, redirect_uri:, code:) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/raindrop/oauth.rb', line 29

def exchange_code(client_id:, client_secret:, redirect_uri:, code:)
  response = @connection.post("oauth/access_token") do |request|
    request.headers["Content-Type"] = "application/json"
    request.body = JSON.generate(
      "grant_type" => "authorization_code",
      "code" => code,
      "client_id" => client_id,
      "client_secret" => client_secret,
      "redirect_uri" => redirect_uri
    )
  end
  handle_response(response)
rescue Faraday::ConnectionFailed => e
  raise ApiError, "OAuth request failed: #{e.message}"
end

#receive_authorization_code(redirect_uri:) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/raindrop/oauth.rb', line 45

def receive_authorization_code(redirect_uri:)
  redirect = URI.parse(redirect_uri)
  server = TCPServer.new(redirect.host, redirect.port)
  socket = server.accept
  request_line = socket.gets.to_s
  code = authorization_code_from_request(request_line, expected_path: redirect.path)
  write_callback_response(socket, "Authentication complete. You can close this window.")
  code
ensure
  socket&.close
  server&.close
end