def verify(self, **kwargs): """Authorization Request parameters that are OPTIONAL in the OAuth 2.0 specification MAY be included in the OpenID Request Object without also passing them as OAuth 2.0 Authorization Request parameters, with one exception: The scope parameter MUST always be present in OAuth 2.0 Authorization Request parameters. All parameter values that are present both in the OAuth 2.0 Authorization Request and in the OpenID Request Object MUST exactly match.""" super(AuthorizationRequest, self).verify(**kwargs) args = {} for arg in ["key", "keyjar", "opponent_id", "sender"]: try: args[arg] = kwargs[arg] except KeyError: pass if "opponent_id" not in kwargs: args["opponent_id"] = self["client_id"] if "request" in self: if isinstance(self["request"], six.string_types): # Try to decode the JWT, checks the signature oidr = OpenIDRequest().from_jwt(str(self["request"]), **args) # verify that nothing is change in the original message for key, val in oidr.items(): if key in self: assert self[key] == val # replace the JWT with the parsed and verified instance self["request"] = oidr if "id_token_hint" in self: if isinstance(self["id_token_hint"], six.string_types): idt = IdToken().from_jwt(str(self["id_token_hint"]), **args) self["id_token_hint"] = idt if "response_type" not in self: raise MissingRequiredAttribute("response_type missing", self) _rt = self["response_type"] if "token" in _rt or "id_token" in _rt: if "nonce" not in self: raise MissingRequiredAttribute("Nonce missing", self) if "openid" not in self.get("scope", []): raise MissingRequiredValue("openid not in scope", self) if "offline_access" in self.get("scope", []): if "prompt" not in self or "consent" not in self["prompt"]: raise MissingRequiredValue("consent in prompt", self) if "prompt" in self: if "none" in self["prompt"] and len(self["prompt"]) > 1: raise InvalidRequest("prompt none combined with other value", self) return True
def verify(self, **kwargs): super(AuthorizationResponse, self).verify(**kwargs) if "aud" in self: if "client_id" in kwargs: # check that it's for me if kwargs["client_id"] not in self["aud"]: return False if "id_token" in self: self["id_token"] = verify_id_token(self, check_hash=True, **kwargs) if "access_token" in self: if "token_type" not in self: raise MissingRequiredValue("Missing token_type parameter", self) return True
def verify(self, **kwargs): super(AuthorizationResponse, self).verify(**kwargs) if "aud" in self: if "client_id" in kwargs: # check that it's for me if kwargs["client_id"] not in self["aud"]: return False if "id_token" in self: # Try to decode the JWT, checks the signature args = {} for arg in ["key", "keyjar", "algs", "sender"]: try: args[arg] = kwargs[arg] except KeyError: pass idt = IdToken().from_jwt(str(self["id_token"]), **args) if not idt.verify(**kwargs): raise VerificationError("Could not verify id_token", idt) _alg = idt.jws_header["alg"] # What if _alg == 'none' hfunc = "HS" + _alg[-3:] if "access_token" in self: if "at_hash" not in idt: raise MissingRequiredAttribute("Missing at_hash property", idt) if idt["at_hash"] != jws.left_hash(self["access_token"], hfunc): raise AtHashError("Failed to verify access_token hash", idt) if "code" in self: if "c_hash" not in idt: raise MissingRequiredAttribute("Missing c_hash property", idt) if idt["c_hash"] != jws.left_hash(self["code"], hfunc): raise CHashError("Failed to verify code hash", idt) self["id_token"] = idt if "access_token" in self: if "token_type" not in self: raise MissingRequiredValue("Missing token_type parameter", self) return True