mirror of https://github.com/yupix/mipac
parent
9b67359dda
commit
08a3629014
@ -1,119 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
import uuid
|
|
||||||
from urllib.parse import urlencode
|
|
||||||
|
|
||||||
import aiohttp
|
|
||||||
|
|
||||||
from mipac.utils.format import remove_dict_empty
|
|
||||||
|
|
||||||
|
|
||||||
class AuthClient:
|
|
||||||
"""
|
|
||||||
Tokenの取得を手助けするクラス
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
instance_uri: str,
|
|
||||||
name: str,
|
|
||||||
description: str,
|
|
||||||
permissions: list[str] | None = None,
|
|
||||||
*,
|
|
||||||
icon: str | None = None,
|
|
||||||
use_miauth: bool = False,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
instance_uri : str
|
|
||||||
アプリケーションを作成したいインスタンスのURL
|
|
||||||
name : str
|
|
||||||
アプリケーションの名前
|
|
||||||
description : str
|
|
||||||
アプリケーションの説明
|
|
||||||
permissions : Optional[list[str]], default=None
|
|
||||||
アプリケーションが要求する権限
|
|
||||||
icon: str | None, default=None
|
|
||||||
アプリケーションのアイコン画像URL
|
|
||||||
use_miauth: bool, default=False
|
|
||||||
MiAuthを使用するか
|
|
||||||
"""
|
|
||||||
if permissions is None:
|
|
||||||
permissions = ["read:account"]
|
|
||||||
self.__client_session = aiohttp.ClientSession()
|
|
||||||
self.__instance_uri: str = instance_uri
|
|
||||||
self.__name: str = name
|
|
||||||
self.__description: str = description
|
|
||||||
self.__permissions: list[str] = permissions
|
|
||||||
self.__icon: str | None = icon
|
|
||||||
self.__use_miauth: bool = use_miauth
|
|
||||||
self.__session_token: uuid.UUID
|
|
||||||
self.__secret: str
|
|
||||||
|
|
||||||
async def get_auth_url(self) -> str:
|
|
||||||
"""
|
|
||||||
認証に使用するURLを取得します
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
str
|
|
||||||
認証に使用するURL
|
|
||||||
"""
|
|
||||||
field = remove_dict_empty(
|
|
||||||
{"name": self.__name, "description": self.__description, "icon": self.__icon}
|
|
||||||
)
|
|
||||||
if self.__use_miauth:
|
|
||||||
field["permissions"] = self.__permissions
|
|
||||||
query = urlencode(field)
|
|
||||||
self.__session_token = uuid.uuid4()
|
|
||||||
return f"{self.__instance_uri}/miauth/{self.__session_token}?{query}"
|
|
||||||
else:
|
|
||||||
field["permission"] = self.__permissions
|
|
||||||
async with self.__client_session.post(
|
|
||||||
f"{self.__instance_uri}/api/app/create", json=field
|
|
||||||
) as res:
|
|
||||||
data = await res.json()
|
|
||||||
self.__secret = data["secret"]
|
|
||||||
async with self.__client_session.post(
|
|
||||||
f"{self.__instance_uri}/api/auth/session/generate",
|
|
||||||
json={"appSecret": self.__secret},
|
|
||||||
) as res:
|
|
||||||
data = await res.json()
|
|
||||||
self.__session_token = data["token"]
|
|
||||||
return data["url"]
|
|
||||||
|
|
||||||
async def wait_miauth(self) -> str:
|
|
||||||
url = f"{self.__instance_uri}/api/miauth/{self.__session_token}/check"
|
|
||||||
while True:
|
|
||||||
async with self.__client_session.post(url) as res:
|
|
||||||
data = await res.json()
|
|
||||||
if data.get("ok") is True:
|
|
||||||
return data
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
|
|
||||||
async def wait_oldauth(self) -> None:
|
|
||||||
while True:
|
|
||||||
async with self.__client_session.post(
|
|
||||||
f"{self.__instance_uri}/api/auth/session/userkey",
|
|
||||||
json={"appSecret": self.__secret, "token": self.__session_token},
|
|
||||||
) as res:
|
|
||||||
data = await res.json()
|
|
||||||
if data.get("error", {}).get("code") != "PENDING_SESSION":
|
|
||||||
break
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
|
|
||||||
async def check_auth(self) -> str:
|
|
||||||
"""
|
|
||||||
認証が完了するまで待機し、完了した場合はTokenを返します
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
str
|
|
||||||
Token
|
|
||||||
"""
|
|
||||||
if self.__use_miauth:
|
|
||||||
data = await self.wait_miauth()
|
|
||||||
else:
|
|
||||||
data = await self.wait_oldauth()
|
|
||||||
await self.__client_session.close()
|
|
||||||
return data["token"] if self.__use_miauth else data["accessToken"]
|
|
Loading…
Reference in new issue