lib/osso/routes/oauth.rb in osso-0.0.5.pre.delta vs lib/osso/routes/oauth.rb in osso-0.0.5.pre.epsilon

- old
+ new

@@ -14,33 +14,23 @@ # of the user who wants to sign in. If the sign in request # is valid, the user is redirected to their Identity Provider. # Once they complete IdP login, they will be returned to the # redirect_uri with an authorization code parameter. get '/authorize' do - Rack::OAuth2::Server::Authorize.new do |req, _res| - client = Models::OauthClient.find_by!(identifier: req.client_id) - session[:osso_oauth_redirect_uri] = req.verify_redirect_uri!(client.redirect_uri_values) - session[:osso_oauth_state] = params[:state] - end.call(env) + client = find_client(params[:client_id]) + enterprise = find_account(domain: params[:domain], client_id: client.id) - enterprise = Models::EnterpriseAccount. - includes(:identity_providers). - find_by!(domain: params[:domain]) + validate_oauth_request(env) redirect "/auth/saml/#{enterprise.provider.id}" if enterprise.single_provider? @providers = enterprise.identity_providers erb :multiple_providers - rescue Rack::OAuth2::Server::Authorize::BadRequest => e + rescue Osso::Error::OAuthError => e @error = e erb :error - rescue ActiveRecord::RecordNotFound => e - @error = e - @error = 'No OAuth Client exists for the provided client_id' if e.model == 'Osso::Models::OauthClient' - @error = "No Customer exists with the domain #{params[:domain]}" if e.model == 'Osso::Models::EnterpriseAccount' - erb :error end # Exchange an authorization code for an access token. # In addition to the authorization code, you must include all # paramaters required by OAuth spec: redirect_uri, client ID, @@ -63,8 +53,34 @@ includes(:user). valid. find_by_token!(params[:access_token]). user end + end + + private + + def find_account(domain:, client_id:) + Models::EnterpriseAccount. + includes(:identity_providers). + find_by!(domain: domain, oauth_client_id: client_id) + rescue ActiveRecord::RecordNotFound + raise Osso::Error::NoAccountForOAuthClientError + end + + def find_client(identifier) + @client ||= Models::OauthClient.find_by!(identifier: identifier) + rescue ActiveRecord::RecordNotFound + raise Osso::Error::InvalidOAuthClientIdentifier + end + + def validate_oauth_request(env) + Rack::OAuth2::Server::Authorize.new do |req, _res| + client = find_client(req[:client_id]) + session[:osso_oauth_redirect_uri] = req.verify_redirect_uri!(client.redirect_uri_values) + session[:osso_oauth_state] = params[:state] + end.call(env) + rescue Rack::OAuth2::Server::Authorize::BadRequest + raise Osso::Error::InvalidRedirectUri end end end