oidc auth: login and retrieval of user data basically working
This commit is contained in:
parent
c1f07effee
commit
950fcb4174
2 changed files with 24 additions and 6 deletions
|
@ -24,10 +24,12 @@ oidc_provider = 'https://a1.cy7.de'
|
||||||
oidc_client_id = getenv('OIDC_CLIENT_ID', '311613119816392525')
|
oidc_client_id = getenv('OIDC_CLIENT_ID', '311613119816392525')
|
||||||
oidc_params = dict(
|
oidc_params = dict(
|
||||||
auth_url=getenv('OIDC_PROVIDER_URL', oidc_provider + '/oauth/v2/authorize'),
|
auth_url=getenv('OIDC_PROVIDER_URL', oidc_provider + '/oauth/v2/authorize'),
|
||||||
|
token_url=getenv('OIDC_TOKEN_URL', oidc_provider + '/oauth/v2/token'),
|
||||||
|
userinfo_url=getenv('OIDC_USERINFO_URL', oidc_provider + '/oidc/v1/userinfo'),
|
||||||
callback_url=getenv('OIDC_CALLBACK_URL', base_url + '/auth/callback'),
|
callback_url=getenv('OIDC_CALLBACK_URL', base_url + '/auth/callback'),
|
||||||
client_id = oidc_client_id,
|
client_id = oidc_client_id,
|
||||||
cookie_name=getenv('OIDC_COOKIE_NAME', 'oidc_' + oidc_client_id),
|
cookie_name=getenv('OIDC_COOKIE_NAME', 'oidc_' + oidc_client_id),
|
||||||
cookie_domain=getenv('OIDC_COOKIE_DOMAIN', 'cy7.de'),
|
cookie_domain=getenv('OIDC_COOKIE_DOMAIN', None),
|
||||||
cookie_lifetime=getenv('OIDC_COOKIE_LIFETIME', '86400'),
|
cookie_lifetime=getenv('OIDC_COOKIE_LIFETIME', '86400'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ from email.utils import formatdate
|
||||||
import json
|
import json
|
||||||
from oic import oic, rndstr, unreserved
|
from oic import oic, rndstr, unreserved
|
||||||
from oic.oic.message import AuthorizationResponse
|
from oic.oic.message import AuthorizationResponse
|
||||||
|
import requests
|
||||||
from time import time
|
from time import time
|
||||||
from zope.authentication.interfaces import IAuthentication
|
from zope.authentication.interfaces import IAuthentication
|
||||||
from zope.interface import implementer
|
from zope.interface import implementer
|
||||||
|
@ -67,7 +68,7 @@ class Authenticator(DummyFolder):
|
||||||
print('*** login', self, req.getTraversalStack(), req['PATH_INFO'])
|
print('*** login', self, req.getTraversalStack(), req['PATH_INFO'])
|
||||||
#print('***', dir(req))
|
#print('***', dir(req))
|
||||||
client = oic.Client()
|
client = oic.Client()
|
||||||
#providerInfo = client.provider_config(params['provider_url'])
|
#providerInfo = client.provider_config(config.oidc_provider)
|
||||||
#print('***', providerInfo)
|
#print('***', providerInfo)
|
||||||
state = rndstr()
|
state = rndstr()
|
||||||
nonce = rndstr()
|
nonce = rndstr()
|
||||||
|
@ -78,9 +79,10 @@ class Authenticator(DummyFolder):
|
||||||
scope=['openid', 'profile'],
|
scope=['openid', 'profile'],
|
||||||
redirect_uri=self.params['callback_url'],
|
redirect_uri=self.params['callback_url'],
|
||||||
)
|
)
|
||||||
addArgs, codeVerifyer = client.add_code_challenge()
|
addArgs, codeVerifier = client.add_code_challenge()
|
||||||
|
print('***', addArgs, codeVerifier)
|
||||||
args.update(addArgs)
|
args.update(addArgs)
|
||||||
self.storeSession(dict(state=state, nonce=nonce, codeVerifyer=codeVerifyer))
|
self.storeSession(dict(state=state, nonce=nonce, code_verifier=codeVerifier))
|
||||||
authReq = client.construct_AuthorizationRequest(request_args=args)
|
authReq = client.construct_AuthorizationRequest(request_args=args)
|
||||||
loginUrl = authReq.request(self.params['auth_url'])
|
loginUrl = authReq.request(self.params['auth_url'])
|
||||||
print('***', loginUrl)
|
print('***', loginUrl)
|
||||||
|
@ -91,8 +93,22 @@ class Authenticator(DummyFolder):
|
||||||
print('*** callback', self, req.form)
|
print('*** callback', self, req.form)
|
||||||
data = self.loadSession()
|
data = self.loadSession()
|
||||||
code = req.form['code']
|
code = req.form['code']
|
||||||
client = oic.Client()
|
print('***', data, code)
|
||||||
print('***', data, code, client)
|
# !check state: req.form['state'] == data['state']
|
||||||
|
args = dict(
|
||||||
|
grant_type='authorization_code',
|
||||||
|
code=code,
|
||||||
|
redirect_uri=self.params['callback_url'],
|
||||||
|
client_id=self.params['client_id'],
|
||||||
|
code_verifier=data['code_verifier']
|
||||||
|
)
|
||||||
|
# !set header: 'Content-Type: application/x-www-form-urlencoded'
|
||||||
|
tokenResponse = requests.post(self.params['token_url'], data=args)
|
||||||
|
tdata = tokenResponse.json()
|
||||||
|
print('***', tdata)
|
||||||
|
headers = dict(Authorization='Bearer ' + tdata['access_token'])
|
||||||
|
userInfo = requests.get(self.params['userinfo_url'], headers=headers)
|
||||||
|
print('***', userInfo.json())
|
||||||
|
|
||||||
def storeSession(self, data):
|
def storeSession(self, data):
|
||||||
options = {}
|
options = {}
|
||||||
|
|
Loading…
Add table
Reference in a new issue