47 $this->config = array_merge(array(
48 'allowed_algorithms' => array(
'RS256',
'RS384',
'RS512')
53 $this->allowedAlgorithms = $this->config[
'allowed_algorithms'];
66 return 'urn:ietf:params:oauth:grant-type:jwt-bearer';
79 if (!$request->
request(
"assertion")) {
80 $response->
setError(400,
'invalid_request',
'Missing parameters: "assertion" required');
86 $undecodedJWT = $request->
request(
'assertion');
89 $jwt = $this->jwtUtil->decode($request->
request(
'assertion'),
null,
false);
92 $response->
setError(400,
'invalid_request',
"JWT is malformed");
99 $jwt = array_merge(array(
111 if (!isset($jwt[
'iss'])) {
112 $response->
setError(400,
'invalid_grant',
"Invalid issuer (iss) provided");
117 if (!isset($jwt[
'sub'])) {
118 $response->
setError(400,
'invalid_grant',
"Invalid subject (sub) provided");
123 if (!isset($jwt[
'exp'])) {
124 $response->
setError(400,
'invalid_grant',
"Expiration (exp) time must be present");
130 if (ctype_digit($jwt[
'exp'])) {
131 if ($jwt[
'exp'] <=
time()) {
132 $response->
setError(400,
'invalid_grant',
"JWT has expired");
137 $response->
setError(400,
'invalid_grant',
"Expiration (exp) time must be a unix time stamp");
143 if ($notBefore = $jwt[
'nbf']) {
144 if (ctype_digit($notBefore)) {
145 if ($notBefore >
time()) {
146 $response->
setError(400,
'invalid_grant',
"JWT cannot be used before the Not Before (nbf) time");
151 $response->
setError(400,
'invalid_grant',
"Not Before (nbf) time must be a unix time stamp");
158 if (!isset($jwt[
'aud']) || ($jwt[
'aud'] != $this->audience)) {
159 $response->
setError(400,
'invalid_grant',
"Invalid audience (aud)");
166 if (isset($jwt[
'jti'])) {
167 $jti = $this->storage->getJti($jwt[
'iss'], $jwt[
'sub'], $jwt[
'aud'], $jwt[
'exp'], $jwt[
'jti']);
170 if ($jti && $jti[
'expires'] >
time()) {
171 $response->
setError(400,
'invalid_grant',
"JSON Token Identifier (jti) has already been used");
175 $this->storage->setJti($jwt[
'iss'], $jwt[
'sub'], $jwt[
'aud'], $jwt[
'exp'], $jwt[
'jti']);
181 if (!$key = $this->storage->getClientKey($jwt[
'iss'], $jwt[
'sub'])) {
182 $response->
setError(400,
'invalid_grant',
"Invalid issuer (iss) or subject (sub) provided");
188 if (!$this->jwtUtil->decode($undecodedJWT, $key, $this->allowedAlgorithms)) {
189 $response->
setError(400,
'invalid_grant',
"JWT failed signature verification");
201 return $this->jwt[
'iss'];
206 return $this->jwt[
'sub'];
222 $includeRefreshToken =
false;
224 return $accessToken->
createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);