Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit a624b00

Browse files
committed
Added RP using Flask
1 parent 177e6c0 commit a624b00

12 files changed

Lines changed: 734 additions & 0 deletions

File tree

flask_rp/__init__.py

Whitespace-only changes.

flask_rp/application.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import os
2+
3+
from flask.app import Flask
4+
5+
from cryptojwt.key_jar import init_key_jar
6+
from oidcservice.service_factory import service_factory
7+
8+
from oidcrp import RPHandler
9+
10+
dir_path = os.path.dirname(os.path.realpath(__file__))
11+
12+
13+
def init_oidc_rp_handler(app):
14+
oidc_keys_conf = app.config.get('OIDC_KEYS')
15+
verify_ssl = app.config.get('VERIFY_SSL')
16+
17+
_kj = init_key_jar(**oidc_keys_conf)
18+
_kj.verify_ssl = verify_ssl
19+
20+
_path = oidc_keys_conf['public_path']
21+
if _path.startswith('./'):
22+
_path = _path[2:]
23+
elif _path.startswith('/'):
24+
_path = _path[1:]
25+
26+
rph = RPHandler(base_url=app.config.get('BASEURL'), hash_seed="BabyHoldOn",
27+
keyjar=_kj, jwks_path=_path,
28+
client_configs=app.config.get('CLIENTS'),
29+
services=app.config.get('SERVICES'),
30+
verify_ssl=verify_ssl, service_factory=service_factory,
31+
module_dirs=['oidc'])
32+
33+
return rph
34+
35+
36+
def oidc_provider_init_app(config_file, name=None, **kwargs):
37+
name = name or __name__
38+
app = Flask(name, static_url_path='', **kwargs)
39+
app.config.from_pyfile(os.path.join(dir_path, config_file))
40+
41+
app.users = {'test_user': {'name': 'Testing Name'}}
42+
43+
try:
44+
from .views import oidc_rp_views
45+
except ImportError:
46+
from views import oidc_rp_views
47+
48+
app.register_blueprint(oidc_rp_views)
49+
50+
# Initialize the oidc_provider after views to be able to set correct urls
51+
app.rph = init_oidc_rp_handler(app)
52+
53+
return app

flask_rp/bc_conf.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
PORT = 8090
2+
BASEURL = "https://localhost:{}".format(PORT)
3+
4+
# If BASE is https these has to be specified
5+
SERVER_CERT = "certs/cert.pem"
6+
SERVER_KEY = "certs/key.pem"
7+
CA_BUNDLE = None
8+
9+
# This is just for testing an local usage. In all other cases it MUST be True
10+
VERIFY_SSL = False
11+
12+
KEYDEFS = [{"type": "RSA", "key": '', "use": ["sig"]},
13+
{"type": "EC", "crv": "P-256", "use": ["sig"]}]
14+
15+
HTML_HOME = 'html'
16+
17+
SECRET_KEY = 'secret_key'
18+
SESSION_COOKIE_NAME = 'rp_session'
19+
20+
PREFERRED_URL_SCHEME = 'https'
21+
22+
OIDC_KEYS = {
23+
'private_path': "./priv/jwks.json",
24+
'key_defs': KEYDEFS,
25+
'public_path': './static/jwks.json'
26+
}
27+
28+
PUBLIC_JWKS_PATH = '{}/{}'.format(BASEURL, OIDC_KEYS['public_path'])
29+
30+
# # information used when registering the client, this may be the same for all OPs
31+
#
32+
DEFAULT_CLIENT_PREFS = {
33+
"application_type": "web", "application_name": "rphandler",
34+
"contacts": ["ops@example.com"],
35+
"response_types": ["code"],
36+
"scope": ["openid", "profile", "email", "address", "phone"],
37+
"token_endpoint_auth_method": ["client_secret_basic",
38+
'client_secret_post']
39+
}
40+
41+
# Default set if nothing else is specified
42+
DEFAULT_SERVICES = {
43+
'ProviderInfoDiscovery': {}, 'Registration': {},
44+
'Authorization': {}, 'AccessToken': {},
45+
'RefreshAccessToken': {}, 'UserInfo': {},
46+
'EndSession': {}
47+
}
48+
49+
CLIENT_CONFIG = {
50+
'client_preferences': DEFAULT_CLIENT_PREFS,
51+
'services': DEFAULT_SERVICES
52+
}
53+
54+
# The keys in this dictionary are the OPs short user friendly name
55+
# not the issuer (iss) name.
56+
# The special key '' is ued for OPs that support dynamic interactions.
57+
58+
CLIENTS = {
59+
# The ones that support web finger, OP discovery and client registration
60+
# This is the default, any client that is not listed here is expected to
61+
# support dynamic discovery and registration.
62+
"": CLIENT_CONFIG,
63+
"filip": {
64+
'issuer':"https://guarded-cliffs-8635.herokuapp.com/",
65+
"redirect_uris": ["{}/authz_cb/filip".format(BASEURL)],
66+
"post_logout_redirect_uris": ["{}/session_logout".format(BASEURL)],
67+
"client_preferences": DEFAULT_CLIENT_PREFS,
68+
"services": DEFAULT_SERVICES,
69+
# "backchannel_logout_session_required": True,
70+
"backchannel_logout_uri": "{}/bc_logout".format(BASEURL)
71+
},
72+
"flop": {
73+
'issuer':"https://127.0.0.1:5000/",
74+
"redirect_uris": ["{}/authz_cb/flop".format(BASEURL)],
75+
"post_logout_redirect_uris": ["{}/session_logout".format(BASEURL)],
76+
"client_preferences": DEFAULT_CLIENT_PREFS,
77+
"services": DEFAULT_SERVICES,
78+
# "backchannel_logout_session_required": True,
79+
"backchannel_logout_uri": "{}/bc_logout/flop".format(BASEURL)
80+
},
81+
"filip_local": {
82+
'issuer': "http://localhost:3000/",
83+
"redirect_uris": ["{}/authz_cb/filip_local".format(BASEURL)],
84+
"post_logout_redirect_uris": ["{}/session_logout".format(BASEURL)],
85+
"client_preferences": DEFAULT_CLIENT_PREFS,
86+
"services": DEFAULT_SERVICES,
87+
# "backchannel_logout_session_required": True,
88+
"backchannel_logout_uri": "{}/bc_logout".format(BASEURL)
89+
}
90+
}
91+
92+
# Whether an attempt to fetch the userinfo should be made
93+
USERINFO = True

