• 0
daniel.uramg

Ajuda de alguém com experiência em JS para autenticação

Question

Olá,

estou desenvolvendo uma aplicação simples que será 99% em JavaScript, como a SDK JS do ML está descontinuada a uns anos, somente a parte de autenticação fiz em PHP.

Pretendo fazer a aplicação toda em JS para não consumir recursos do servidor, no primeiro acesso o app requisita o Aceess Token do servidor e armazena ele localmente, daí então todas as requisições que serão feitas à API do ML será feita via Ajax.

O problema está sendo em como o Javascript vai requisitar o Access Token ao meu PHP do usuário em específico que estará acessando, no meu protótipo eu armazenei numa variável minha ID do ML, então passo esta ID para o servidor para requisitar o token:

    //requisita o access_token
    var user_id = '0000'; //Minha ID do ML
    var expires_in = GM_getValue('expires_in');
    var agora = Math.round(new Date().getTime()/1000);
    if (expires_in < agora || !expires_in){
        $.getJSON("https://meusite.com/renew_token.php?user_id=" + user_id, function(retorno){
            //se recebeu o token, grava ele
            if (retorno.access_token){
                GM_setValue('access_token', retorno.access_token);
                GM_setValue('expires_in', retorno.expires_in);
            }
            //se não existir o token provavelmente o usuario nunca se autenticou, então abre a janela para autorizar o app
            else{
                window.open("https://meusite.com/login.php","janela1","width=600, height=600, directories=no, location=no, menubar=no, scrollbars=no, status=no, toolbar=no, resizable=no");
            }
        });
    }
    //requisita o access_token

Assim está funcionando normalmente, mas não consegui pensar numa maneira de como o JS pode "pedir" um novo token ao PHP sem eu identificar de que usuário se trata. Se eu acessar diretamente o https://..../login.php ele me retorna o Token correto pois a SDK reconhece o usuário autenticado no navegador, porém também não consegui fazer este retorno "voltar" para o JavaScript.

Edited by daniel.uramg

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Resolvido.

Ao acessar a aplicação verifica se existe o user_id armazenado, caso não exista abre a janela de autenticação (login.php), no login.php após se autenticar com a API retorna

echo "<script>
   window.opener.auth('$id', '$nickname', '$access_token', '$expires_in');
</script>
<body onload='javascript: window.close()'></body>";

 

Aplicativo armazena os dados recebidos em cookie 

   function auth(user_id, nickname, access_token, expires_in){
        console.log('Usuário autenticado e dados armazenados.');
        gerarCookie("user_id", user_id, 365);
        gerarCookie("nickname", nickname, 365);
        gerarCookie("access_token", access_token, 1);
        gerarCookie("expires_in", expires_in, 1);
        location.reload();
    }

Agora já tendo armazenado o ID do usuário e o expires_in consigo comparar o tempo de vencimento do token para renová-lo caso necessário.

 

	var debug = 1;
	var user_id = lerCookie("user_id");
	var nickname = lerCookie("nickname");
	var expires_in = lerCookie('expires_in');
	var access_token = lerCookie('access_token');
	var agora = Math.round(new Date().getTime()/1000);

	if(! user_id){
		if (debug == 1) console.log('Não existe id, abre janela para autenticação');
		var janela = window.open("login.php","janela1","width=400, height=400, directories=no, location=no, menubar=no, scrollbars=no, status=no, toolbar=no, resizable=no");
		if(janela==null){
		  alert('Por favor desative o Bloqueador de Pop-ups para conseguir se autenticar.');
		}
	}else{
		$('h1').before('<p id="loged" align="right">'+nickname+' <a href="#" id="logout">Sair</a></p>');
		//requisita o access_token
		if (expires_in < agora){
			if (debug == 1) console.log('Token venceu, renovar..');
			if (debug == 1) console.log('Agora: ' + agora);
			if (debug == 1) console.log('expires_in: ' + expires_in);
				$.getJSON("renew_token.php?user_id=" + user_id, function(retorno){
					//se recebeu o token, grava ele
					if (retorno.access_token){
						gerarCookie("access_token", retorno.access_token, 1);
						gerarCookie("expires_in", retorno.expires_in, 1);
						location.reload();
						//se não existir o token provavelmente o usuario nunca se autenticou, então abre a janela para autorizar o app
					}else{
						if (debug == 1) console.log('Token não existe, abre janela para autenticar');
						window.open("login.php","janela1","width=400, height=400, directories=no, location=no, menubar=no, scrollbars=no, status=no, toolbar=no, resizable=no");
					}
				});
			}
		//requisita o access_token
	}

 

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.