import base64 import json from flask import url_for from jose import jwt from auth_api.users import current_user TEST_AUTH0_BEARER_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRlc3QifQ.eyJpc3MiOiJodHRwczovL2F1dGgwLnRlc3QvIiwic3ViIjoiYXV0aDB8MTIzNDU2IiwiYXVkIjpbIm15LWFwaS1pZGVudGlmaWVyIiwiaHR0cHM6Ly9hdXRoMC50ZXN0L3VzZXJpbmZvIl0sImF6cCI6IllPVVJfQ0xJRU5UX0lEIiwiZXhwIjoxNDg5MTc5OTU0LCJpYXQiOjE0ODkxNDM5NTQsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgYWRkcmVzcyBwaG9uZSByZWFkOmFwcG9pbnRtZW50cyJ9.koqi4N61AdqMtjWQTGK14o9C7QdFY8lECMPdJKqt1JQ" # noqa TEST_AUTH_M2M_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlJFWXdRMFEzTjBWRk1URTVOVFEwUlRkRVJFUkRNVFZDUkRGQk9ERTFRell5TnpZek5FWXdPUSJ9.eyJpc3MiOiJodHRwczovL3NtZS1kbmEuYXV0aDAuY29tLyIsInN1YiI6Ik1zSzdlTWFoa0xobTg2ZkhnTzQyemtVU01DNUtVbkJMQGNsaWVudHMiLCJhdWQiOiJodHRwczovL3NtZS1kbmEuYXV0aDAuY29tL2FwaS92Mi8iLCJpYXQiOjE2NzAzNTM4MjAsImV4cCI6MTY3MDM1NTAyMCwiYXpwIjoiTXNLN2VNYWhrTGhtODZmSGdPNDJ6a1VTTUM1S1VuQkwiLCJzY29wZSI6InJlYWQ6Y2xpZW50X2dyYW50cyBjcmVhdGU6Y2xpZW50X2dyYW50cyBkZWxldGU6Y2xpZW50X2dyYW50cyB1cGRhdGU6Y2xpZW50X2dyYW50cyByZWFkOnVzZXJzIHVwZGF0ZTp1c2VycyBkZWxldGU6dXNlcnMgY3JlYXRlOnVzZXJzIHJlYWQ6dXNlcnNfYXBwX21ldGFkYXRhIHVwZGF0ZTp1c2Vyc19hcHBfbWV0YWRhdGEgZGVsZXRlOnVzZXJzX2FwcF9tZXRhZGF0YSBjcmVhdGU6dXNlcnNfYXBwX21ldGFkYXRhIGNyZWF0ZTp1c2VyX3RpY2tldHMgcmVhZDpjbGllbnRzIHVwZGF0ZTpjbGllbnRzIGRlbGV0ZTpjbGllbnRzIGNyZWF0ZTpjbGllbnRzIHJlYWQ6Y2xpZW50X2tleXMgdXBkYXRlOmNsaWVudF9rZXlzIGRlbGV0ZTpjbGllbnRfa2V5cyBjcmVhdGU6Y2xpZW50X2tleXMgcmVhZDpjb25uZWN0aW9ucyB1cGRhdGU6Y29ubmVjdGlvbnMgZGVsZXRlOmNvbm5lY3Rpb25zIGNyZWF0ZTpjb25uZWN0aW9ucyByZWFkOnJlc291cmNlX3NlcnZlcnMgdXBkYXRlOnJlc291cmNlX3NlcnZlcnMgZGVsZXRlOnJlc291cmNlX3NlcnZlcnMgY3JlYXRlOnJlc291cmNlX3NlcnZlcnMgcmVhZDpkZXZpY2VfY3JlZGVudGlhbHMgdXBkYXRlOmRldmljZV9jcmVkZW50aWFscyBkZWxldGU6ZGV2aWNlX2NyZWRlbnRpYWxzIGNyZWF0ZTpkZXZpY2VfY3JlZGVudGlhbHMgcmVhZDpydWxlcyB1cGRhdGU6cnVsZXMgZGVsZXRlOnJ1bGVzIGNyZWF0ZTpydWxlcyByZWFkOnJ1bGVzX2NvbmZpZ3MgdXBkYXRlOnJ1bGVzX2NvbmZpZ3MgZGVsZXRlOnJ1bGVzX2NvbmZpZ3MgcmVhZDplbWFpbF9wcm92aWRlciB1cGRhdGU6ZW1haWxfcHJvdmlkZXIgZGVsZXRlOmVtYWlsX3Byb3ZpZGVyIGNyZWF0ZTplbWFpbF9wcm92aWRlciBibGFja2xpc3Q6dG9rZW5zIHJlYWQ6c3RhdHMgcmVhZDp0ZW5hbnRfc2V0dGluZ3MgdXBkYXRlOnRlbmFudF9zZXR0aW5ncyByZWFkOmxvZ3MgcmVhZDpzaGllbGRzIGNyZWF0ZTpzaGllbGRzIGRlbGV0ZTpzaGllbGRzIHJlYWQ6YW5vbWFseV9ibG9ja3MgZGVsZXRlOmFub21hbHlfYmxvY2tzIHVwZGF0ZTp0cmlnZ2VycyByZWFkOnRyaWdnZXJzIHJlYWQ6Z3JhbnRzIGRlbGV0ZTpncmFudHMgcmVhZDpndWFyZGlhbl9mYWN0b3JzIHVwZGF0ZTpndWFyZGlhbl9mYWN0b3JzIHJlYWQ6Z3VhcmRpYW5fZW5yb2xsbWVudHMgZGVsZXRlOmd1YXJkaWFuX2Vucm9sbG1lbnRzIGNyZWF0ZTpndWFyZGlhbl9lbnJvbGxtZW50X3RpY2tldHMgcmVhZDp1c2VyX2lkcF90b2tlbnMgY3JlYXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgZGVsZXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgcmVhZDpjdXN0b21fZG9tYWlucyBkZWxldGU6Y3VzdG9tX2RvbWFpbnMgY3JlYXRlOmN1c3RvbV9kb21haW5zIHJlYWQ6ZW1haWxfdGVtcGxhdGVzIGNyZWF0ZTplbWFpbF90ZW1wbGF0ZXMgdXBkYXRlOmVtYWlsX3RlbXBsYXRlcyByZWFkOm1mYV9wb2xpY2llcyB1cGRhdGU6bWZhX3BvbGljaWVzIHJlYWQ6cm9sZXMgY3JlYXRlOnJvbGVzIGRlbGV0ZTpyb2xlcyB1cGRhdGU6cm9sZXMgcmVhZDpwcm9tcHRzIHVwZGF0ZTpwcm9tcHRzIHJlYWQ6YnJhbmRpbmcgdXBkYXRlOmJyYW5kaW5nIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.Pod5HTeXu4EEX2vPIC3mJL9DuA5EKLQJewyhTw9Z" # noqa def test_auth_failure_bad_auth_params(client, app, mocker): res = client.get(url_for("authorize")) assert res.status_code == 401 mocked_get_keys = mocker.patch("auth_api.providers.auth0.Auth0AuthProvider.get_keys") mocked_get_keys.return_value = [{"kid": "test"}] res = client.get(url_for("authorize"), headers={"Authorization": f"Bearer {TEST_AUTH0_BEARER_TOKEN}"}) assert res.status_code == 401 def test_auth_header_success(client, mocker): test_payload = jwt.get_unverified_claims(TEST_AUTH0_BEARER_TOKEN) mocked_decode = mocker.patch.object(jwt, "decode") mocked_decode.return_value = test_payload mocked_get_keys = mocker.patch("auth_api.providers.auth0.Auth0AuthProvider.get_keys") mocked_get_keys.return_value = [{"kid": "test"}] res = client.get(url_for("authorize"), headers={"Authorization": f"Bearer {TEST_AUTH0_BEARER_TOKEN}"}) assert res.status_code == 200 assert res.headers.get("X-User-Id") == test_payload.get("sub").split("|")[-1] assert res.headers.get("X-Client-Id") == test_payload.get("sub") assert current_user.user_info == test_payload assert res.headers.get("X-User-Id") == current_user.user_id assert json.loads(base64.urlsafe_b64decode(res.headers.get("X-Userinfo") + "==")) == current_user.user_info assert current_user.user_id == test_payload.get("sub").split("|")[-1] assert current_user.client_id == test_payload.get("sub") assert not current_user.is_m2m def test_auth_m2m_success(client, mocker, app): mocked_get_key = mocker.patch("auth_api.providers.auth0.Auth0AuthProvider.get_keys") mocked_get_key.return_value = [{"kid": "REYwQ0Q3N0VFMTE5NTQ0RTdERERDMTVCRDFBODE1QzYyNzYzNEYwOQ"}] test_payload = jwt.get_unverified_claims(TEST_AUTH_M2M_TOKEN) mocked_decode = mocker.patch.object(jwt, "decode") mocked_decode.return_value = test_payload.copy() res = client.get(url_for("authorize"), headers={"Authorization": f"Bearer {TEST_AUTH_M2M_TOKEN}"}) assert res.status_code == 200 assert res.headers.get("X-User-Id") is None assert res.headers.get("X-Client-Id") == test_payload.get("sub") assert current_user.user_id is None assert current_user.is_m2m assert current_user.client_id == test_payload.get("sub")