Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
financial-system
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xianyang
financial-system
Commits
856a6109
Commit
856a6109
authored
Feb 10, 2023
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
用户登录、验证码获取、谷歌二维码、谷歌验证(修改第三次)————余晋熹
parent
226350cd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
48 additions
and
25 deletions
+48
-25
login_verification.py
app/api/users/login_verification.py
+18
-8
schemas.py
app/api/users/schemas.py
+2
-0
views.py
app/api/users/views.py
+15
-14
google_code.py
libs/google_code.py
+13
-3
No files found.
app/api/users/login_verification.py
View file @
856a6109
import
pyotp
from
jose
import
jwt
from
jose
import
jwt
from
sqlalchemy.orm
import
Session
from
sqlalchemy.orm
import
Session
from
typing
import
Optional
from
typing
import
Optional
from
datetime
import
timedelta
,
datetime
from
datetime
import
timedelta
,
datetime
from
app.api.users.schemas
import
UserLoginForm
from
app.api.users.schemas
import
UserLoginForm
,
GoogleLogin
from
libs.functions
import
md5
from
libs.functions
import
md5
from
libs.img_code
import
session
from
libs.img_code
import
session
from
models
import
users
as
users
from
models
import
users
as
users
...
@@ -61,19 +61,29 @@ def authenticate_user(db: Session, form_data: UserLoginForm):
...
@@ -61,19 +61,29 @@ def authenticate_user(db: Session, form_data: UserLoginForm):
if
form_data
.
verify
.
lower
()
!=
session
.
headers
.
get
(
"verify"
)
.
lower
():
if
form_data
.
verify
.
lower
()
!=
session
.
headers
.
get
(
"verify"
)
.
lower
():
return
{
"result"
:
False
,
"msg"
:
"验证码错误"
}
return
{
"result"
:
False
,
"msg"
:
"验证码错误"
}
if
user_data
.
google_key
:
if
user_data
.
google_key
:
return
{
"result"
:
True
,
"msg"
:
"验证通过"
,
"google_key"
:
1
}
return
{
"result"
:
True
,
"msg"
:
"验证通过"
,
"google_key"
:
"1"
}
else
:
else
:
return
{
"result"
:
True
,
"msg"
:
"验证通过"
,
"google_key"
:
0
}
return
{
"result"
:
True
,
"msg"
:
"验证通过"
,
"google_key"
:
"0"
}
def
add_google_key
(
db
:
Session
,
user
_id
:
int
):
def
add_google_key
(
db
:
Session
,
user
name
:
str
,
google_key
:
str
):
updata
=
{
updata
=
{
"google_key"
:
pyotp
.
random_base32
(
64
)
,
"google_key"
:
google_key
,
"update_time"
:
datetime
.
now
()
"update_time"
:
datetime
.
now
()
}
}
try
:
try
:
db
.
query
(
users
.
User
)
.
filter
(
users
.
User
.
id
==
user_id
)
.
update
(
updata
)
db
.
query
(
users
.
User
)
.
filter
(
users
.
User
.
username
==
username
)
.
update
(
updata
)
db
.
commit
()
db
.
commit
()
return
{
"result"
:
True
,
"google_key"
:
updata
.
get
(
"google_key"
)}
return
{
"result"
:
True
,
"google_key"
:
updata
.
get
(
"google_key"
)}
except
Exception
as
e
:
except
Exception
as
e
:
return
{
"result"
:
False
}
return
{
"result"
:
False
}
\ No newline at end of file
def
authenticate_pwd
(
db
:
Session
,
form_data
:
GoogleLogin
):
"""只验证密码"""
user_data
=
get_user
(
db
=
db
,
username
=
form_data
.
username
)
# 如果密码不正确,也是返回False
md5_password
=
md5
(
form_data
.
password
)
if
md5_password
!=
user_data
.
hashed_password
:
return
{
"result"
:
False
,
"msg"
:
"密码错误"
}
return
{
"result"
:
True
,
"msg"
:
"验证通过"
}
app/api/users/schemas.py
View file @
856a6109
...
@@ -30,4 +30,6 @@ class GoogleCode(BaseModel):
...
@@ -30,4 +30,6 @@ class GoogleCode(BaseModel):
class
GoogleLogin
(
BaseModel
):
class
GoogleLogin
(
BaseModel
):
username
:
str
username
:
str
password
:
str
google_key
:
str
google_code
:
str
google_code
:
str
app/api/users/views.py
View file @
856a6109
import
time
from
typing
import
List
from
typing
import
List
import
pyotp
from
fastapi
import
Depends
,
APIRouter
from
fastapi
import
Depends
,
APIRouter
from
datetime
import
timedelta
from
datetime
import
timedelta
from
sqlalchemy.orm
import
Session
from
sqlalchemy.orm
import
Session
from
app
import
get_db
from
app
import
get_db
from
app.api.users
import
crud
,
schemas
from
app.api.users
import
crud
,
schemas
from
app.api.users.login_verification
import
authenticate_user
,
create_access_token
,
get_user
,
a
dd_google_key
from
app.api.users.login_verification
import
authenticate_user
,
create_access_token
,
get_user
,
a
uthenticate_pwd
from
app.api.users.schemas
import
UserLoginForm
,
GoogleCode
,
GoogleLogin
from
app.api.users.schemas
import
UserLoginForm
,
GoogleCode
,
GoogleLogin
from
libs.google_code
import
get_qrcode
,
google_verify_result
from
libs.google_code
import
get_qrcode
,
google_verify_result
from
libs.img_code
import
imageCode
from
libs.img_code
import
imageCode
...
@@ -25,7 +28,7 @@ def imgCode():
...
@@ -25,7 +28,7 @@ def imgCode():
@
router
.
post
(
"/login"
)
@
router
.
post
(
"/login"
)
async
def
login
(
form_data
:
UserLoginForm
,
db
:
Session
=
Depends
(
get_db
)):
def
login
(
form_data
:
UserLoginForm
,
db
:
Session
=
Depends
(
get_db
)):
user_info
=
authenticate_user
(
db
=
db
,
form_data
=
form_data
)
user_info
=
authenticate_user
(
db
=
db
,
form_data
=
form_data
)
if
not
user_info
.
get
(
"result"
):
if
not
user_info
.
get
(
"result"
):
return
HttpResultResponse
(
code
=
500
,
msg
=
user_info
.
get
(
"msg"
),
data
=
{})
return
HttpResultResponse
(
code
=
500
,
msg
=
user_info
.
get
(
"msg"
),
data
=
{})
...
@@ -33,25 +36,23 @@ async def login(form_data: UserLoginForm, db: Session = Depends(get_db)):
...
@@ -33,25 +36,23 @@ async def login(form_data: UserLoginForm, db: Session = Depends(get_db)):
@
router
.
post
(
"/goodleCode"
)
@
router
.
post
(
"/goodleCode"
)
async
def
goodleCode
(
data
:
GoogleCode
,
db
:
Session
=
Depends
(
get_db
)):
def
goodleCode
(
data
:
GoogleCode
,
db
:
Session
=
Depends
(
get_db
)):
user_data
=
get_user
(
db
,
data
.
username
)
user_data
=
get_user
(
db
,
data
.
username
)
update_info
=
add_google_key
(
db
=
db
,
user_id
=
user_data
.
id
)
google_key
=
pyotp
.
random_base32
(
64
)
if
not
update_info
.
get
(
"result"
):
google_img
=
get_qrcode
(
username
=
user_data
.
username
,
gtoken
=
google_key
)
.
decode
(
'utf-8'
)
return
HttpResultResponse
(
code
=
500
,
msg
=
"谷歌二维码生成失败"
)
return
HttpResultResponse
(
data
=
{
"google_img"
:
google_img
,
"google_key"
:
google_key
})
return
get_qrcode
(
username
=
user_data
.
username
,
gtoken
=
update_info
.
get
(
"google_key"
))
@
router
.
post
(
"/googleLogin"
)
@
router
.
post
(
"/googleLogin"
)
async
def
googleLogin
(
data
:
GoogleLogin
,
db
:
Session
=
Depends
(
get_db
)):
def
googleLogin
(
data
:
GoogleLogin
,
db
:
Session
=
Depends
(
get_db
)):
user_data
=
get_user
(
db
,
data
.
username
)
auth_info
=
authenticate_pwd
(
db
=
db
,
form_data
=
data
)
verify
=
google_verify_result
(
secret_key
=
user_data
.
google_key
,
google_code
=
data
.
google_code
)
if
not
auth_info
.
get
(
"result"
):
return
HttpResultResponse
(
code
=
500
,
msg
=
auth_info
.
get
(
"msg"
))
verify
=
google_verify_result
(
db
=
db
,
data
=
data
)
if
verify
:
if
verify
:
# 定义tokens过期时间
# 定义tokens过期时间
access_token_expires
=
timedelta
(
hours
=
12
)
access_token_expires
=
timedelta
(
hours
=
12
)
token_data
=
{
token_data
=
{
"username"
:
data
.
username
,
"password"
:
data
.
password
}
"username"
:
user_data
.
username
,
"google_key"
:
user_data
.
google_key
}
access_token
=
create_access_token
(
data
=
token_data
,
expires_delta
=
access_token_expires
)
access_token
=
create_access_token
(
data
=
token_data
,
expires_delta
=
access_token_expires
)
return
HttpResultResponse
(
msg
=
HttpMessage
.
HFDU
,
data
=
{
"access_token"
:
access_token
,
"token_type"
:
"bearer"
})
return
HttpResultResponse
(
msg
=
HttpMessage
.
HFDU
,
data
=
{
"access_token"
:
access_token
,
"token_type"
:
"bearer"
})
else
:
else
:
...
...
libs/google_code.py
View file @
856a6109
import
base64
import
base64
from
sqlalchemy.orm
import
Session
import
pyotp
import
pyotp
import
os
import
os
import
traceback
import
traceback
from
qrcode
import
QRCode
,
constants
from
qrcode
import
QRCode
,
constants
from
six
import
BytesIO
from
six
import
BytesIO
from
app.api.users.login_verification
import
get_user
,
add_google_key
from
app.api.users.schemas
import
GoogleLogin
def
get_qrcode
(
username
:
str
,
gtoken
:
str
):
def
get_qrcode
(
username
:
str
,
gtoken
:
str
):
# gtoken = pyotp.random_base32(64)
# gtoken = pyotp.random_base32(64)
...
@@ -34,9 +37,16 @@ def get_qrcode(username: str, gtoken: str):
...
@@ -34,9 +37,16 @@ def get_qrcode(username: str, gtoken: str):
return
False
return
False
def
google_verify_result
(
secret_key
,
google_code
):
def
google_verify_result
(
db
:
Session
,
data
:
GoogleLogin
):
"""谷歌动态码效验"""
"""谷歌动态码效验"""
if
data
.
google_key
==
"1"
:
user_data
=
get_user
(
db
,
data
.
username
)
secret_key
=
user_data
.
google_key
else
:
secret_key
=
data
.
google_key
t
=
pyotp
.
TOTP
(
secret_key
)
t
=
pyotp
.
TOTP
(
secret_key
)
result
=
t
.
verify
(
google_code
)
# 对输入验证码进行校验,正确返回True
result
=
t
.
verify
(
data
.
google_code
)
# 对输入验证码进行校验,正确返回True
msg
=
result
if
result
is
True
else
False
msg
=
result
if
result
is
True
else
False
if
msg
and
data
.
google_key
!=
"1"
:
update_info
=
add_google_key
(
db
=
db
,
username
=
data
.
username
,
google_key
=
data
.
google_key
)
return
msg
return
msg
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment