/** * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package net.oauth.jsontoken.discovery; import com.google.common.collect.Lists; import net.oauth.jsontoken.crypto.RsaSHA256Verifier; import net.oauth.jsontoken.crypto.Verifier; import java.net.URI; import java.util.List; /** * Default strategy for locating public verification keys. Unlike secret (symmetric) * verification keys, public verification keys can be published by token issuers * at URLs called "server descriptors". * * The default strategy to find a public verification key consists of first mapping * an issuer id to a server descriptor, and then fetching the ServerInfo document from * the server descriptor URL. Finally, the key is looked up int the ServerInfo document * by key id. */ public class DefaultPublicKeyLocator implements VerifierProvider { private final ServerDescriptorProvider descriptorProvider; private final ServerInfoResolver descriptorResolver; /** * Public constructor. * * @param descriptorProvider A {@link ServerDescriptorProvider} that maps * issuer ids to server descriptors (URLs). * @param resolver A {@link ServerInfoResolver}, i.e., an object that can fetch * and parse a server info document, given a server descriptor. */ public DefaultPublicKeyLocator(ServerDescriptorProvider descriptorProvider, ServerInfoResolver resolver) { this.descriptorProvider = descriptorProvider; this.descriptorResolver = resolver; } /* * (non-Javadoc) * @see net.oauth.jsontoken.discovery.VerifierProvider#findVerifier(java.lang.String, java.lang.String) */ @Override public List<Verifier> findVerifier(String issuer, String keyId) { URI serverDescriptor = descriptorProvider.getServerDescriptor(issuer); Verifier rsaVerifier = new RsaSHA256Verifier(descriptorResolver.resolve(serverDescriptor).getVerificationKey(keyId)); return Lists.newArrayList(rsaVerifier); } }