This commit is contained in:
yumoqing 2020-02-26 17:24:07 +08:00
parent f25eee433c
commit 94bd3ccb1c

View File

@ -6,7 +6,22 @@ import aiohttp_session
from aiohttp_session import get_session, session_middleware from aiohttp_session import get_session, session_middleware
from aiohttp_session.cookie_storage import EncryptedCookieStorage from aiohttp_session.cookie_storage import EncryptedCookieStorage
from appPublic.jsonConfig import getConfig
from appPublic.rsa import RSA
class AuthAPI: class AuthAPI:
def getPrivateKey(self):
if not hasattr(self,'rsaEngine'):
self.rsaEngine = RSA()
self.conf = getConfig()
fname = self.conf.website.rsakey.privatekey
self.privatekey = self.rsaEngine.read_privatekey(fname)
return self.privatekey
def rsaDecode(self,cdata):
self.getPrivateKey()
return self.rsaEngine.decode(self.privatekey,cdata)
def setupAuth(self,app): def setupAuth(self,app):
# setup session middleware in aiohttp fashion # setup session middleware in aiohttp fashion
storage = EncryptedCookieStorage(urandom(32)) storage = EncryptedCookieStorage(urandom(32))
@ -21,7 +36,7 @@ class AuthAPI:
# setup aiohttp_auth.auth middleware in aiohttp fashion # setup aiohttp_auth.auth middleware in aiohttp fashion
auth.setup(app, policy) auth.setup(app, policy)
app.middlewares.append(self.checkAuth) app.middlewares.append(self.checkAuth)
app.router.add_route('POST','/login',self.login) # app.router.add_route('POST','/login',self.login)
app.router.add_route('GET', '/logout', self.logout) app.router.add_route('GET', '/logout', self.logout)
async def login(self,request): async def login(self,request):
@ -29,14 +44,45 @@ class AuthAPI:
user_id = params.get('user',None) user_id = params.get('user',None)
password = params.get('password',None) password = params.get('password',None)
from_path = params.get('from_path',None) from_path = params.get('from_path',None)
if self.checkUserPassword(user_id,password): if await self.checkUserPassword(user_id,password):
await auth.remember(request, user) await auth.remember(request, user)
return web.HpptFound(from_path) return web.HpptFound(from_path)
raise web.HTTPUnauthorized() raise web.HTTPUnauthorized()
async def checkLogin(self,request):
"""
authorization header has the format:
login_method:user_id:auth_code
"""
authinfo = request.headers.get('authorization')
if authinfo is None:
print('header not include "authorization" info', request.headers)
raise web.HTTPUnauthorized()
authdata = self.rsaDecode(authinfo)
# print('authdata=',authdata)
alist = authdata.split('::')
if len(alist) != 3:
print('auth data format error')
raise web.HTTPUnauthorized()
login_method=alist[0]
user_id = alist[1]
password = alist[2]
if login_method == 'password':
if await self.checkUserPassword(user_id,password):
await auth.remember(request,user_id)
print('auth success,',user_id, password)
return user_id
print('auth failed')
raise web.HTTPUnauthorized()
else:
print('auth method unrecognized------------------------')
raise web.HTTPUnauthorized()
async def logout(self,request): async def logout(self,request):
await auth.forget(request) await auth.forget(request)
return web.REsponse(body='OK'.encode('utf-8')) return web.Response(body='OK'.encode('utf-8'))
@web.middleware @web.middleware
async def checkAuth(self,request,handler): async def checkAuth(self,request,handler):
@ -46,8 +92,10 @@ class AuthAPI:
return await handler(request) return await handler(request)
user = await auth.get_auth(request) user = await auth.get_auth(request)
if user is None: if user is None:
raise web.HTTPFound(f'/login_form?from_path={path}') print('-----------auth.get_auth() return None--------------')
user_perms = await self.getUserPermission(user) user = await self.checkLogin(request)
#raise web.HTTPFound(f'/login_form?from_path={path}')
user_perms = await self.getUserPermissions(user)
need_perm = await self.getPermissionNeed(path) need_perm = await self.getPermissionNeed(path)
if need_perm in user_perms: if need_perm in user_perms:
return await handler(request) return await handler(request)