|
1 | 1 | class AuthorizationsController < ApplicationController
|
| 2 | + include Concerns::ConnectEndpoint |
| 3 | + |
| 4 | + before_action :require_oauth_request |
| 5 | + before_action :require_response_type_code |
| 6 | + before_action :require_client |
| 7 | + before_action :require_authentication |
| 8 | + |
2 | 9 | def new
|
3 | 10 | end
|
4 | 11 |
|
5 | 12 | def create
|
6 |
| - authorization.save! |
7 |
| - separator = if current_client.redirect_uri.include?('?') |
8 |
| - '&' |
| 13 | + if params[:commit] == 'approve' |
| 14 | + authorization = current_account.authorizations.create( |
| 15 | + client: @client, |
| 16 | + nonce: oauth_request.nonce |
| 17 | + ) |
| 18 | + authorization.scopes << requested_scopes |
| 19 | + oauth_response.code = authorization.code |
| 20 | + oauth_response.redirect_uri = @redirect_uri |
| 21 | + oauth_response.approve! |
| 22 | + redirect_to oauth_response.location |
9 | 23 | else
|
10 |
| - '?' |
| 24 | + oauth_request.access_denied! |
11 | 25 | end
|
12 |
| - redirect_to [current_client.redirect_uri, {code: authorization.code, state: accepted_params[:state]}.to_query].join(separator) |
13 | 26 | end
|
14 | 27 |
|
15 | 28 | private
|
16 | 29 |
|
17 |
| - def authorization |
18 |
| - unless @authorization |
19 |
| - @authorization = current_account.authorizations.build( |
20 |
| - client: current_client, |
21 |
| - nonce: accepted_params[:nonce] |
22 |
| - ) |
23 |
| - @authorization.scopes << requested_scopes |
24 |
| - end |
25 |
| - @authorization |
26 |
| - end |
27 |
| - helper_method :authorization |
28 |
| - |
29 |
| - def accepted_params |
30 |
| - required_params = [:client_id, :response_type, :redirect_uri, :scope] |
31 |
| - optional_params = [:nonce, :state] |
32 |
| - required_params.each do |key| |
33 |
| - params.require key |
34 |
| - end |
35 |
| - if params[:response_type] != 'code' |
36 |
| - raise HttpError::BadRequest.new('only respose_type=code is supported') |
37 |
| - end |
38 |
| - params.permit *(required_params + optional_params) |
| 30 | + def require_client |
| 31 | + @client = Client.find_by(identifier: oauth_request.client_id) or oauth_request.invalid_request! |
| 32 | + @redirect_uri = oauth_request.verify_redirect_uri! @client.redirect_uri |
39 | 33 | end
|
40 |
| - helper_method :accepted_params |
41 | 34 |
|
42 | 35 | def requested_scopes
|
43 |
| - @requested_scopes ||= Scope.where name: accepted_params[:scope].split |
| 36 | + @requested_scopes ||= Scope.where(name: oauth_request.scope.split) |
44 | 37 | end
|
45 | 38 | helper_method :requested_scopes
|
46 | 39 |
|
47 |
| - def current_client |
48 |
| - @current_client ||= Client.find_by!( |
49 |
| - identifier: accepted_params[:client_id], |
50 |
| - redirect_uri: accepted_params[:redirect_uri] |
51 |
| - ) |
| 40 | + def require_response_type_code |
| 41 | + unless oauth_request.response_type == :code |
| 42 | + oauth_request.unsupported_response_type! |
| 43 | + end |
52 | 44 | end
|
53 |
| - helper_method :current_client |
54 | 45 | end
|
0 commit comments