Skip to content

Commit a9e1a56

Browse files
authored
Merge pull request #26 from plotly/more-0.2-updates
More 0.2 updates
2 parents 6ff26aa + fc53293 commit a9e1a56

File tree

7 files changed

+71
-212
lines changed

7 files changed

+71
-212
lines changed

.circleci/config.yml

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ version: 2.1
22
workflows:
33
main:
44
jobs:
5-
- build
5+
- build-36
6+
- build-311
67

78
jobs:
8-
build:
9+
build-36: &build
910
docker:
1011
- image: cimg/python:3.6
1112
steps:
@@ -26,11 +27,15 @@ jobs:
2627
- run:
2728
name: Build
2829
command: |
29-
python setup.py bdist_wheel --universal sdist --formats=gztar
30+
python setup.py bdist_wheel sdist --formats=gztar
3031
- run:
3132
name: Test
3233
command: |
3334
. venv/bin/activate
3435
pytest tests
3536
- store_artifacts:
3637
path: dist
38+
build-311:
39+
<<: *build
40+
docker:
41+
- image: cimg/python:3.11

dash_enterprise_auth/__init__.py

+48-41
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
"""
2-
dash-enterprise auth
2+
dash-enterprise-auth
33
4-
Methods to integrate dash apps with the authentication from the
5-
dash-deployment-server.
4+
Methods to integrate dash apps with the authentication from Dash Enterprise.
65
"""
7-
from .version import __version__
86
import datetime as _dt
97
import os as _os
108
import platform as _platform
119
import base64 as _b64
1210
import functools as _ft
1311
import json as _json
14-
import jwt as _jwt
1512
import urllib as _urllib
1613
from typing import Any
1714

15+
import flask as _flask
16+
import jwt as _jwt
1817
import requests as _requests
1918

19+
2020
import dash as _dash
2121
if hasattr(_dash, "dcc"):
2222
_dcc = _dash.dcc
@@ -27,31 +27,37 @@
2727
else:
2828
import dash_html_components as _html
2929

30-
import flask as _flask
30+
from .version import __version__
3131

32-
ua_string = 'Plotly/%s (Language=Python/%s; Platform=%s/%s)' % (__version__, _platform.python_version(), _platform.system(), _platform.release())
32+
ua_string = (
33+
f"Plotly/{__version__} (Language=Python/{_platform.python_version()};"
34+
f" Platform={_platform.system()}/{_platform.release()})"
35+
)
3336

3437

3538
class UaPyJWKClient(_jwt.PyJWKClient):
3639
def fetch_data(self) -> Any:
37-
with _urllib.request.urlopen(_urllib.request.Request(self.uri, headers={'User-Agent': ua_string})) as response:
40+
with _urllib.request.urlopen(
41+
_urllib.request.Request(self.uri, headers={"User-Agent": ua_string})
42+
) as response:
3843
return _json.load(response)
3944

4045

4146
def _need_request_context(func):
4247
@_ft.wraps(func)
4348
def _wrap(*args, **kwargs):
4449
if not _flask.has_request_context():
45-
raise RuntimeError('`{0}` method needs a flask/dash request'
46-
' context to run. Make sure to run '
47-
'`{0}` from a callback.'.format(func.__name__))
50+
raise RuntimeError(
51+
f"`{func.__name__}` method needs a flask/dash request"
52+
f" context to run. Make sure to run `{func.__name__}` from a callback."
53+
)
4854
return func(*args, **kwargs)
4955
return _wrap
5056

5157