flask_rp/certs/cert.pem

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFUDCCAzigAwIBAgIJAJWgBcizyJrFMA0GCSqGSIb3DQEBCwUAMD0xCzAJBgNV
3+
BAYTAlNFMQ0wCwYDVQQKDARPSURGMR8wHQYDVQQDDBZGZWQgYXdhcmUgUlAgdGVz
4+
dCB0b29sMB4XDTE3MDIxMzE5MDg1MloXDTE4MDIxMzE5MDg1MlowPTELMAkGA1UE
5+
BhMCU0UxDTALBgNVBAoMBE9JREYxHzAdBgNVBAMMFkZlZCBhd2FyZSBSUCB0ZXN0
6+
IHRvb2wwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC3NrEL+VKs00NT
7+
R+ZpGRxvDoeLhD7EM+uf7IqHl6IN3H6pflAOE8YqnTepdglhGH4a7nyftINTZjDU
8+
86anR+OKPoY2Padf4E+YceJOcaT6lB5XOWxBu4j3wDRHb6jMUwMDUXHsmh389Bvx
9+
X44KSYe/mhjkrIV8bolhT9NpNjPVUdUvpwpSxDOhSjq7BCmfdvXJrNNYElEQaDSc
10+
yJ4h6BAOp/FfdnWKAeiVDpIF5QqZgr0gzKiV5LEvwsNfHynsLgrlgK2+Fd8qIqbC
11+
/fHtB1BEL3h01dlBR1Y4ocMM5we23Phe4lwQs8QojPTnnr14fWynrjNi0Km0TcMT
12+
TDHVnw5qO5dSr4LpBcfIo82YWpj6lTEKQwKin+SPz0k0kD4E83rtsGp8n3FWHVAo
13+
BsIJ4O58REi3YTh1NCe/bjsQWiFOPW0N9GOl0UTOUj90cGVbO9i91aDFHHQWOIiA
14+
VsmZ35yOjQ031It9Kzv4YcmWXQcdKYnzUQ5eSXZPmJFoebKgQF6neFlg1hp6uDKi
15+
NRxkaPWGVCVZXPmgRwVcFdbxI8OpNqPEFQGskUPGJS5CF1o8o6wuVwPSSwxDVoYM
16+
12TTdATH1he4cK69ej/1F2oHCVQ0KE46fNABaxNKxGls0bPPPJBPrQBjoAR2qxgg
17+
iFz2DjumVC3EySwXLsH4tXTjyuVbSQIDAQABo1MwUTAdBgNVHQ4EFgQUiD0bTabj
18+
Q0Pf0vVJneGr5TQRO+4wHwYDVR0jBBgwFoAUiD0bTabjQ0Pf0vVJneGr5TQRO+4w
19+
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAnYCE5MdqVXHBxMGZ
20+
1bIZxwLg9pe5poaX7l7XGdXxnBKWxfqwCx2UHQZIBdV3eIt8lgtuOL1en9ZCHAIY
21+
X0OZCafQ1Jzx3nXV4qOoolfmri0DQs60LPozoXKW61mah8fFhf/XdjuZxYH+XVV6
22+
39E08MY4ZWDzzNoDe5zhGWw+IOfowx5wNTtZ8CipWUv4FiO9cUZJ/1hnJgE0CQNH
23+
v4v0g0lIuWs7eArbzvxTu3jHWx/+eYvl2TSYxEHpVulbesnI27M34nS0OePqbywO
24+
eGBtM65UuCCBh27FO+O7qJWA3sRPuw/cll0vi69WVYHO5rk7yji1hiTT2MKTEizP
25+
GmdT/FXG4nEsM6WaEe4FMJN6cZf49BUzRcEdW6k8i2YIysHf8fi3Xv1JF74OB5bF
26+
TogV/Fu/LzXsfA/XTj9ki0hUNmueyNT/xBD5tOH4FqHQvMWpjpzfwI90ENVeY+Ad
27+
BCU2Ck1HBEuUhUNaC1d6QkU6pn3voPvaWK49+T9NyrFVMNHVWHeLUHJ/i9kgWXLl
28+
TgAbTCmnJOHTxxCVCf40EjOpPR3hlCadYr8vOGyuHPk1M2Lppgh2kQtFX5ubhhfW
29+
IKP5TPKuZlu3z9RjfUvIxqWC6cbwjlOGIx2K0uCnIbpTzTuaLHJSWWRUpDzNL6lg
30+
V620B7/n1jo2JDudjhjD2uLekJg=
31+
-----END CERTIFICATE-----

