Estou desenvolvendo um fluxo de autenticação OAuth puramente em JavaScript e quero mostrar ao usuário a janela "conceder acesso" em um pop-up, mas ele é bloqueado.
Como impedir que janelas pop-up criadas por um window.open
ou window.showModalDialog
sejam bloqueadas pelos bloqueadores de pop-up dos diferentes navegadores?
javascript
popup
modal-dialog
popup-blocker
Pablo Fernandez
fonte
fonte
Respostas:
A regra geral é que os bloqueadores de pop-up serão ativados se
window.open
ou semelhante for invocado no javascript que não é invocado pela ação direta do usuário . Ou seja, você pode chamarwindow.open
em resposta a um clique no botão sem ser atingido pelo bloqueador de pop-ups, mas se você colocar o mesmo código em um evento de timer, ele será bloqueado. A profundidade da cadeia de chamadas também é um fator - alguns navegadores mais antigos olham apenas para o chamador imediato, os navegadores mais novos podem voltar um pouco para ver se o chamador foi um clique do mouse etc. Mantenha-o o mais superficial possível para evitar os bloqueadores de pop-up.fonte
Baseado em Jason Sebring é dica muito útil , e sobre o material coberto aqui e lá , eu encontrei uma solução perfeita para o meu caso:
Pseudo-código com trechos de Javascript:
crie imediatamente um pop-up em branco na ação do usuário
Opcional: adicione uma mensagem informativa "em espera". Exemplos:
a) Uma página HTML externa: substitua a linha acima por
b) Texto: adicione a seguinte linha abaixo da linha acima:
preencha com conteúdo quando estiver pronto (quando a chamada AJAX for retornada, por exemplo)
Enriqueça a chamada para
window.open
com as opções adicionais necessárias.Na verdade, eu uso essa solução para redirecionar o mailto e funciona em todos os meus navegadores (Windows 7, Android). o
_blank
bit ajuda o redirecionamento mailto a funcionar em dispositivos móveis.Sua experiência? Alguma maneira de melhorar isso?
fonte
Whatever it is you intend to do, there is a better way than a popup window
ri muito? Generalização estranha. O cliente deseja que a página em que ele se autenticou permaneça aberta, e o novo site / página inicial após a autenticação para abrir em uma nova guia. Sim, não meu idéia de excelente experiência ao usuário ... mas parece razoávelimportantStuff.close
para fechar a nova guia e forneça e alerte na página original.Além disso, o Swiss Mister post, no meu caso, o window.open foi lançado dentro de uma promessa, que ativou o bloqueador de pop-ups, minha solução foi: em angular:
browserService:
é assim que você pode abrir uma nova guia usando a resposta da promessa e não invocando o bloqueador de pop-ups.
fonte
const tab = window.open(); observable.subscribe(dataUrl => tab.location.href = dataUrl);
.then
em seguida, resposta e é por isso que fiquei tão confuso: / SRY ...Como boa prática, acho que é uma boa ideia testar se um pop-up foi bloqueado e tomar alguma ação. Você precisa saber que window.open tem um valor de retorno e esse valor pode ser nulo se a ação falhar. Por exemplo, no seguinte código:
se o pop-up estiver bloqueado, window.open retornará nulo. Portanto, a função retornará false.
Se o pop-up não abrir, você pode:
fonte
da API JavaScript oauth do Google:
http://code.google.com/p/google-api-javascript-client/wiki/Authentication
Veja a área onde se lê:
Configurando autenticação
A implementação do cliente do OAuth 2.0 usa uma janela pop-up para solicitar que o usuário entre e aprove o aplicativo. A primeira chamada para gapi.auth.authorize pode acionar bloqueadores de pop-up, pois abre indiretamente a janela pop-up. Para impedir que o bloqueador de pop-ups seja acionado em chamadas de autenticação, chame gapi.auth.init (retorno de chamada) quando o cliente carregar. O retorno de chamada fornecido será executado quando a biblioteca estiver pronta para fazer chamadas de autenticação.
Eu acho que está relacionado à resposta real acima, em como ela explica se existe uma resposta imediata, não dispara o alarme pop-up. O "gapi.auth.init" está fazendo com que a API aconteça imediatamente.
Aplicação prática
Fiz um microsserviço de autenticação de código aberto usando o passaporte do nó no npm e os vários pacotes de passaporte para cada provedor. Usei uma abordagem de redirecionamento padrão para terceiros, fornecendo um URL de redirecionamento para o qual retornar. Isso era programático, então eu poderia ter lugares diferentes para redirecionar para o login / inscrição e em páginas específicas.
github.com/sebringj/athu
passportjs.org
fonte
Tentei várias soluções, mas a dele é a única que realmente funcionou para mim em todos os navegadores
let newTab = window.open(); newTab.location.href = url;
fonte
url
? não está atribuído.http://example.com
window.open()
não é possível abrir uma nova janela programaticamente e, se precisarmos, essa resposta é uma das opções. Com anewTab
variável que fazemos referênciawindow.open()
e mais tarde podemos chamá-la, insira ourl
que precisamos, no meu caso, url de algum blob, e a nova guia será aberta com o URL inserido.Eu não queria criar a nova página, a menos que o retorno de chamada retornasse com êxito, por isso fiz isso para simular o clique do usuário:
fonte
A maneira mais fácil de se livrar disso é:
Ex:
Isso funcionou muito bem para mim. Felicidades
fonte