| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | <?phpnamespace Aws\Rds;use Aws\Credentials\CredentialsInterface;use Aws\Credentials\Credentials;use Aws\Signature\SignatureV4;use GuzzleHttp\Psr7\Request;use GuzzleHttp\Psr7\Uri;use GuzzleHttp\Promise;use Aws;/** * Generates RDS auth tokens for use with IAM authentication. */class AuthTokenGenerator{    private $credentialProvider;    /**     * The constructor takes an instance of Credentials or a CredentialProvider     *     * @param callable|Credentials $creds     */    public function __construct($creds)    {        if ($creds instanceof CredentialsInterface) {            if (!function_exists('Aws\constantly')) {                $promise = new Promise\FulfilledPromise($creds);                $this->credentialProvider = Aws\constantly($promise);            }        } else {            $this->credentialProvider = $creds;        }    }    /**     * Create the token for database login     *     * @param string $endpoint The database hostname with port number specified     *                         (e.g., host:port)     * @param string $region The region where the database is located     * @param string $username The username to login as     * @param int $lifetime The lifetime of the token in minutes     *     * @return string Token generated     */    public function createToken($endpoint, $region, $username, $lifetime = 15)    {        if (!is_numeric($lifetime) || $lifetime > 15 || $lifetime <= 0) {            throw new \InvalidArgumentException(                "Lifetime must be a positive number less than or equal to 15, was {$lifetime}"            );        }        $uri = new Uri($endpoint);        $uri = $uri->withPath('/');        $uri = $uri->withQuery('Action=connect&DBUser=' . $username);        $request = new Request('GET', $uri);        $signer = new SignatureV4('rds-db', $region);        $provider = $this->credentialProvider;        $url = (string) $signer->presign(            $request,            $provider()->wait(),            '+' . $lifetime . ' minutes'        )->getUri();        // Remove 2 extra slash from the presigned url result        return substr($url, 2);    }}
 |