SignedAuthRequestUrlBuilder.java

  1. /*******************************************************************************
  2.  * Copyright 2017 The MIT Internet Trust Consortium
  3.  *
  4.  * Portions copyright 2011-2013 The MITRE Corporation
  5.  *
  6.  * Licensed under the Apache License, Version 2.0 (the "License");
  7.  * you may not use this file except in compliance with the License.
  8.  * You may obtain a copy of the License at
  9.  *
  10.  *   http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  *******************************************************************************/
  18. /**
  19.  *
  20.  */
  21. package org.mitre.openid.connect.client.service.impl;

  22. import java.net.URISyntaxException;
  23. import java.util.Map;
  24. import java.util.Map.Entry;

  25. import org.apache.http.client.utils.URIBuilder;
  26. import org.mitre.jwt.signer.service.JWTSigningAndValidationService;
  27. import org.mitre.oauth2.model.RegisteredClient;
  28. import org.mitre.openid.connect.client.service.AuthRequestUrlBuilder;
  29. import org.mitre.openid.connect.config.ServerConfiguration;
  30. import org.springframework.security.authentication.AuthenticationServiceException;

  31. import com.google.common.base.Joiner;
  32. import com.google.common.base.Strings;
  33. import com.nimbusds.jose.JWSAlgorithm;
  34. import com.nimbusds.jose.JWSHeader;
  35. import com.nimbusds.jwt.JWTClaimsSet;
  36. import com.nimbusds.jwt.SignedJWT;

  37. /**
  38.  * @author jricher
  39.  *
  40.  */
  41. public class SignedAuthRequestUrlBuilder implements AuthRequestUrlBuilder {

  42.     private JWTSigningAndValidationService signingAndValidationService;

  43.     /* (non-Javadoc)
  44.      * @see org.mitre.openid.connect.client.service.AuthRequestUrlBuilder#buildAuthRequestUrl(org.mitre.openid.connect.config.ServerConfiguration, org.springframework.security.oauth2.provider.ClientDetails, java.lang.String, java.lang.String, java.lang.String)
  45.      */
  46.     @Override
  47.     public String buildAuthRequestUrl(ServerConfiguration serverConfig, RegisteredClient clientConfig, String redirectUri, String nonce, String state, Map<String, String> options, String loginHint) {

  48.         // create our signed JWT for the request object
  49.         JWTClaimsSet.Builder claims = new JWTClaimsSet.Builder();

  50.         //set parameters to JwtClaims
  51.         claims.claim("response_type", "code");
  52.         claims.claim("client_id", clientConfig.getClientId());
  53.         claims.claim("scope", Joiner.on(" ").join(clientConfig.getScope()));

  54.         // build our redirect URI
  55.         claims.claim("redirect_uri", redirectUri);

  56.         // this comes back in the id token
  57.         claims.claim("nonce", nonce);

  58.         // this comes back in the auth request return
  59.         claims.claim("state", state);

  60.         // Optional parameters
  61.         for (Entry<String, String> option : options.entrySet()) {
  62.             claims.claim(option.getKey(), option.getValue());
  63.         }

  64.         // if there's a login hint, send it
  65.         if (!Strings.isNullOrEmpty(loginHint)) {
  66.             claims.claim("login_hint", loginHint);
  67.         }

  68.         JWSAlgorithm alg = clientConfig.getRequestObjectSigningAlg();
  69.         if (alg == null) {
  70.             alg = signingAndValidationService.getDefaultSigningAlgorithm();
  71.         }

  72.         SignedJWT jwt = new SignedJWT(new JWSHeader(alg), claims.build());

  73.         signingAndValidationService.signJwt(jwt, alg);

  74.         try {
  75.             URIBuilder uriBuilder = new URIBuilder(serverConfig.getAuthorizationEndpointUri());
  76.             uriBuilder.addParameter("request", jwt.serialize());

  77.             // build out the URI
  78.             return uriBuilder.build().toString();
  79.         } catch (URISyntaxException e) {
  80.             throw new AuthenticationServiceException("Malformed Authorization Endpoint Uri", e);
  81.         }
  82.     }

  83.     /**
  84.      * @return the signingAndValidationService
  85.      */
  86.     public JWTSigningAndValidationService getSigningAndValidationService() {
  87.         return signingAndValidationService;
  88.     }

  89.     /**
  90.      * @param signingAndValidationService the signingAndValidationService to set
  91.      */
  92.     public void setSigningAndValidationService(JWTSigningAndValidationService signingAndValidationService) {
  93.         this.signingAndValidationService = signingAndValidationService;
  94.     }

  95. }