auth: use logger.debug instead of print
This commit is contained in:
parent
1918183c59
commit
d128c5f138
4 changed files with 26 additions and 24 deletions
|
@ -1,11 +1,19 @@
|
||||||
# py-scopes/demo/config.py
|
# py-scopes/demo/config.py
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
import logging
|
||||||
from os import getenv
|
from os import getenv
|
||||||
from scopes.server.app import zope_app_factory
|
from scopes.server.app import zope_app_factory
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
|
log_file = 'log/scopes.log'
|
||||||
|
log_level = logging.DEBUG
|
||||||
|
log_format = '%(asctime)s %(levelname)s %(name)s %(message)s'
|
||||||
|
log_dateformat = '%Y-%m-%dT%H:%M:%S'
|
||||||
|
logging.basicConfig(filename=log_file, level=log_level,
|
||||||
|
format=log_format, datefmt=log_dateformat)
|
||||||
|
|
||||||
server_port = getenv('SERVER_PORT', '8099')
|
server_port = getenv('SERVER_PORT', '8099')
|
||||||
base_url = getenv('BASE_URL', 'https://demo.cy7.de')
|
base_url = getenv('BASE_URL', 'https://demo.cy7.de')
|
||||||
|
|
||||||
|
|
|
@ -3,22 +3,16 @@
|
||||||
from scopes.server import auth
|
from scopes.server import auth
|
||||||
from scopes.storage import topic
|
from scopes.storage import topic
|
||||||
|
|
||||||
|
import logging
|
||||||
import waitress
|
import waitress
|
||||||
from wsgiref.simple_server import make_server
|
from wsgiref.simple_server import make_server
|
||||||
|
|
||||||
|
|
||||||
def run(app, config):
|
def run(app, config):
|
||||||
port = int(config.server_port)
|
port = int(config.server_port)
|
||||||
print(f'Serving on port {port}.')
|
print(f'Serving on port {port}.')
|
||||||
waitress.serve(app, port=port)
|
waitress.serve(app, port=port)
|
||||||
|
|
||||||
def run_wsgiref(app, config): # obsolete
|
|
||||||
with make_server('', port, app) as httpd:
|
|
||||||
print(f'Serving on port {port}.')
|
|
||||||
try:
|
|
||||||
httpd.serve_forever()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print('Shutting down.')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import config
|
import config
|
||||||
|
|
|
@ -13,9 +13,6 @@ from scopes.server.browser import getView
|
||||||
import scopes.storage.concept # register container classes
|
import scopes.storage.concept # register container classes
|
||||||
from scopes.storage.folder import Root
|
from scopes.storage.folder import Root
|
||||||
|
|
||||||
logging.basicConfig(filename='log/scopes.log')
|
|
||||||
logger = logging.getLogger()
|
|
||||||
|
|
||||||
|
|
||||||
@implementer(IUserPreferredCharsets)
|
@implementer(IUserPreferredCharsets)
|
||||||
class Request(BrowserRequest):
|
class Request(BrowserRequest):
|
||||||
|
@ -28,7 +25,6 @@ def zope_app_factory(config):
|
||||||
def zope_app(environ, start_response):
|
def zope_app(environ, start_response):
|
||||||
storage = storageFactory(config.dbschema)
|
storage = storageFactory(config.dbschema)
|
||||||
appRoot = Root(storage)
|
appRoot = Root(storage)
|
||||||
#request = BrowserRequest(environ['wsgi.input'], environ)
|
|
||||||
request = Request(environ['wsgi.input'], environ)
|
request = Request(environ['wsgi.input'], environ)
|
||||||
request.setPublication(Publication(appRoot))
|
request.setPublication(Publication(appRoot))
|
||||||
request = publish(request, True)
|
request = publish(request, True)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
from cryptography.fernet import Fernet
|
from cryptography.fernet import Fernet
|
||||||
from email.utils import formatdate
|
from email.utils import formatdate
|
||||||
import json
|
import json
|
||||||
|
import logging
|
||||||
import requests
|
import requests
|
||||||
from time import time
|
from time import time
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
|
@ -17,6 +18,8 @@ from scopes import util
|
||||||
|
|
||||||
import config
|
import config
|
||||||
|
|
||||||
|
logger = logging.getLogger('server.auth')
|
||||||
|
|
||||||
|
|
||||||
@implementer(IAuthentication)
|
@implementer(IAuthentication)
|
||||||
class OidcAuthentication:
|
class OidcAuthentication:
|
||||||
|
@ -97,7 +100,7 @@ class Authenticator(DummyFolder):
|
||||||
def authenticate(self):
|
def authenticate(self):
|
||||||
''' return principal or None'''
|
''' return principal or None'''
|
||||||
data = self.loadSession()
|
data = self.loadSession()
|
||||||
print('*** authenticate', data)
|
logger.debug('authenticate: %s', data)
|
||||||
if data and 'userid' in data:
|
if data and 'userid' in data:
|
||||||
id = self.params.get('principal_prefix', '') + data.pop('userid')
|
id = self.params.get('principal_prefix', '') + data.pop('userid')
|
||||||
return Principal(id, data)
|
return Principal(id, data)
|
||||||
|
@ -105,7 +108,7 @@ class Authenticator(DummyFolder):
|
||||||
|
|
||||||
def login(self):
|
def login(self):
|
||||||
req = self.request
|
req = self.request
|
||||||
print('*** login', self, req.getTraversalStack(), req['PATH_INFO'])
|
logger.debug('login: %s %s %s', self, req.getTraversalStack(), req['PATH_INFO'])
|
||||||
#print('***', dir(req))
|
#print('***', dir(req))
|
||||||
state = util.rndstr()
|
state = util.rndstr()
|
||||||
nonce = util.rndstr()
|
nonce = util.rndstr()
|
||||||
|
@ -127,10 +130,9 @@ class Authenticator(DummyFolder):
|
||||||
|
|
||||||
def callback(self):
|
def callback(self):
|
||||||
req = self.request
|
req = self.request
|
||||||
print('*** callback', self, req.form)
|
logger.debug('callback: %s %s', self, req.form)
|
||||||
sdata = self.loadSession()
|
sdata = self.loadSession()
|
||||||
code = req.form['code']
|
code = req.form['code']
|
||||||
print('*** session data', sdata, code)
|
|
||||||
# !check state: req.form['state'] == sdata['state']
|
# !check state: req.form['state'] == sdata['state']
|
||||||
args = dict(
|
args = dict(
|
||||||
grant_type='authorization_code',
|
grant_type='authorization_code',
|
||||||
|
@ -142,13 +144,13 @@ class Authenticator(DummyFolder):
|
||||||
# !set header: 'Content-Type: application/x-www-form-urlencoded'
|
# !set header: 'Content-Type: application/x-www-form-urlencoded'
|
||||||
tokenResponse = requests.post(self.params['token_url'], data=args)
|
tokenResponse = requests.post(self.params['token_url'], data=args)
|
||||||
tdata = tokenResponse.json()
|
tdata = tokenResponse.json()
|
||||||
print('*** token response', tdata)
|
#print('*** token response', tdata)
|
||||||
headers = dict(Authorization='Bearer ' + tdata['access_token'])
|
headers = dict(Authorization='Bearer ' + tdata['access_token'])
|
||||||
userInfo = requests.get(self.params['userinfo_url'], headers=headers)
|
userInfo = requests.get(self.params['userinfo_url'], headers=headers)
|
||||||
userData = userInfo.json()
|
userData = userInfo.json()
|
||||||
print('*** user data', userData)
|
#print('*** user data', userData)
|
||||||
groupInfo = userData.get('urn:zitadel:iam:org:project:roles', {})
|
groupInfo = userData.get('urn:zitadel:iam:org:project:roles', {})
|
||||||
print('*** group info', groupInfo)
|
#print('*** group info', groupInfo)
|
||||||
groupInfo = userData.get('urn:zitadel:iam:org:project:roles')
|
groupInfo = userData.get('urn:zitadel:iam:org:project:roles')
|
||||||
ndata = dict(
|
ndata = dict(
|
||||||
userid=userData['preferred_username'],
|
userid=userData['preferred_username'],
|
||||||
|
@ -164,17 +166,19 @@ class Authenticator(DummyFolder):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def storeSession(self, data):
|
def storeSession(self, data):
|
||||||
options = dict(path='/')
|
|
||||||
lifetime = int(self.params['cookie_lifetime'])
|
lifetime = int(self.params['cookie_lifetime'])
|
||||||
options['expires'] = formatdate(time() + lifetime, localtime=False, usegmt=True)
|
options = dict(
|
||||||
|
path='/',
|
||||||
|
expires=formatdate(time() + lifetime, localtime=False, usegmt=True),
|
||||||
|
httponly=True,
|
||||||
|
)
|
||||||
options['max-age'] = lifetime
|
options['max-age'] = lifetime
|
||||||
domain = self.params['cookie_domain']
|
domain = self.params['cookie_domain']
|
||||||
if domain:
|
if domain:
|
||||||
options['domain'] = domain
|
options['domain'] = domain
|
||||||
#options['httponly'] = True
|
|
||||||
name = self.params['cookie_name']
|
name = self.params['cookie_name']
|
||||||
value = json.dumps(data)
|
value = json.dumps(data)
|
||||||
print('*** storeSession', name, value, options)
|
#print('*** storeSession', name, value, options)
|
||||||
if self.cookieCrypt:
|
if self.cookieCrypt:
|
||||||
value = self.cookieCrypt.encrypt(value.encode('UTF-8')).decode('ASCII')
|
value = self.cookieCrypt.encrypt(value.encode('UTF-8')).decode('ASCII')
|
||||||
self.request.response.setCookie(name, value, **options)
|
self.request.response.setCookie(name, value, **options)
|
||||||
|
@ -186,7 +190,7 @@ class Authenticator(DummyFolder):
|
||||||
#raise ValueError('Missing authentication cookie')
|
#raise ValueError('Missing authentication cookie')
|
||||||
if self.cookieCrypt:
|
if self.cookieCrypt:
|
||||||
cookie = self.cookieCrypt.decrypt(cookie)
|
cookie = self.cookieCrypt.decrypt(cookie)
|
||||||
print('*** loadSession', self.params['cookie_name'], cookie)
|
#print('*** loadSession', self.params['cookie_name'], cookie)
|
||||||
# !error check: return None - or raise error?
|
# !error check: return None - or raise error?
|
||||||
data = json.loads(cookie)
|
data = json.loads(cookie)
|
||||||
return data
|
return data
|
||||||
|
|
Loading…
Add table
Reference in a new issue