Class: Stackd::AuthRequest

Inherits:
Object
  • Object
show all
Includes:
Concerns::RequireAttr, Concerns::TattrAccessor
Defined in:
lib/stackd/auth_request.rb

Defined Under Namespace

Classes: StateMismatchError

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Concerns::RequireAttr

#require_attr!

Methods included from Concerns::TattrAccessor

#tattr?

Constructor Details

#initialize(client, attrs = {}) ⇒ AuthRequest

Returns a new instance of AuthRequest.



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/stackd/auth_request.rb', line 79

def initialize client, attrs = {}
  if client.nil?
    raise ArgumentError.new "client not provided"
  else
    self.client = client
  end

  attrs.each do |key, val|
    public_send :"#{key}=", val
  end

  if state.nil?
    self.state = SecureRandom.urlsafe_base64 9
  end
end

Class Method Details

.client(client, params = {}) ⇒ Object



30
31
32
33
# File 'lib/stackd/auth_request.rb', line 30

def client client, params = {}
  request_token client, grant_type: 'client_credentials',
                        scope: params[:scope]
end

.password(client, params) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/stackd/auth_request.rb', line 15

def password client, params
  if params[:username].nil?
    raise ArgumentError.new "username is required"
  end

  if params[:password].nil?
    raise ArgumentError.new "password is required"
  end

  request_token client, grant_type: 'password',
                        username: params[:username],
                        password: params[:password],
                        scope: params[:scope]
end

.refresh(client, token, params = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/stackd/auth_request.rb', line 35

def refresh client, token, params = {}
  if token.nil?
    raise ArgumentError.new "Token is required"
  end

  if token.refresh_token.nil?
    raise ArgumentError.new "Token must have refresh_token"
  end

  request_token client, grant_type: 'refresh_token',
                        refresh_token: token.refresh_token,
                        scope: params[:scope]
end

Instance Method Details

#callback(params) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/stackd/auth_request.rb', line 109

def callback params
  unless params[:code] || params[:error]
    raise ArgumentError.new 'no code or error'
  end

  if params[:state] != state
    raise StateMismatchError.new "#{params[:state]} != #{state}"
  end

  if params[:error]
    raise Error.new params
  else
    self.class.send :request_token, client, {
      grant_type: 'authorization_code',
      code: params[:code],
      redirect_uri: redirect_uri
    }
  end
end

#url(params = {}) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/stackd/auth_request.rb', line 95

def url params = {}
  uri = auth_url

  uri.query_values = {
    response_type: 'code',
    client_id: client.id,
    state: state,
    redirect_uri: params[:redirect_uri],
    scope: params[:scope]
  }.reject { |k,v| v.nil? }

  uri.to_s
end