def parse_response(self, response, info="", sformat="json", state="", **kwargs): """ Parse a response :param response: Response type :param info: The response, can be either in a JSON or an urlencoded format :param sformat: Which serialization that was used :param state: The state :param kwargs: Extra key word arguments :return: The parsed and to some extend verified response """ _r2e = self.response2error if sformat == "urlencoded": info = self.get_urlinfo(info) # if self.events: # self.events.store('Response', info) resp = response().deserialize(info, sformat, **kwargs) msg = 'Initial response parsing => "{}"' logger.debug(msg.format(sanitize(resp.to_dict()))) if self.events: self.events.store('Response', resp.to_dict()) if "error" in resp and not isinstance(resp, ErrorResponse): resp = None try: errmsgs = _r2e[response.__name__] except KeyError: errmsgs = [ErrorResponse] try: for errmsg in errmsgs: try: resp = errmsg().deserialize(info, sformat) resp.verify() break except Exception: resp = None except KeyError: pass elif resp.only_extras(): resp = None else: kwargs["client_id"] = self.client_id try: kwargs['iss'] = self.provider_info['issuer'] except (KeyError, AttributeError): if self.issuer: kwargs['iss'] = self.issuer if "key" not in kwargs and "keyjar" not in kwargs: kwargs["keyjar"] = self.keyjar logger.debug("Verify response with {}".format(sanitize(kwargs))) verf = resp.verify(**kwargs) if not verf: logger.error('Verification of the response failed') raise PyoidcError("Verification of the response failed") if resp.type() == "AuthorizationResponse" and "scope" not in resp: try: resp["scope"] = kwargs["scope"] except KeyError: pass if not resp: logger.error('Missing or faulty response') raise ResponseError("Missing or faulty response") self.store_response(resp, info) if resp.type() in ["AuthorizationResponse", "AccessTokenResponse"]: try: _state = resp["state"] except (AttributeError, KeyError): _state = "" if not _state: _state = state try: self.grant[_state].update(resp) except KeyError: self.grant[_state] = self.grant_class(resp=resp) return resp
def parse_response(self, response, info="", sformat="json", state="", **kwargs): """ Parse a response :param response: Response type :param info: The response, can be either in a JSON or an urlencoded format :param sformat: Which serialization that was used :param state: The state :param kwargs: Extra key word arguments :return: The parsed and to some extend verified response """ _r2e = self.response2error if sformat == "urlencoded": info = self.get_urlinfo(info) resp = response().deserialize(info, sformat, **kwargs) if "error" in resp and not isinstance(resp, ErrorResponse): resp = None try: errmsgs = _r2e[response.__name__] except KeyError: errmsgs = [ErrorResponse] try: for errmsg in errmsgs: try: resp = errmsg().deserialize(info, sformat) resp.verify() break except Exception, aerr: resp = None err = aerr except KeyError: pass elif resp.only_extras(): resp = None else: kwargs["client_id"] = self.client_id if "key" not in kwargs and "keyjar" not in kwargs: kwargs["keyjar"] = self.keyjar verf = resp.verify(**kwargs) if not verf: raise PyoidcError("Verification of the response failed") if resp.type() == "AuthorizationResponse" and \ "scope" not in resp: try: resp["scope"] = kwargs["scope"] except KeyError: pass if not resp: raise ResponseError("Missing or faulty response") self.store_response(resp, info) if resp.type() in ["AuthorizationResponse", "AccessTokenResponse"]: try: _state = resp["state"] except (AttributeError, KeyError): _state = "" if not _state: _state = state try: self.grant[_state].update(resp) except KeyError: self.grant[_state] = self.grant_class(resp=resp) return resp