JavaScript에서 순전히 OAuth 인증 흐름을 개발 중이며 팝업에서 사용자에게 “grant access”창을 보여주고 싶지만 차단됩니다.
어떻게에 의해 하나 생성 창 팝업 방지 할 수 있습니다 window.open
또는 window.showModalDialog
다른 브라우저 ‘팝업 차단에 의해 차단되는가?
답변
일반적인 규칙은 팝업 사용자window.open
가 직접 사용자 조치에 의해 호출되지 않는 자바 스크립트에서 또는 이와 유사한 호출이 발생 하는 경우 팝업 차단기가 참여하는 것 입니다. 즉, window.open
팝업 차단기에 치지 않고 버튼 클릭에 대한 응답으로 호출 할 수 있지만 타이머 이벤트에 동일한 코드를 넣으면 차단됩니다. 콜 체인의 깊이 또한 중요한 요소입니다. 일부 구형 브라우저는 즉시 발신자를보고, 최신 브라우저는 발신자의 발신자가 마우스 클릭인지 등을 조금 뒤로 추적 할 수 있습니다. 팝업 차단기를 피하려면 최대한 얕게 유지하십시오.
답변
를 기반으로 제이슨 세브링 의 매우 유용한 팁을 하고, 물건에 덮여 여기 와 거기 , 내 경우에 대한 완벽한 솔루션을 발견 :
자바 스크립트 스 니펫이 포함 된 의사 코드 :
-
사용자 작업에 즉시 빈 팝업을 만듭니다.
var importantStuff = window.open('', '_blank');
선택 사항 : “대기 중”정보 메시지를 추가하십시오. 예 :
a) 외부 HTML 페이지 : 위의 줄을
var importantStuff = window.open('http://example.com/waiting.html', '_blank');
b) 텍스트 : 위의 줄 아래에 다음 줄을 추가하십시오.
importantStuff.document.write('Loading preview...');
-
준비가되면 내용으로 채 웁니다 (예 : AJAX 호출이 반환 될 때)
importantStuff.location.href = 'http://shrib.com';
window.open
필요한 추가 옵션으로 전화를 풍부하게하십시오 .
실제로이 솔루션을 mailto 리디렉션에 사용하며 모든 브라우저 (Windows 7, Android)에서 작동합니다. 이 _blank
비트는 mailto 리디렉션이 모바일에서 작동하는 데 도움이됩니다.
당신의 경험은? 이것을 향상시킬 수있는 방법이 있습니까?
답변
또한 스위스 미스터 게시물, 내 경우에는 window.open 이 약속 내에서 시작되어 팝업 차단기가 켜지고 내 솔루션은 다음과 같습니다.
$scope.gotClick = function(){
var myNewTab = browserService.openNewTab();
someService.getUrl().then(
function(res){
browserService.updateTabLocation(res.url, myNewTab);
}
);
};
browserService :
this.openNewTab = function(){
var newTabWindow = $window.open();
return newTabWindow;
}
this.updateTabLocation = function(tabLocation, tab) {
if(!tabLocation){
tab.close();
}
tab.location.href = tabLocation;
}
이것은 약속 응답을 사용하고 팝업 차단기를 호출하지 않고 새 탭을 여는 방법입니다.
답변
좋은 습관 으로 팝업이 차단되었는지 테스트하고 경우에 따라 조치를 취하는 것이 좋습니다 . window.open에 반환 값이 있으며 작업이 실패하면 해당 값이 null 일 수 있음을 알아야합니다. 예를 들어 다음 코드에서
function pop(url,w,h) {
n=window.open(url,'_blank','toolbar=0,location=0,directories=0,status=1,menubar=0,titlebar=0,scrollbars=1,resizable=1,width='+w+',height='+h);
if(n==null) {
return true;
}
return false;
}
팝업이 차단되면 window.open은 null을 반환합니다. 따라서 함수는 false를 반환합니다.
예를 들어,
target="_blank"
팝업이 성공적으로 열리면 리턴
false
하면 링크 동작이 차단되고 그렇지 않으면 팝업이 차단되면true
기본 동작 (새 _blank 창 열기)으로 돌아가서 계속됩니다. .
<a href="http://whatever.com" target="_blank" onclick='return pop("http://whatever.com",300,200);' >
이렇게하면 작동하면 팝업이 표시되고 그렇지 않으면 _blank 창이 나타납니다.
팝업이 열리지 않으면 다음을 수행 할 수 있습니다.
- 예제와 같이 빈 창을 열고 계속하십시오.
- 가짜 팝업 (페이지 내부의 iframe)을 엽니 다.
- 사용자에게 알립니다 ( “이 사이트에 팝업을 허용하십시오”).
- 빈 창을 열고 사용자에게 알리십시오.
답변
Google의 oauth JavaScript API에서 :
http://code.google.com/p/google-api-javascript-client/wiki/Authentication
읽는 영역을 참조하십시오.
인증 설정
클라이언트의 OAuth 2.0 구현은 팝업 창을 사용하여 사용자에게 응용 프로그램에 로그인하고 승인하라는 메시지를 표시합니다. gapi.auth.authorize에 대한 첫 번째 호출은 팝업 창을 간접적으로 열 때 팝업 차단기를 트리거 할 수 있습니다. 인증 차단시 팝업 차단기가 트리거되지 않도록하려면 클라이언트가로드 될 때 gapi.auth.init (callback)을 호출하십시오. 라이브러리가 인증 전화를 걸 준비가되면 제공된 콜백이 실행됩니다.
즉각적인 응답이 있는지 설명하는 방법에서 위의 실제 답변과 관련이 있다고 생각하면 팝업 경보가 작동하지 않습니다. “gapi.auth.init”는 API가 즉시 발생하도록합니다.
실용적인 응용 프로그램
npm의 노드 패스포트와 각 공급자에 대한 다양한 패스포트 패키지를 사용하여 오픈 소스 인증 마이크로 서비스를 만들었습니다. 나는 다시 리디렉션 URL을 제공하는 타사에 대한 표준 리디렉션 접근 방식을 사용했습니다. 이것은 프로그래밍 방식이므로 로그인 / 가입 및 특정 페이지에서 다른 곳으로 리디렉션 할 수 있습니다.
답변
여러 솔루션을 시도했지만 실제로는 모든 브라우저에서 나를 위해 일한 유일한 솔루션입니다.
let newTab = window.open();
newTab.location.href = url;
답변
콜백이 성공적으로 반환되지 않으면 새 페이지를 만들고 싶지 않았으므로 사용자 클릭 을 시뮬레이트 하기 위해이 작업을 수행했습니다 .
function submitAndRedirect {
apiCall.then(({ redirect }) => {
const a = document.createElement('a');
a.href = redirect;
a.target = '_blank';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
});
}