<?php
// src/Service/ClaveUnicaService.php
namespace App\Service;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
class AuthClaveUnicaService
{
private $clientId;
private $urlBase;
private $secret;
private $redirect_uri;
private $redirect_uri_cu;
private $scope;
private $state;
private $userLoginClaveUnica;
private $accessTokenCU;
public function __construct(){
$this->urlBase=$_ENV['CLAVE_UNICA_API_URL'];
$this->clientId = $_ENV['CLAVE_UNICA_API_CLIENT_ID'];
$this->secret=$_ENV['CLAVE_UNICA_API_SECRET'];
$this->redirect_uri=$_ENV['CLAVE_UNICA_API_REDIRECT_URI'];
$this->redirect_uri_cu=$_ENV['CLAVE_UNICA_API_REDIRECT_URI_CU'];
$this->scope=$_ENV['CLAVE_UNICA_API_SCOPE'];
$this->accessTokenCU="";
$this->userLoginClaveUnica = new userLoginClaveUnica();
}
public function byPassActive(){
if ($_ENV['CLAVE_UNICA_BYPASS_ACTIVE']=="true"){
return true;
}else{
return false;
}
}
public function getUrlToLogin(): string
{
$this->state = mt_rand(1,9999999999);
$urlClaveUnica = $this->urlBase."/openid/authorize?client_id=".$this->clientId."&redirect_uri=".urlencode($this->redirect_uri)."&response_type=code&scope=".$this->scope."&state=".$this->state;
return $urlClaveUnica;
}
public function getUrlToLoginCu(): string
{
$this->state = 'pu-' . (string) mt_rand(1,9999999999);
$urlClaveUnica = $this->urlBase."/openid/authorize?client_id=".$this->clientId."&redirect_uri=".urlencode($this->redirect_uri)."&response_type=code&scope=".$this->scope."&state=".$this->state;
return $urlClaveUnica;
}
public function getTokenConexionCU($code,$state){
if ($this->byPassActive()){
$this->accessTokenCU = $_ENV['CLAVE_UNICA_BYPASS_ACCESSTOKENCU'];
return true;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->urlBase.'/openid/token/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
'client_id' => $this->clientId,
'client_secret' => $this->secret,
'redirect_uri' => $this->redirect_uri,
'grant_type' => 'authorization_code',
'code' => $code,
'state' => $state
)
));
$result = json_decode(curl_exec($ch));
curl_close($ch);
if ( isset($result->access_token) ) {
$this->accessTokenCU = $result->access_token;
return true;
}else{
$this->accessTokenCU = null;
return false;
}
}
public function loadUserLoging(){
if ( isset($this->accessTokenCU) ) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->urlBase.'/openid/userinfo/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', "Authorization: Bearer " . $this->accessTokenCU ));
$data = json_decode(curl_exec($ch));
curl_close($ch);
$this->userLoginClaveUnica->setNombres(implode(' ',$data->name->nombres));
$this->userLoginClaveUnica->setApellidos(implode(' ',$data->name->apellidos));
$this->userLoginClaveUnica->setRolNumero($data->RolUnico->numero);
$this->userLoginClaveUnica->setRolDv($data->RolUnico->DV);
$this->userLoginClaveUnica->setRolTipo($data->RolUnico->tipo);
$this->userLoginClaveUnica->setSub($data->sub);
return true;
}else{
return false;
}
}
public function getUrlToLogout(): string
{
$url = $this->urlBase."/api/v1/accounts/app/logout";
return $url;
}
public function getUserLogin(){
return $this->userLoginClaveUnica;
}
public function getAccessTokenCU(){
return $this->accessTokenCU;
}
public function isValidaSessionCuActiva(
Request $request
){
if ($this->byPassActive()){
return true;
}
$session = $request->getSession();
$user_cu = $session->get('user_cu');
$valida=false;
if (isset($user_cu->token)){
if ($user_cu->token!=""){
$valida=true;
}
}
return $valida;
}
public function setUserLoginCUEnvToSession(Request $request){
$session = $request->getSession();
$user_cu = new \stdClass;
$user_cu->code="";
$user_cu->state="";
$user_cu->token="";
$user_cu->urlToLogout="/logout";
//$userLogin = $this->getUserLogin();
$user_cu->nombres=$_ENV['CLAVE_UNICA_BYPASS_NOMBRES'];
$user_cu->apellidos=$_ENV['CLAVE_UNICA_BYPASS_NOMBRES'];
$user_cu->rolNumero=$_ENV['CLAVE_UNICA_BYPASS_ROLNUMERO'];
$user_cu->rolDv=$_ENV['CLAVE_UNICA_BYPASS_ROLDV'];
$user_cu->rolTipo=$_ENV['CLAVE_UNICA_BYPASS_ROLTIPO'];
$user_cu->sub=$_ENV['CLAVE_UNICA_BYPASS_SUB'];
$session->set('user_cu', $user_cu);
$session->set('is_autentificado_cu', true);
return true;
}
public function setUserLoginCUToSession(Request $request,$urlCallBack){
$session = $request->getSession();
$user_cu = new \stdClass;
$user_cu->code=$_GET['code'];
$user_cu->state=$_GET['state'];
$user_cu->token=$this->getAccessTokenCU();
$user_cu->urlToLogout=$this->getUrlToLogout($urlCallBack);
$userLogin = $this->getUserLogin();
$user_cu->nombres=$userLogin->getNombres();
$user_cu->apellidos=$userLogin->getApellidos();
$user_cu->rolNumero=$userLogin->getRolNumero();
$user_cu->rolDv=$userLogin->getRolDv();
$user_cu->rolTipo=$userLogin->getRolTipo();
$user_cu->sub=$userLogin->getSub();
$session->set('user_cu', $user_cu);
$session->set('is_autentificado_cu', true);
return true;
}
public function getUserLoginCUToSession(Request $request){
$session = $request->getSession();
if ($this->byPassActive()){
if ($session->get('user_cu')==null){
$this->setUserLoginCUEnvToSession($request);
$session = $request->getSession();
}
}
return $session->get('user_cu');
}
public function limpiarSession(Request $request){
$session = $request->getSession();
$session->set('user_cu', null);
$session->set('is_autentificado_cu', false);
$session->clear();
return true;
}
}
class userLoginClaveUnica {
private $nombres = "";
private $apellidos = "";
private $rolNumero = "";
private $rolDv = "";
private $rolTipo = "";
private $sub = "";
public function __toString(){
$stringRetorno="";
$stringRetorno = $stringRetorno.'{';
$stringRetorno = $stringRetorno.'"nombre"": "'.$this->nombres.'", ';
$stringRetorno = $stringRetorno.'"apellidos": "'.$this->apellidos.'", ';
$stringRetorno = $stringRetorno.'"rolNumero": '.$this->rolNumero.'", ';
$stringRetorno = $stringRetorno.'"rolDv": "'.$this->rolDv.'", ';
$stringRetorno = $stringRetorno.'"rolTipo": "'.$this->rolTipo.'", ';
$stringRetorno = $stringRetorno.'"sub": "'.$this->sub.'"';
$stringRetorno = $stringRetorno.'}';
return $stringRetorno;
}
public function getNombres(){
return $this->nombres;
}
public function setNombres($nombres){
$this->nombres = $nombres;
}
public function getApellidos(){
return $this->apellidos;
}
public function setApellidos($apellidos){
$this->apellidos = $apellidos;
}
public function getRolNumero(){
return $this->rolNumero;
}
public function setRolNumero($rolNumero){
$this->rolNumero = $rolNumero;
}
public function getRolDv(){
return $this->rolDv;
}
public function setRolDv($rolDv){
$this->rolDv = $rolDv;
}
public function getRolTipo(){
return $this->rolTipo;
}
public function setRolTipo($rolTipo){
$this->rolTipo = $rolTipo;
}
public function getSub(){
return $this->sub;
}
public function setSub($sub){
$this->sub = $sub;
}
}