async def completeDiscordTokenLogin(cls: "WebIndex", WebRequest: Request, data: dict) -> Response: session_key: str = randomString(size=32) access_token: str = data.get('access_token', "") refresh_token: str = data.get('refresh_token', "") scope: str = data.get('scope', "") token_type: str = data.get('token_type', None) user_info: dict = await getDiscordUser(cls.Web.BASE, access_token) try: cls.Web.BASE.PhaazeDB.insertQuery(table="session_discord", content=dict( session=session_key, access_token=access_token, refresh_token=refresh_token, scope=scope, token_type=token_type, user_info=json.dumps(user_info))) cls.Web.BASE.Logger.debug( f"(API) New Discord Login - Session: {session_key} User: {str(user_info.get('username','[N/A]'))}", require="api:login") return cls.response( status=302, headers={ "Set-Cookie": f"phaaze_discord_session={session_key}; Path=/; Max-Age={SESSION_EXPIRE};", "Location": "/discord" }) except Exception as e: tb: str = traceback.format_exc() cls.Web.BASE.Logger.error(f"(API) Database error: {str(e)}\n{tb}") return cls.response( status=302, headers={"Location": "/discord/login?error=database"})
def generateTwitchAuthLink(cls: "Phaazebot") -> str: """ used to create a link, that leads the user to twitch, where he authorizes our request. and is then send back to us, where he should have a ?code=123123 in his query """ auth_url: str = f"{AUTH_URL}oauth2/authorize" auth_params: dict = { "client_id": cls.Access.twitch_client_id, "redirect_uri": cls.Vars.twitch_redirect_link, "response_type": "code", "force_verify": "true", "state": randomString(32), "scope": "user:read:email channel:read:subscriptions channel:read:redemptions bits:read" } Target: requests.Request = requests.Request(url=auth_url, params=auth_params) Prep: requests.PreparedRequest = Target.prepare() return Prep.url
async def completeTwitchTokenLogin(cls: "PhaazebotWeb", _WebRequest: ExtendedRequest, data: dict) -> Response: """ inserts all necessary data into the session_twitch database """ session_key: str = randomString(size=32) access_token: str = data.get("access_token", "") refresh_token: str = data.get("refresh_token", "") scope: str = ' '.join(data.get("scope", [])) token_type: str = data.get('token_type', "") user_res: List[TwitchUser] = await getTwitchUsers(cls.BASE, access_token, item_type="token") TwitchAuthUser: TwitchUser = user_res.pop(0) if len(user_res) > 0 else None if not TwitchAuthUser or not TwitchAuthUser.extended: cls.BASE.Logger.warning("(API) Twitch user login failed") return cls.response(status=302, headers={"Location": "/twitch/login?error=user"}) try: cls.BASE.PhaazeDB.insertQuery(table="session_twitch", content=dict(session=session_key, access_token=access_token, refresh_token=refresh_token, scope=scope, token_type=token_type, user_info=json.dumps( TwitchAuthUser.toJSON( types=True, images=True, with_email=True)))) cls.BASE.Logger.debug( f"(API) New Twitch Login - Session: {session_key} User: {TwitchAuthUser.login}", require="api:login") return cls.response( status=302, headers={ "Set-Cookie": f"phaaze_twitch_session={session_key}; Path=/; Max-Age={SESSION_EXPIRE};", "Location": "/twitch" }) except Exception as e: tb: str = traceback.format_exc() cls.BASE.Logger.error(f"(API) Database error: {str(e)}\n{tb}") return cls.response( status=302, headers={"Location": "/twitch/login?error=database"})
async def completeDiscordTokenLogin(cls: "PhaazebotWeb", _WebRequest: ExtendedRequest, data: dict) -> Response: """ inserts all necessary data into the session_discord database """ session_key: str = randomString(size=32) access_token: str = data.get('access_token', "") refresh_token: str = data.get('refresh_token', "") scope: str = data.get('scope', "") token_type: str = data.get('token_type', "") user_info: dict = await getDiscordUser(cls.BASE, access_token) # if the result has a message field, something went wrong if user_info.get("message", "---") != "---": cls.BASE.Logger.warning("(API) Discord user login failed") return cls.response(status=302, headers={"Location": "/discord/login?error=user"}) try: cls.BASE.PhaazeDB.insertQuery(table="session_discord", content=dict( session=session_key, access_token=access_token, refresh_token=refresh_token, scope=scope, token_type=token_type, user_info=json.dumps(user_info))) cls.BASE.Logger.debug( f"(API) New Discord Login - Session: {session_key} User: {str(user_info.get('username','[N/A]'))}", require="api:login") return cls.response( status=302, headers={ "Set-Cookie": f"phaaze_discord_session={session_key}; Path=/; Max-Age={SESSION_EXPIRE};", "Location": "/discord" }) except Exception as e: tb: str = traceback.format_exc() cls.BASE.Logger.error(f"(API) Database error: {str(e)}\n{tb}") return cls.response( status=302, headers={"Location": "/discord/login?error=database"})
async def apiAccountLoginPhaaze(cls: "PhaazebotWeb", WebRequest: ExtendedRequest) -> Response: """ Default url: /api/account/phaaze/login looks like all other WebUser pairs, except this time it should be a post request, leading new information to login, create session and give this to the user """ AuthWeb: AuthWebUser = await authWebUser(cls, WebRequest, force_method="viaPost") if not AuthWeb.tried: return await apiMissingData(cls, WebRequest) if not AuthWeb.found: return await apiUserNotFound(cls, WebRequest) session_key: str = randomString(size=32) cls.BASE.PhaazeDB.insertQuery(table="session_phaaze", content=dict(session=session_key, user_id=AuthWeb.User.user_id)) cls.BASE.PhaazeDB.query( """ UPDATE `web_user` SET `last_login` = NOW() WHERE `web_user`.`id` = %s""", (AuthWeb.User.user_id, )) cls.BASE.Logger.debug( f"(API) New Login - Session: {session_key} User: {str(AuthWeb.User.username)}", require="api:login") return cls.response(text=json.dumps( dict(phaaze_session=session_key, status=200, expires_in=str(SESSION_EXPIRE))), content_type="application/json", status=200)