<?php

namespace OAuth2\Storage;

/**
 * Implement this interface to specify where the OAuth2 Server
 * should get the JWT key for clients
 *
 * @TODO consider extending ClientInterface, as this will almost always
 * be the same storage as retrieving clientData
 *
 * @author F21
 * @author Brent Shaffer <bshafs at gmail dot com>
 */
interface JwtBearerInterface {

	/**
	 * Get the public key associated with a client_id
	 *
	 * @param $client_id
	 * Client identifier to be checked with.
	 *
	 * @return
	 * STRING Return the public key for the client_id if it exists, and MUST return FALSE if it doesn't.
	 */
	public function getClientKey( $client_id, $subject);

	/**
	 * Get a jti (JSON token identifier) by matching against the client_id, subject, audience and expiration.
	 *
	 * @param $client_id
	 * Client identifier to match.
	 *
	 * @param $subject
	 * The subject to match.
	 *
	 * @param $audience
	 * The audience to match.
	 *
	 * @param $expiration
	 * The expiration of the jti.
	 *
	 * @param $jti
	 * The jti to match.
	 *
	 * @return
	 * An associative array as below, and return NULL if the jti does not exist.
	 * - issuer: Stored client identifier.
	 * - subject: Stored subject.
	 * - audience: Stored audience.
	 * - expires: Stored expiration in unix timestamp.
	 * - jti: The stored jti.
	 */
	public function getJti( $client_id, $subject, $audience, $expiration, $jti);

	/**
	 * Store a used jti so that we can check against it to prevent replay attacks.
	 *
	 * @param $client_id
	 * Client identifier to insert.
	 *
	 * @param $subject
	 * The subject to insert.
	 *
	 * @param $audience
	 * The audience to insert.
	 *
	 * @param $expiration
	 * The expiration of the jti.
	 *
	 * @param $jti
	 * The jti to insert.
	 */
	public function setJti( $client_id, $subject, $audience, $expiration, $jti);
}
