Skip to content
Snippets Groups Projects

Add DPoP checks in GraphQL and API requests

Merged Ameya Darshan requested to merge ameya-dpop-2 into master
All threads resolved!
2 files
+ 101
60
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -551,45 +551,67 @@
end
end
context 'when DPoP is disabled' do
let(:user) { create(:user, last_activity_on: last_activity_on) }
let(:personal_access_token) { create(:personal_access_token, user: user, scopes: [:api]) }
it 'does not check for DPoP token' do
post :execute, params: { access_token: personal_access_token.token }
expect(response).to have_gitlab_http_status(:ok)
end
end
describe 'DPoP authentication' do
context 'when :dpop_authentication FF is disabled' do
let(:user) { create(:user, last_activity_on: last_activity_on) }
let(:personal_access_token) { create(:personal_access_token, user: user, scopes: [:api]) }
context 'when DPoP is enabled' do
let_it_be(:user) { create(:user, last_activity_on: last_activity_on, dpop_enabled: true) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user, scopes: [:api]) }
let_it_be(:dpop_proof) { generate_dpop_proof_for(user) }
it 'does not check for DPoP token' do
stub_feature_flags(dpop_authentication: false)
context 'with a missing DPoP token' do
it 'returns 401' do
post :execute, params: { access_token: personal_access_token.token }
expect(response).to have_gitlab_http_status(:unauthorized)
expect(json_response["errors"][0]["message"]).to eq("DPoP validation error: DPoP header is missing")
expect(response).to have_gitlab_http_status(:ok)
end
end
context 'with a valid DPoP token' do
it 'returns 200' do
request.headers["dpop"] = dpop_proof.proof
post :execute, params: { access_token: personal_access_token.token }
expect(response).to have_gitlab_http_status(:ok)
context 'when :dpop_authentication FF is enabled' do
before do
stub_feature_flags(dpop_authentication: true)
end
end
context 'with a malformed DPoP token' do
it 'returns 401' do
request.headers["dpop"] = "invalid"
post :execute, params: { access_token: personal_access_token.token }
# rubocop:disable Layout/LineLength -- We need the entire error message
expect(json_response["errors"][0]["message"]).to eq("DPoP validation error: Malformed JWT, unable to decode. Not enough or too many segments")
# rubocop:enable Layout/LineLength
expect(response).to have_gitlab_http_status(:unauthorized)
context 'when DPoP is disabled for the user' do
let(:user) { create(:user, last_activity_on: last_activity_on) }
let(:personal_access_token) { create(:personal_access_token, user: user, scopes: [:api]) }
it 'does not check for DPoP token' do
stub_feature_flags(dpop_authentication: false)
post :execute, params: { access_token: personal_access_token.token }
expect(response).to have_gitlab_http_status(:ok)
end
end
context 'when DPoP is enabled for the user' do
let_it_be(:user) { create(:user, last_activity_on: last_activity_on, dpop_enabled: true) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user, scopes: [:api]) }
let_it_be(:dpop_proof) { generate_dpop_proof_for(user) }
context 'with a missing DPoP token' do
it 'returns 401' do
post :execute, params: { access_token: personal_access_token.token }
expect(response).to have_gitlab_http_status(:unauthorized)
expect(json_response["errors"][0]["message"]).to eq("DPoP validation error: DPoP header is missing")
end
end
context 'with a valid DPoP token' do
it 'returns 200' do
request.headers["dpop"] = dpop_proof.proof
post :execute, params: { access_token: personal_access_token.token }
expect(response).to have_gitlab_http_status(:ok)
end
end
context 'with a malformed DPoP token' do
it 'returns 401' do
request.headers["dpop"] = "invalid"
post :execute, params: { access_token: personal_access_token.token }
# rubocop:disable Layout/LineLength -- We need the entire error message
expect(json_response["errors"][0]["message"]).to eq("DPoP validation error: Malformed JWT, unable to decode. Not enough or too many segments")
# rubocop:enable Layout/LineLength
expect(response).to have_gitlab_http_status(:unauthorized)
end
end
end
end
end
Loading