52-
def create_logout_button(label='Logout', style=None):
58+
def create_logout_button(label="Logout", style=None):
5359
"""
54-
Create a dcc.LogoutButton with the dash-deployment-server logout url set
60+
Create a dcc.LogoutButton with the Dash Enterprise logout url set
5561
in the environment.
5662
5763
:param label: Text of the logout button.
@@ -60,31 +66,31 @@ def create_logout_button(label='Logout', style=None):
6066
:type style: dict
6167
:return:
6268
"""
63-
logout_url = _os.getenv('DASH_LOGOUT_URL')
69+
logout_url = _os.getenv("DASH_LOGOUT_URL")
6470
if not logout_url:
65-
raise Exception(
66-
'DASH_LOGOUT_URL was not set in the environment.'
71+
raise RuntimeError(
72+
"DASH_LOGOUT_URL was not set in the environment."
6773
)
6874

69-
if not _os.getenv('DASH_JWKS_URL'):
75+
if not _os.getenv("DASH_JWKS_URL"):
7076
return _dcc.LogoutButton(
7177
logout_url=logout_url,
7278
label=label,
7379
style=style,
7480
)
7581

76-
btn_style = {'display': 'inline-block'}
82+
btn_style = {"display": "inline-block"}
7783
if style:
7884
btn_style.update(style)
7985

8086
return _html.Div(
8187
_html.A(
8288
label,
8389
href=logout_url,
84-
className='dash-logout-btn',
85-
style={'textDecoration': 'none'}
90+
className="dash-logout-btn",
91+
style={"textDecoration": "none"}
8692
),
87-
className='dash-logout-frame',
93+
className="dash-logout-frame",
8894
style=btn_style
8995
)
9096

@@ -96,40 +102,41 @@ def _get_decoded_token(name):
96102

97103
@_need_request_context
98104
def get_user_data():
99-
jwks_url = _os.getenv('DASH_JWKS_URL')
100-
info_url = _os.getenv('DASH_USER_INFO_URL')
105+
jwks_url = _os.getenv("DASH_JWKS_URL")
106+
info_url = _os.getenv("DASH_USER_INFO_URL")
101107
if not jwks_url:
102-
return _json.loads(_flask.request.headers.get('Plotly-User-Data', "{}"))
108+
return _json.loads(_flask.request.headers.get("Plotly-User-Data", "{}"))
103109
try:
104110
jwks_client = UaPyJWKClient(jwks_url)
105111

106-
token = _get_decoded_token('kcIdToken')
112+
token = _get_decoded_token("kcIdToken")
107113
signing_key = jwks_client.get_signing_key_from_jwt(token)
108114

109115
info = _jwt.decode(
110116
token,
111117
signing_key.key,
112-
algorithms=[signing_key._jwk_data.get('alg', 'RSA256')],
113-
audience=_os.getenv('DASH_AUD', "dash"),
114-
options={'verify_exp': True},
118+
algorithms=[signing_key._jwk_data.get("alg", "RSA256")],
119+
audience=_os.getenv("DASH_AUD", "dash"),
120+
options={"verify_exp": True},
115121
)
116122
if info_url:
117-
tok = _get_decoded_token('kcToken')
118-
authorization = f'Bearer {tok.decode()}'
123+
tok = _get_decoded_token("kcToken")
124+
authorization = f"Bearer {tok.decode()}"
119125
response = _requests.get(
120126
info_url,
121127
headers={
122-
'User-Agent': ua_string,
123-
'Authorization': authorization,
124-
}
128+
"User-Agent": ua_string,
129+
"Authorization": authorization,
130+
},
131+
timeout=10,
125132
)
126133
response.raise_for_status()
127134
data = response.json()
128135
info.update(data)
129136

130137
return info
131138
except Exception as e:
132-
print('JWT decode error: ' + repr(e))
139+
print("JWT decode error: " + repr(e))
133140
return {}
134141

135142

@@ -142,9 +149,9 @@ def get_username():
142149
:rtype: str
143150
"""
144151
data = get_user_data()
145-
if not _os.getenv('DASH_JWKS_URL'):
146-
return data.get('username')
147-
return data.get('preferred_username')
152+
if not _os.getenv("DASH_JWKS_URL"):
153+
return data.get("username")
154+
return data.get("preferred_username")
148155

149156

150157
@_need_request_context
@@ -156,9 +163,9 @@ def get_kerberos_ticket_cache():
156163
"""
157164
data = get_user_data()
158165

159-
expiry_str = data['kerberos_ticket_expiry']
160-
expiry = _dt.datetime.strptime(expiry_str, '%Y-%m-%dT%H:%M:%SZ')
166+
expiry_str = data["kerberos_ticket_expiry"]
167+
expiry = _dt.datetime.strptime(expiry_str, "%Y-%m-%dT%H:%M:%SZ")
161168
if expiry < _dt.datetime.utcnow():
162-
raise Exception('Kerberos ticket has expired.')
169+
raise Exception("Kerberos ticket has expired.")
163170

164-
return _b64.b64decode(data['kerberos_ticket_cache'])
171+
return _b64.b64decode(data["kerberos_ticket_cache"])

dash_enterprise_auth/_api_requests.py

-157
This file was deleted.

justfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
build:
3-
python setup.py bdist_wheel --universal sdist --formats=gztar
3+
python setup.py bdist_wheel sdist --formats=gztar
44
rm -rf build
55

66
test:

0 commit comments

Comments
 (0)