code_verifier = $code_verifier; $this->state = $state; $this->nonce = $nonce; $this->redirect_uri = $redirect_uri; $this->return_url = $return_url; $this->resource_indicator = $resource_indicator; } /** * Returns the PKCE code verifier. * * @return string */ public function get_code_verifier(): string { return $this->code_verifier; } /** * Returns the CSRF state parameter. * * @return string */ public function get_state(): string { return $this->state; } /** * Returns the nonce. * * @return string|null */ public function get_nonce(): ?string { return $this->nonce; } /** * Returns the callback redirect URI. * * @return string */ public function get_redirect_uri(): string { return $this->redirect_uri; } /** * Returns the post-authorization return URL. * * @return string|null */ public function get_return_url(): ?string { return $this->return_url; } /** * Returns the RFC 8707 resource indicator this flow targets. * * @return Resource_Indicator */ public function get_resource_indicator(): Resource_Indicator { return $this->resource_indicator; } /** * Converts the state to an associative array for storage. * * @return array */ public function to_array(): array { return [ 'code_verifier' => $this->code_verifier, 'state' => $this->state, 'nonce' => $this->nonce, 'redirect_uri' => $this->redirect_uri, 'return_url' => $this->return_url, 'resource_indicator' => $this->resource_indicator->value(), ]; } /** * Creates an Auth_Flow_State from a stored array. * * @param array $data The stored array data. * * @return self * * @throws InvalidArgumentException If required fields are missing or have invalid types. */ public static function from_array( array $data ): self { $required = [ 'code_verifier', 'state', 'redirect_uri' ]; foreach ( $required as $key ) { if ( ! isset( $data[ $key ] ) || ! \is_string( $data[ $key ] ) ) { // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Internal exception message. throw new InvalidArgumentException( "Auth_Flow_State::from_array() requires a string value for '{$key}'." ); } } $optional_strings = [ 'nonce', 'return_url', 'resource_indicator' ]; foreach ( $optional_strings as $key ) { if ( isset( $data[ $key ] ) && ! \is_string( $data[ $key ] ) ) { // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Internal exception message. throw new InvalidArgumentException( "Auth_Flow_State::from_array() requires '{$key}' to be a string or null." ); } } $stored_indicator = ( $data['resource_indicator'] ?? null ); return new self( $data['code_verifier'], $data['state'], ( $data['nonce'] ?? null ), $data['redirect_uri'], ( $data['return_url'] ?? null ), new Resource_Indicator( ( \is_string( $stored_indicator ) && $stored_indicator !== '' ) ? $stored_indicator : null ), ); } }