Completed
Push — master ( 89937f...97171d )
by John
01:11
created

AuthCode.new_auth_code_client()   A

Complexity

Conditions 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 8
rs 9.4285
1
require 'faraday'
2
require 'faraday_middleware'
3
require 'faraday_middleware/oauth2_refresh'
4
require 'oauth2'
5
6
module MediumSdk::Connection
7
  class AuthCode
8
    OAUTH_HOST = 'https://medium.com'
9
    OAUTH_AUTHZ_ENDPOINT = '/m/oauth/authorize'
10
    OAUTH_TOKEN_ENDPOINT = '/m/oauth/token'
11
    API_HOST = 'https://api.medium.com'
12
    API_VERSION = 'v1'
13
14
    attr_reader :client_id
15
16
    attr_accessor :authcode_client
17
    attr_accessor :oauth2client
18
    attr_accessor :oauth_redirect_uri
19
    attr_accessor :http
20
    attr_accessor :token
21
22
    def initialize(opts = {})
23
      init_attributes
24
      @client_id = opts[:client_id] if opts.key? :client_id
25
      @client_secret = opts[:client_secret] if opts.key? :client_secret
26
      @oauth_redirect_uri = opts[:redirect_uri] if opts.key? :redirect_uri
27
      @scope = opts[:scope] if opts.key? :scope
28
      @instance_headers = opts[:instance_headers] if opts.key? :instance_headers
29
      @oauth2client = new_oauth2_client
30
      @authcode_client = new_auth_code_client
31
    end
32
33
    def init_attributes()
34
      @token = nil
35
      @http = nil
36
      @instance_headers = nil
37
    end
38
39
    def set_token(token)
40
      if token.is_a? Hash
41
        token = OAuth2::AccessToken::from_hash @oauth2client, token
42
      elsif token.is_a? String
43
        if token =~ /^\s*{.+}\s*$/
44
          token_hash = MultiJson.decode(token)
45
          token = OAuth2::AccessToken::from_hash @oauth2client, token_hash
46
        else
47
          token = { 'access_token' => token }
48
          token = OAuth2::AccessToken::from_hash @oauth2client, token
49
        end
50
      end
51
52
      unless token.is_a? OAuth2::AccessToken
53
        raise "Token is not a OAuth2::AccessToken"
54
      end
55
56
      @token = token
57
58
      @http = Faraday.new(url: api_version_uri()) do |conn|
59
        conn.request :oauth2_refresh, @token
60
        conn.request :json
61
        if @instance_headers.is_a? Hash 
62
          @instance_headers.each do |k,v|
63
            conn.headers[k] = v
64
          end
65
        end
66
        conn.response :json, content_type: /\bjson$/
67
        conn.response :logger
68
        conn.adapter Faraday.default_adapter
69
      end
70
    end
71
72
    def api_version_uri()
73
      return File.join API_HOST, API_VERSION
74
    end
75
76
    def authorize_uri(opts = {})
77
      @oauth2client = new_oauth2_client() unless @oauth2client
78
      opts.merge!({
79
        'client_id' => @client_id,
80
        'response_type' => 'code'})
81
      if ! opts.key(:scope) && ! opts.key('scope') && @scope
82
        opts.merge!({ 'scope' => @scope })
83
      end
84
      @oauth2client.auth_code.authorize_url _add_redirect_uri(opts)
85
    end
86
87
    def _add_redirect_uri(opts = {})
88
      if !opts.key?(:redirect_uri) && @oauth_redirect_uri.to_s.length > 0
89
        opts[:redirect_uri] = @oauth_redirect_uri.to_s
90
      end
91
      return opts
92
    end
93
94
    def authorize_code(code, opts = {})
95
      #token = @oauth2client.auth_code.get_token(code, _add_redirect_uri(opts))
96
      params = {
97
        code: code,
98
        client_id: @client_id,
99
        client_secret: @client_secret,
100
        redirect_uri: @oauth_redirect_uri,
101
        grant_type: 'authorization_code'
102
      }
103
      res = @authcode_client.post '/v1/tokens', params
104
      set_token res.body
105
      return @token
106
    end
107
108
    def new_auth_code_client
109
      return Faraday.new(url: API_HOST) do |faraday|
110
        faraday.request  :url_encoded             # form-encode POST params
111
        faraday.response :json, content_type: /\bjson$/
112
        faraday.response :logger                  # log requests to STDOUT
113
        faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
114
      end
115
    end
116
117
    def new_oauth2_client
118
      return OAuth2::Client.new(@client_id, @client_secret,
119
        site: OAUTH_HOST,
120
        authorize_url: OAUTH_AUTHZ_ENDPOINT,
121
        token_url: OAUTH_TOKEN_ENDPOINT)
122
    end
123
124
  end
125
end