Ver Fonte

儲存token value

zooey há 1 ano atrás
pai
commit
29cbba0dab
2 ficheiros alterados com 33 adições e 8 exclusões
  1. 21 8
      app/api/users.py
  2. 12 0
      app/models/models.py

+ 21 - 8
app/api/users.py

@@ -1,6 +1,6 @@
 from fastapi import APIRouter, Form, Depends, HTTPException, Body
 from fastapi.security import OAuth2PasswordRequestForm, OAuth2PasswordBearer
-from app.models.models import User
+from app.models.models import User, UserPydantic
 from app.api import deps
 from sqlalchemy.orm import Session
 from typing import Any, Dict, Optional
@@ -15,6 +15,8 @@ import emails
 from emails.template import JinjaTemplate
 import logging
 import bcrypt
+
+from app.crud import crud_users
 import smtplib
 from email.mime.text import MIMEText
 from google.oauth2 import id_token
@@ -38,6 +40,7 @@ async def query_user(user_id: str):
     :return: None or the user object
     """
     result = await User.filter(email=user_id,is_gmail=0).first()
+
     if not result:
         print('無此筆資料')
         return None
@@ -60,15 +63,18 @@ async def query_user_username(user_id: str):
 
 
 @users.post("/login")
-async def login(data: OAuth2PasswordRequestForm = Depends()):
+async def login(data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(deps.get_db)):
+
     email = data.username
     password = data.password
 
     user = await query_user(email)
-    print(user)
+    user_pydantic = UserPydantic.from_orm(user)
+    user_dict = user_pydantic.dict(exclude_unset=True)
     access_token = manager.create_access_token(
         data={'sub': email}
     )
+
     if not user:
         # you can return any response or error of your choice
         return {"message":"查無此人"}
@@ -76,6 +82,9 @@ async def login(data: OAuth2PasswordRequestForm = Depends()):
     # elif password != user.password:
     #     raise InvalidCredentialsException
     else:
+        user_dict.update({"token":access_token})
+        token_update = user.update_from_dict(user_dict)
+        await user.save()
         stored_hashed_password = user.password.encode('utf-8')
         if bcrypt.checkpw(password.encode('utf-8'),stored_hashed_password):
             return {'msg':'登入成功','code':'200','access_token': access_token,'username':user.username,'email':user.email,'points':user.points}
@@ -91,17 +100,21 @@ async def login(username: str = Form(default=''), password: str = Form(default='
     """
     OAuth2 compatible token login, get an access token for future requests
     """
-
+    access_token = manager.create_access_token(
+        data={'sub': username}
+    )
     user = await User.filter(email=email,is_gmail=1).first() # 確認信箱是否已存在
     if not user:
-        u = await User.create(username=username, password=password, email=email, is_gmail=1)
+        u = await User.create(username=username, password=password, email=email, is_gmail=1,token=access_token)
     # if user:
     #     print('已用相同信箱註冊過,再開一個GMAIL帳號')
     #     u = await User.create(username=username, password=password,email=email,is_gmail=1)
+    user_pydantic = UserPydantic.from_orm(user)
+    user_dict = user_pydantic.dict(exclude_unset=True)
+    user_dict.update({"token": access_token})
+    token_update = user.update_from_dict(user_dict)
+    await user.save()
 
-    access_token = manager.create_access_token(
-        data={'sub': username}
-    )
     return_msg = {
         "access_token": access_token,
         "token_type": "bearer",

+ 12 - 0
app/models/models.py

@@ -10,7 +10,19 @@ class User(Model):
     points = fields.IntField(description="點數")
     is_superuser = fields.IntField(description="超級使用者")
     is_gmail = fields.IntField(description="是否使用gmail登入")
+    token = fields.CharField(max_length=200)
 
+class UserPydantic(BaseModel):
+    id: int
+    username: str
+    password: str
+    email: str
+    points: int
+    is_superuser: int
+    is_gmail: int
+    token: str
+    class Config:
+        orm_mode = True
 #學校
 class Schools(Model):
     id = fields.IntField(pk=True)