Source code for magpie.ui.network.views
from urllib.parse import urlparse
from pyramid.authentication import Authenticated
from pyramid.httpexceptions import HTTPBadRequest
from pyramid.view import view_config
from magpie.api import schemas
from magpie.api.management.network.network_utils import encode_jwt
from magpie.api.requests import check_network_mode_enabled
from magpie.ui.utils import AdminRequests, check_response, request_api
from magpie.utils import get_json, get_logger
[docs]
LOGGER = get_logger(__name__)
[docs]
class NetworkViews(AdminRequests):
@view_config(route_name="magpie.ui.network.views.NetworkViews.authorize",
decorator=check_network_mode_enabled,
renderer="templates/authorize.mako", permission=Authenticated)
[docs]
def authorize(self):
token = self.request.GET.get("token")
response_type = self.request.GET.get("response_type")
redirect_uri = self.request.GET.get("redirect_uri")
# Extend this to other response types later if needed
if response_type != "id_token":
raise HTTPBadRequest("Invalid response type")
if token is None:
raise HTTPBadRequest("Missing token")
admin_cookies = self.get_admin_session()
jwt_path = "{}?token={}".format(schemas.NetworkDecodeJWTAPI.path, token)
jwt_resp = request_api(self.request, jwt_path, "GET", cookies=admin_cookies)
check_response(jwt_resp)
token_content = get_json(jwt_resp)["jwt_content"]
node_name = token_content["iss"]
node_path = schemas.NetworkNodeAPI.path.format(node_name=node_name)
node_resp = request_api(self.request, node_path, "GET", cookies=admin_cookies)
check_response(node_resp)
node_details = get_json(node_resp)
if redirect_uri not in node_details["redirect_uris"]:
raise HTTPBadRequest("Invalid redirect URI")
requesting_user_name = token_content.get("user_name")
token_claims = {"requesting_user_name": requesting_user_name, "user_name": self.request.user.user_name}
response_token = encode_jwt(token_claims, node_name, self.request)
return self.add_template_data(data={"authorize_uri": redirect_uri,
"token": response_token,
"requesting_user_name": requesting_user_name,
"node_name": node_name,
"node_base_url": node_details["base_url"],
"referrer": urlparse(self.request.referrer).hostname})