flask_rp/certs/key.pem

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
Svp9rK9sO9LqfKBeV9NKW9/wb/X6lU4=
52+
-----END PRIVATE KEY-----

flask_rp/fc_conf.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
PORT = 8090
2+
BASEURL = "https://localhost:{}".format(PORT)
3+
4+
# If BASE is https these has to be specified
5+
SERVER_CERT = "certs/cert.pem"
6+
SERVER_KEY = "certs/key.pem"
7+
CA_BUNDLE = None
8+
9+
# This is just for testing an local usage. In all other cases it MUST be True
10+
VERIFY_SSL = False
11+
12+
KEYDEFS = [{"type": "RSA", "key": '', "use": ["sig"]},
13+
{"type": "EC", "crv": "P-256", "use": ["sig"]}]
14+
15+
HTML_HOME = 'html'
16+
17+
SECRET_KEY = 'secret_key'
18+
SESSION_COOKIE_NAME = 'rp_session'
19+
20+
PREFERRED_URL_SCHEME = 'https'
21+
22+
OIDC_KEYS = {
23+
'private_path': "./priv/jwks.json",
24+
'key_defs': KEYDEFS,
25+
'public_path': './static/jwks.json'
26+
}
27+
28+
PUBLIC_JWKS_PATH = '{}/{}'.format(BASEURL, OIDC_KEYS['public_path'])
29+
30+
# # information used when registering the client, this may be the same for all OPs
31+
#
32+
DEFAULT_CLIENT_PREFS = {
33+
"application_type": "web", "application_name": "rphandler",
34+
"contacts": ["ops@example.com"],
35+
"response_types": ["code"],
36+
"scope": ["openid", "profile", "email", "address", "phone"],
37+
"token_endpoint_auth_method": ["client_secret_basic",
38+
'client_secret_post']
39+
}
40+
41+
# Default set if nothing else is specified
42+
DEFAULT_SERVICES = {
43+
'ProviderInfoDiscovery': {}, 'Registration': {},
44+
'Authorization': {}, 'AccessToken': {},
45+
'RefreshAccessToken': {}, 'UserInfo': {},
46+
'EndSession': {}
47+
}
48+
49+
CLIENT_CONFIG = {
50+
'client_preferences': DEFAULT_CLIENT_PREFS,
51+
'services': DEFAULT_SERVICES
52+
}
53+
54+
# The keys in this dictionary are the OPs short user friendly name
55+
# not the issuer (iss) name.
56+
# The special key '' is ued for OPs that support dynamic interactions.
57+
58+
CLIENTS = {
59+
# The ones that support web finger, OP discovery and client registration
60+
# This is the default, any client that is not listed here is expected to
61+
# support dynamic discovery and registration.
62+
"": CLIENT_CONFIG,
63+
"filip": {
64+
'issuer':"https://guarded-cliffs-8635.herokuapp.com/",
65+
"redirect_uris": ["{}/authz_cb/filip".format(BASEURL)],
66+
"post_logout_redirect_uris": ["{}/session_logout".format(BASEURL)],
67+
"client_preferences": DEFAULT_CLIENT_PREFS,
68+
"services": DEFAULT_SERVICES,
69+
# "backchannel_logout_session_required": True,
70+
"frontchannel_logout_uri": "{}/fc_logout/filip".format(BASEURL)
71+
},
72+
"flop": {
73+
'issuer':"https://127.0.0.1:5000/",
74+
"redirect_uris": ["{}/authz_cb/flop".format(BASEURL)],
75+
"post_logout_redirect_uris": ["{}/session_logout".format(BASEURL)],
76+
"client_preferences": DEFAULT_CLIENT_PREFS,
77+
"services": DEFAULT_SERVICES,
78+
# "backchannel_logout_session_required": True,
79+
"frontchannel_logout_uri": "{}/fc_logout/flop".format(BASEURL),
80+
"frontchannel_logout_session_required": True
81+
}
82+
}
83+
84+
# Whether an attempt to fetch the userinfo should be made
85+
USERINFO = True

