完成部分Github登录回调
This commit is contained in:
5
service/__init__.py
Normal file
5
service/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""
|
||||
服务层
|
||||
"""
|
||||
|
||||
from .user import login
|
||||
79
service/oauth/github.py
Normal file
79
service/oauth/github.py
Normal file
@@ -0,0 +1,79 @@
|
||||
from pydantic import BaseModel
|
||||
import aiohttp
|
||||
|
||||
class GithubAccessToken(BaseModel):
|
||||
access_token: str
|
||||
token_type: str
|
||||
scope: str
|
||||
|
||||
class GithubUserData(BaseModel):
|
||||
login: str
|
||||
id: int
|
||||
node_id: str
|
||||
avatar_url: str
|
||||
gravatar_id: str | None
|
||||
url: str
|
||||
html_url: str
|
||||
followers_url: str
|
||||
following_url: str
|
||||
gists_url: str
|
||||
starred_url: str
|
||||
subscriptions_url: str
|
||||
organizations_url: str
|
||||
repos_url: str
|
||||
events_url: str
|
||||
received_events_url: str
|
||||
type: str
|
||||
site_admin: bool
|
||||
name: str | None
|
||||
company: str | None
|
||||
blog: str | None
|
||||
location: str | None
|
||||
email: str | None
|
||||
hireable: bool | None
|
||||
bio: str | None
|
||||
twitter_username: str | None
|
||||
public_repos: int
|
||||
public_gists: int
|
||||
followers: int
|
||||
following: int
|
||||
created_at: str # ISO 8601 format date-time string
|
||||
updated_at: str # ISO 8601 format date-time string
|
||||
|
||||
class GithubUserInfoResponse(BaseModel):
|
||||
code: str
|
||||
user_data: GithubUserData
|
||||
|
||||
async def get_access_token(code: str) -> GithubAccessToken:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(
|
||||
url='https://github.com/login/oauth/access_token',
|
||||
params={
|
||||
'client_id': '',
|
||||
'client_secret': '',
|
||||
'code': code
|
||||
},
|
||||
headers={'accept': 'application/json'},
|
||||
proxy='socks5://127.0.0.1:7890'
|
||||
) as access_resp:
|
||||
access_data = await access_resp.json()
|
||||
return GithubAccessToken(
|
||||
access_token=access_data.get('access_token'),
|
||||
token_type=access_data.get('token_type'),
|
||||
scope=access_data.get('scope')
|
||||
)
|
||||
|
||||
async def get_user_info(access_token: str | GithubAccessToken) -> GithubUserInfoResponse:
|
||||
if isinstance(access_token, GithubAccessToken):
|
||||
access_token = access_token.access_token
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(
|
||||
url='https://api.github.com/user',
|
||||
headers={
|
||||
'accept': 'application/json',
|
||||
'Authorization': f'token {access_token}'},
|
||||
proxy='socks5://127.0.0.1:7890'
|
||||
) as resp:
|
||||
user_data = await resp.json()
|
||||
return GithubUserInfoResponse(**user_data)
|
||||
1
service/user/__init__.py
Normal file
1
service/user/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .login import Login
|
||||
@@ -1,11 +1,14 @@
|
||||
from typing import Optional
|
||||
from models.setting import Setting
|
||||
from models.response import TokenModel
|
||||
from models.user import User
|
||||
from pkg.log import log
|
||||
|
||||
async def login(
|
||||
async def Login(
|
||||
username: str,
|
||||
password: str
|
||||
password: str,
|
||||
captcha: Optional[str] = None,
|
||||
twoFaCode: Optional[str] = None
|
||||
) -> TokenModel | int | None:
|
||||
"""
|
||||
根据账号密码进行登录。
|
||||
@@ -18,6 +21,10 @@ async def login(
|
||||
:type username: str
|
||||
:param password: 用户密码
|
||||
:type password: str
|
||||
:param captcha: 验证码
|
||||
:type captcha: Optional[str]
|
||||
:param twoFaCode: 二次验证代码
|
||||
:type twoFaCode: Optional[str]
|
||||
|
||||
:return: TokenModel 对象或状态码或 None
|
||||
:rtype: TokenModel | int | None
|
||||
|
||||
Reference in New Issue
Block a user