{"id":97,"library":"supabase","title":"Supabase Auth (Python)","description":"Official Supabase Python client. Current version is 2.28.2 (Mar 2026). Auth is accessed via supabase.auth — not a separate install. The underlying auth library was renamed twice: gotrue-py → auth-py → supabase-auth. The standalone package is 'supabase-auth' (imports as 'supabase_auth'). Most auth is used through the main 'supabase' package via create_client(). Massive tutorial corpus uses the old sign_in() method removed in favor of sign_in_with_password().","status":"active","version":"2.28.2","language":"python","source_language":"en","source_url":"https://github.com/supabase/supabase-py","tags":["supabase","authentication","jwt","postgres","auth","python","gotrue"],"install":[{"cmd":"pip install supabase","lang":"bash","label":"Python (full client — includes auth)"},{"cmd":"pip install supabase-auth","lang":"bash","label":"Python (standalone auth client only)"}],"dependencies":[{"reason":"HTTP client. Auto-installed.","package":"httpx","optional":false},{"reason":"Response models. Auto-installed.","package":"pydantic","optional":false}],"imports":[{"note":"gotrue-py was the old package name, now supabase-auth. 'from gotrue import' raises ModuleNotFoundError unless gotrue is still separately installed. Use the main supabase client for all auth operations in most cases.","wrong":"from gotrue import SyncGoTrueClient","symbol":"create_client","correct":"from supabase import create_client, Client"},{"note":"Package was renamed from gotrue-py to supabase-auth. The class name SyncGoTrueClient is preserved but the import path changed.","wrong":"from gotrue import SyncGoTrueClient","symbol":"SyncGoTrueClient","correct":"from supabase_auth import SyncGoTrueClient"}],"quickstart":{"code":"import os\nfrom supabase import create_client, Client\n\nurl: str = os.environ['SUPABASE_URL']\nkey: str = os.environ['SUPABASE_KEY']  # anon key for client-side, service_role for admin\nsupabase: Client = create_client(url, key)\n\n# Sign up\nres = supabase.auth.sign_up({\n    'email': 'user@example.com',\n    'password': 'securepassword'\n})\n\n# Sign in — NOT sign_in(), use sign_in_with_password()\nres = supabase.auth.sign_in_with_password({\n    'email': 'user@example.com',\n    'password': 'securepassword'\n})\nprint(res.user)\nprint(res.session.access_token)\n\n# Admin operations — requires service_role key\nres = supabase.auth.admin.list_users()\nfor user in res:\n    print(user.email)","lang":"python","description":"Client initialization and auth operations using supabase v2.x."},"warnings":[{"fix":"Replace supabase.auth.sign_in({'email': ..., 'password': ...}) with supabase.auth.sign_in_with_password({'email': ..., 'password': ...})","message":"supabase.auth.sign_in() is removed. All pre-2.0 tutorials use sign_in(). The correct method is sign_in_with_password(). Calling sign_in() raises AttributeError.","severity":"breaking","affected_versions":"< 2.0"},{"fix":"Replace 'from gotrue import' with 'from supabase_auth import'. Or just use the main supabase package which bundles auth.","message":"The standalone auth package was named 'gotrue' (pip install gotrue), then renamed to 'supabase-auth'. 'from gotrue import' raises ModuleNotFoundError if only supabase-auth is installed.","severity":"breaking","affected_versions":"all"},{"fix":"For admin ops: create_client(url, os.environ['SUPABASE_SERVICE_ROLE_KEY']). Never expose service_role key to the client/browser.","message":"Admin auth methods (list_users, create_user, delete_user) require the service_role key, NOT the anon key. Using the anon key returns 403. The distinction is not obvious — both keys look identical in format.","severity":"breaking","affected_versions":"all"},{"fix":"Check: if res.session is not None before accessing access_token. Or disable email confirmation in Supabase dashboard for dev environments.","message":"sign_up() returns (user, session) where session is None if email confirmation is enabled (the default). Code that immediately uses res.session.access_token will raise AttributeError: 'NoneType' object has no attribute 'access_token'.","severity":"breaking","affected_versions":"all"},{"fix":"Use acreate_client() for any code that needs realtime. sync create_client() is for REST/auth only.","message":"Realtime subscriptions only work with the async client (acreate_client). The sync client silently ignores realtime calls or raises errors.","severity":"breaking","affected_versions":"all"},{"fix":"Use anon key (SUPABASE_ANON_KEY) for client operations. Use service_role key only in server-side admin contexts.","message":"SUPABASE_KEY should be the anon key for user-facing operations. The service_role key bypasses Row Level Security entirely — accidental use in client-side code exposes all data.","severity":"gotcha","affected_versions":"all"},{"fix":"Use .range(start, end) for pagination or increase the limit in Supabase project API settings.","message":"Default row limit is 1000 rows. Queries that return more than 1000 rows are silently truncated with no error. Agents building data pipelines hit this constantly.","severity":"gotcha","affected_versions":"all"},{"fix":"Maintain two client instances: one with anon key for user operations, one with service_role key for admin operations.","message":"supabase.auth.admin is only accessible when the client was initialized with the service_role key. Calling admin methods with the anon key returns 403 with 'not authorized' — not a clear 'wrong key' error.","severity":"gotcha","affected_versions":"all"},{"fix":"Ensure `SUPABASE_URL` and `SUPABASE_ANON_KEY` (and `SUPABASE_SERVICE_ROLE_KEY` if performing admin operations) are set as environment variables. Alternatively, pass the URL and key values directly to `create_client()`.","message":"The Supabase client requires configuration values such as `SUPABASE_URL` and `SUPABASE_ANON_KEY` (or `SUPABASE_SERVICE_ROLE_KEY` for admin operations). If these are accessed via `os.environ` and not set, a `KeyError` will occur during client initialization.","severity":"breaking","affected_versions":"all"},{"fix":"Ensure SUPABASE_URL and SUPABASE_KEY (or SUPABASE_ANON_KEY) environment variables are set before initializing the Supabase client.","message":"The Supabase client typically requires SUPABASE_URL and SUPABASE_KEY (or SUPABASE_ANON_KEY) environment variables for initialization. Missing these will result in KeyError if accessed via os.environ.","severity":"breaking","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-12T08:05:25.124Z","next_check":"2026-06-17T00:00:00.000Z","problems":[{"fix":"client.auth.sign_in_with_password(email=\"user@example.com\", password=\"your_password\")","cause":"The `sign_in()` method for user authentication was deprecated and removed in favor of `sign_in_with_password()`.","error":"AttributeError: 'AuthApi' object has no attribute 'sign_in'"},{"fix":"import os\nfrom supabase import create_client\nsupabase_url = os.environ.get(\"SUPABASE_URL\")\nsupabase_key = os.environ.get(\"SUPABASE_KEY\")\nsupabase = create_client(supabase_url, supabase_key)","cause":"The `create_client` function requires both the Supabase project URL and the Anon (or Service Role) Key to be explicitly provided.","error":"TypeError: create_client() missing 2 required positional arguments: 'supabase_url' and 'supabase_key'"},{"fix":"Examine the specific error message that follows `PostgrestAPIError` in the traceback to diagnose the issue; common solutions include verifying table/column names, checking data types, ensuring unique constraints, or reviewing Row Level Security (RLS) policies in your Supabase project.","cause":"A database operation (e.g., insert, select, update) failed due to a backend issue such as an invalid table name, a constraint violation, or insufficient permissions.","error":"PostgrestAPIError"},{"fix":"Remove `import gotrue` or `from gotrue.sync import AuthClient`. Instead, use `from supabase import create_client` and access authentication via `supabase_client.auth`. If a standalone auth client is required, install `supabase-auth` and import `supabase_auth`.","cause":"This error occurs when old tutorials or code attempt to import the deprecated `gotrue-py` library, which has been renamed and is now primarily accessed via the main `supabase` client's `auth` attribute.","error":"ModuleNotFoundError: No module named 'gotrue'"}],"ecosystem":"pypi","meta_description":null,"install_score":95,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.91,"mem_mb":39.7,"disk_size":"106.4M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.1,"mem_mb":39.7,"disk_size":"113M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":3.67,"mem_mb":42.9,"disk_size":"117.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":3.13,"mem_mb":42.9,"disk_size":"124M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":3.41,"mem_mb":42.1,"disk_size":"107.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":3.38,"mem_mb":42.1,"disk_size":"114M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":3.25,"mem_mb":43.7,"disk_size":"107.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":3.35,"mem_mb":43.7,"disk_size":"114M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.53,"mem_mb":39.4,"disk_size":"92.4M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.24,"mem_mb":39.4,"disk_size":"91M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null}]},"quickstart_checks":{"last_tested":"2026-05-12","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}