flask_rp/templates/opbyuid.html

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<!DOCTYPE html>
2+
3+
<html>
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>pyoidc RP</title>
7+
</head>
8+
<body>
9+
<h1>OP by UID</h1>
10+
<p>
11+
You can perform a login to an OP's by using your unique identifier at the OP.
12+
A unique identifier is defined as your username@opserver, this may be equal to an e-mail address.
13+
A unique identifier is only equal to an e-mail address if the op server is published at the same
14+
server address as your e-mail provider.
15+
</p>
16+
<form action="rp" method="get">
17+
<h2>Start sign in flow</h2>
18+
<h3>By entering your unique identifier:</h3>
19+
<input type="text" id="uid" name="uid" class="form-control" placeholder="UID" autofocus>
20+
<h3><em>Or</em> you can chose one of the preconfigured OpenID Connect Providers</h3>
21+
<select name="iss">
22+
<option value=""></option>
23+
{% for op in providers %}
24+
<option value="{{ op }}">{{ op }}</option>
25+
{% endfor %}
26+
</select>
27+
<button type="submit">Start</button>
28+
</form>
29+
</body>
30+
</html>
31+

flask_rp/templates/opresult.html

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<!DOCTYPE html>
2+
3+
4+
<html>
5+
<head>
6+
<title>pyoidc RP</title>
7+
</head>
8+
<body>
9+
10+
<h1>OP result</h1>
11+
<h2>You have successfully logged in!</h2>
12+
<dl>
13+
<dt>Accesstoken</dt>
14+
<dd>{{ access_token }}</dd>
15+
<h3>Endpoints</h3>
16+
{% for end_point, url in endpoints.items() %}
17+
<dt>{{ end_point }}</dt>
18+
<dd>{{ url }}</dd>
19+
{% endfor %}
20+
</dl>
21+
<h3>User information</h3>
22+
<dl>
23+
{% for key, value in userinfo.items() %}
24+
<dt>{{ key }}</dt>
25+
<dd>{{ value }}</dd>
26+
{% endfor %}
27+
</dl>
28+
29+
{% if check_session_iframe is defined %}
30+
<iframe id="rp_iframe" src="/session_iframe" hidden></iframe>
31+
<iframe id="op_iframe" src={{ check_session_iframe }} hidden></iframe>
32+
{% endif %}
33+
34+
<input type="button" onclick="location.href='{{ logout_url }}'"
35+
value="Logout!" />
36+
37+
</body>
38+
</html>

0 commit comments

Comments
 (0)