Portanto, esta é a décima terceira vingança da pergunta "como faço para que os cookies de terceiros funcionem no Safari", mas estou perguntando novamente porque acho que o campo de jogo mudou, talvez depois de fevereiro de 2012. Um dos truques padrão para obter terceiros Os cookies de terceiros no Safari foram os seguintes: use javascript para POST em um iframe oculto. Isso costumava induzir o Safari a pensar que o usuário havia interagido com o conteúdo de terceiros e, portanto, permitir a configuração de cookies.
Acho que essa brecha foi fechada na sequência do escândalo moderado em que foi revelado que o Google estava usando esse truque com seus anúncios. No mínimo, ao usar esse truque, fui completamente incapaz de definir cookies no Safari. Descobri algumas postagens aleatórias na Internet que afirmavam que a Apple estava trabalhando para fechar a brecha, mas não encontrei nenhuma palavra oficial.
Como alternativa, tentei redesenhar o principal quadro de terceiros para que você precisasse clicar em um botão antes do conteúdo carregar, mas mesmo esse nível de interação direta não era suficiente para derreter o coração frio do Safari.
Alguém sabe ao certo se o Safari realmente fechou essa brecha? Em caso afirmativo, existem outras soluções alternativas (além da inclusão manual de um ID de sessão em cada solicitação)?
fonte
Respostas:
Só queria deixar aqui uma solução de trabalho simples que não exija interação do usuário .
Como afirmei em um post que fiz :
Basicamente, tudo o que você precisa fazer é carregar sua página em top.location, criar a sessão e redirecioná-la de volta ao facebook.
Adicione esse código na parte superior
index.php
e defina$page_url
o URL final da guia / aplicativo do aplicativo e você verá que o aplicativo funcionará sem problemas.Nota: Isso foi feito para o facebook, mas na verdade funcionaria em qualquer outra situação semelhante.
Edit 20-Dec-2012 - Manutenção da solicitação assinada:
O código acima não mantém os dados de postagem das solicitações, e você perderia o request_request, se o seu aplicativo se basear na solicitação assinada, sinta-se à vontade para tentar o seguinte código:
Nota: Isso ainda está sendo testado corretamente e pode ser menos estável que a primeira versão. Use por sua conta e risco / Feedback é apreciado.
(Obrigado a CBroe por me indicar a direção certa aqui, permitindo melhorar a solução)
fonte
Você disse que queria que seus usuários clicassem em um botão antes que o conteúdo fosse carregado. Minha solução foi abrir um botão em uma nova janela do navegador. Essa janela define um cookie para o meu domínio, atualiza o abridor e depois fecha.
Portanto, seu script principal pode se parecer com:
Então safari_cookie_fix.php se parece com:
fonte
Enganei o Safari com um .htaccess:
E também parou de funcionar para mim. Todos os meus aplicativos estão perdendo a sessão no Safari e redirecionando para fora do Facebook. Como estou com pressa de corrigir esses aplicativos, atualmente estou procurando uma solução. Vou mantê-lo informado.
Edit (06/04/2012): Aparentemente, a Apple "corrigiu" o 5.1.4. Tenho certeza de que esta é a reação à coisa do Google: "Havia um problema na imposição de sua política de cookies. Sites de terceiros poderiam definir cookies se a preferência" Bloquear cookies "no Safari estivesse definida como a configuração padrão de" De terceiros e anunciantes ". Http://support.apple.com/kb/HT5190
fonte
No seu controlador Ruby on Rails, você pode usar:
fonte
redirect_to params[:return_to]
. Esse parâmetro precisa ser verificado em uma lista de desbloqueio de locais seguros para o qual redirecionar. Veja owasp.org/index.php/…Para minha situação específica, resolvi o problema usando window.postMessage () e eliminando qualquer interação do usuário. Observe que isso só funcionará se você puder executar de alguma forma js na janela pai. Isso inclui js do seu domínio ou se você tem acesso direto à fonte.
No iframe (domínio-b), verifico a presença de um cookie e, se não estiver definido, enviarei um postMessage para o pai (domínio-a). Por exemplo;
Em seguida, na janela pai (domínio-a), ouça o evento.
Finalmente, no seu servidor (http://www.domain-b.com/safari/cookiefix), você define o cookie e redireciona de volta para a origem do usuário. O exemplo abaixo está usando o ASP.NET MVC
fonte
"*"
paraPostMessage
corrigir o erro de sintaxeEu tive o mesmo problema e hoje encontrei uma correção que funciona bem para mim. Se o agente do usuário contiver
Safari
e nenhum cookie estiver definido, redirecionarei o usuário para o Diálogo OAuth:Após a autenticação e a solicitação de permissões, o Diálogo OAuth será redirecionado para meu URI no local superior. Portanto, é possível definir cookies. Para todos os nossos aplicativos de tela e guia de página, já incluí o seguinte script:
Portanto, o usuário será redirecionado novamente para a guia da página do Facebook com um cookie válido já definido e a solicitação assinada será publicada novamente.
fonte
Finalmente, optei por uma solução semelhante à que Sascha forneceu, mas com alguns ajustes, já que estou configurando os cookies explicitamente no PHP:
O que isso faz é verificar se o cookie está disponível quando o navegador é um safari. Na próxima etapa, estamos no domínio do aplicativo, ou seja, o URI fornecido como URL_WHERE_APP_IS_LOCATED acima.
Portanto, depois de redirecionar para o domínio do aplicativo, um cookie é definido explicitamente e eu redireciono o usuário para o processo de autorização.
No meu caso (como estou usando o CakePHP, mas deve funcionar bem com qualquer outra estrutura MVC), estou chamando a ação de login novamente, onde a autorização do FB é executada outra vez e, desta vez, é bem-sucedida devido ao cookie existente.
Depois de ter autorizado o aplicativo uma vez, não tive mais problemas ao usar o aplicativo com o Safari (5.1.6)
Espero que ajude alguém.
fonte
Eu tive esse problema em dispositivos executando iOS. Fiz uma loja que pode ser incorporada em um site normal usando um iframe. De alguma forma, em cada carregamento de página, o usuário recebe um novo ID da sessão, resultando em usuários presos na metade do processo, porque alguns valores não estavam presentes na sessão.
Tentei algumas das soluções fornecidas nesta página, mas os pop-ups não funcionam muito bem em um iPad e eu precisava da solução mais transparente.
Eu o resolvi usando um redirecionamento. O site que incorpora meu site deve primeiro redirecionar o usuário ao meu site, para que os principais quadro contenha o URL do meu site, onde defino um cookie e redireciono o usuário para a página apropriada no site que incorpora meu site, que é passado através do URL.
Exemplo de código PHP
O site remoto redireciona o usuário para
init.php
O usuário termina
http://www.domain.com/shop/frame
onde meu site está incorporado, armazenando as sessões como deveria e comendo biscoitos.Espero que isso ajude alguém.
fonte
Deixe-me compartilhar minha correção no ASP.NET MVC 4. A idéia principal, como na resposta correta para PHP. O próximo código adicionado na seção Layout principal no cabeçalho próximo à seção scripts:
fonte
Esta solução se aplica em alguns casos - se possível:
Se a página de conteúdo do iframe usar um subdomínio da página que contém o iframe, o cookie não será mais bloqueado.
fonte
Google realmente deixou o gato fora do saco neste. Eles estavam usando por um tempo para acessar os cookies de rastreamento. Foi corrigido quase imediatamente pela Apple = \
postagem original no Wall Street Journal
fonte
Aqui está um código que eu uso. Descobri que, se eu definir algum cookie no meu site, os cookies funcionarão magicamente no iframe a partir de então.
http://developsocialapps.com/foundations-of-a-facebook-app-framework/
fonte
Uma versão um pouco mais simplificada em PHP do que outros publicaram:
fonte
Eu encontrei a resposta perfeita para isso, tudo graças a um cara chamado Allan que merece todo o crédito aqui. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )
Sua solução é simples e fácil de entender.
No servidor de conteúdo iframe (domínio 2), adicione um arquivo chamado startupession.php no nível do domínio raiz que contém:
Agora, no site de nível superior que contém o iframe (domínio1), a chamada para a página que contém o iframe deve se parecer com:
E é isso! Simples :)
O motivo disso funciona é porque você está direcionando o navegador para um URL de terceiros e solicitando que ele confie antes de mostrar o conteúdo dentro do iframe.
fonte
Usei o modificado Whiteagle modificado (adicionado parâmetro de assinatura_request ao link) e funcionou bem no safari, mas o IE está atualizando constantemente a página nesse caso. Portanto, minha solução para o safari e o Internet Explorer é:
fonte
Eu também estou sofrendo com esse problema, mas finalmente consegui a solução. Inicialmente, carregue diretamente o URL do iframe no navegador como um pequeno pop-up e acesse apenas os valores da sessão dentro do iframe.
fonte
Recentemente, encontrei o mesmo problema no Safari. A solução que descobri é baseada na API HTML5 de armazenamento local. Usando o armazenamento local, você pode emular cookies.
Aqui está o meu post com detalhes: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html
fonte
Decidi me livrar da
$_SESSION
variável todos juntos e escrevi um wrapper em torno do memcache para imitar a sessão.Verifique https://github.com/manpreetssethi/utils/blob/master/Session_manager.php
Caso de uso: no momento em que um usuário acessa o aplicativo, armazena a solicitação assinada usando o Session_manager e, como está no cache, você pode acessá-lo em qualquer página a partir de agora.
Nota: Isso não funcionará ao navegar em particular no Safari, pois o session_id é redefinido sempre que a página é recarregada. (Safari estúpido)
fonte
Você pode resolver esse problema adicionando cabeçalho como política p3p .. eu tive o mesmo problema no safari, portanto, depois de adicionar cabeçalho no topo dos arquivos, resolvi o meu problema.
fonte