Add userinfo oauth endpoint (#32548)
This commit is contained in:
		
							
								
								
									
										51
									
								
								spec/requests/oauth/userinfo_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								spec/requests/oauth/userinfo_spec.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe 'Oauth Userinfo Endpoint' do
 | 
			
		||||
  include RoutingHelper
 | 
			
		||||
 | 
			
		||||
  let(:user)     { Fabricate(:user) }
 | 
			
		||||
  let(:account)  { user.account }
 | 
			
		||||
  let(:token)    { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
 | 
			
		||||
  let(:scopes)   { 'profile' }
 | 
			
		||||
  let(:headers)  { { 'Authorization' => "Bearer #{token.token}" } }
 | 
			
		||||
 | 
			
		||||
  shared_examples 'returns successfully' do
 | 
			
		||||
    it 'returns http success' do
 | 
			
		||||
      subject
 | 
			
		||||
 | 
			
		||||
      expect(response).to have_http_status(:success)
 | 
			
		||||
      expect(response.content_type).to start_with('application/json')
 | 
			
		||||
      expect(response.parsed_body).to include({
 | 
			
		||||
        iss: root_url,
 | 
			
		||||
        sub: account_url(account),
 | 
			
		||||
        name: account.display_name,
 | 
			
		||||
        preferred_username: account.username,
 | 
			
		||||
        profile: short_account_url(account),
 | 
			
		||||
        picture: full_asset_url(account.avatar_original_url),
 | 
			
		||||
      })
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'GET /oauth/userinfo' do
 | 
			
		||||
    subject do
 | 
			
		||||
      get '/oauth/userinfo', headers: headers
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it_behaves_like 'forbidden for wrong scope', 'read:accounts'
 | 
			
		||||
    it_behaves_like 'returns successfully'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # As this is borrowed from OpenID, the specification says we must also support
 | 
			
		||||
  # POST for the userinfo endpoint:
 | 
			
		||||
  # https://openid.net/specs/openid-connect-core-1_0.html#UserInfo
 | 
			
		||||
  describe 'POST /oauth/userinfo' do
 | 
			
		||||
    subject do
 | 
			
		||||
      post '/oauth/userinfo', headers: headers
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it_behaves_like 'forbidden for wrong scope', 'read:accounts'
 | 
			
		||||
    it_behaves_like 'returns successfully'
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -3,12 +3,6 @@
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe 'The /.well-known/oauth-authorization-server request' do
 | 
			
		||||
  let(:protocol) { ENV.fetch('LOCAL_HTTPS', true) ? :https : :http }
 | 
			
		||||
 | 
			
		||||
  before do
 | 
			
		||||
    host! Rails.configuration.x.local_domain
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it 'returns http success with valid JSON response' do
 | 
			
		||||
    get '/.well-known/oauth-authorization-server'
 | 
			
		||||
 | 
			
		||||
@@ -22,11 +16,12 @@ RSpec.describe 'The /.well-known/oauth-authorization-server request' do
 | 
			
		||||
    grant_types_supported << 'refresh_token' if Doorkeeper.configuration.refresh_token_enabled?
 | 
			
		||||
 | 
			
		||||
    expect(response.parsed_body).to include(
 | 
			
		||||
      issuer: root_url(protocol: protocol),
 | 
			
		||||
      issuer: root_url,
 | 
			
		||||
      service_documentation: 'https://docs.joinmastodon.org/',
 | 
			
		||||
      authorization_endpoint: oauth_authorization_url(protocol: protocol),
 | 
			
		||||
      token_endpoint: oauth_token_url(protocol: protocol),
 | 
			
		||||
      revocation_endpoint: oauth_revoke_url(protocol: protocol),
 | 
			
		||||
      authorization_endpoint: oauth_authorization_url,
 | 
			
		||||
      token_endpoint: oauth_token_url,
 | 
			
		||||
      userinfo_endpoint: oauth_userinfo_url,
 | 
			
		||||
      revocation_endpoint: oauth_revoke_url,
 | 
			
		||||
      scopes_supported: Doorkeeper.configuration.scopes.map(&:to_s),
 | 
			
		||||
      response_types_supported: Doorkeeper.configuration.authorization_response_types,
 | 
			
		||||
      response_modes_supported: Doorkeeper.configuration.authorization_response_flows.flat_map(&:response_mode_matches).uniq,
 | 
			
		||||
@@ -34,7 +29,7 @@ RSpec.describe 'The /.well-known/oauth-authorization-server request' do
 | 
			
		||||
      grant_types_supported: grant_types_supported,
 | 
			
		||||
      code_challenge_methods_supported: ['S256'],
 | 
			
		||||
      # non-standard extension:
 | 
			
		||||
      app_registration_endpoint: api_v1_apps_url(protocol: protocol)
 | 
			
		||||
      app_registration_endpoint: api_v1_apps_url
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user