File: //home/arjun/projects/aigenerator/venv/lib/python3.12/site-packages/social_core/backends/twitch.py
"""
Twitch OAuth2 backend, docs at:
https://python-social-auth.readthedocs.io/en/latest/backends/twitch.html
"""
from .oauth import BaseOAuth2
from .open_id_connect import OpenIdConnectAuth
class TwitchOpenIdConnect(OpenIdConnectAuth):
"""Twitch OpenID Connect authentication backend"""
name = "twitch"
USERNAME_KEY = "preferred_username"
OIDC_ENDPOINT = "https://id.twitch.tv/oauth2"
DEFAULT_SCOPE = ["openid", "user:read:email"]
TWITCH_CLAIMS = (
'{"id_token":{"email": null,"email_verified":null,"preferred_username":null}}'
)
def auth_params(self, state=None):
params = super().auth_params(state)
# Twitch uses a non-compliant OpenID implementation where the claims must be passed as a param
params["claims"] = self.TWITCH_CLAIMS
return params
def get_user_details(self, response):
return {
"username": self.id_token["preferred_username"],
"email": self.id_token["email"],
# Twitch does not provide this information
"fullname": "",
"first_name": "",
"last_name": "",
}
class TwitchOAuth2(BaseOAuth2):
"""Twitch OAuth authentication backend"""
name = "twitch"
ID_KEY = "_id"
AUTHORIZATION_URL = "https://id.twitch.tv/oauth2/authorize"
ACCESS_TOKEN_URL = "https://id.twitch.tv/oauth2/token"
ACCESS_TOKEN_METHOD = "POST"
DEFAULT_SCOPE = ["user:read:email"]
REDIRECT_STATE = False
def get_user_id(self, details, response):
"""
Use twitch user id as unique id
"""
return response.get("id")
def get_user_details(self, response):
return {
"username": response.get("login"),
"email": response.get("email"),
"first_name": "",
"last_name": "",
}
def user_data(self, access_token, *args, **kwargs):
client_id, _ = self.get_key_and_secret()
auth_headers = {
"Authorization": "Bearer %s" % access_token,
"Client-Id": client_id,
}
url = "https://api.twitch.tv/helix/users"
data = self.get_json(url, headers=auth_headers)
return data["data"][0] if data.get("data") else {}