Ich entwickle eine Website, die reaktionsschnell sein soll, damit die Menschen von ihrem Telefon aus darauf zugreifen können. Die Website verfügt über einige gesicherte Teile, die über Google, Facebook usw. (OAuth) angemeldet werden können.
Das Server-Backend wurde mit ASP.Net Web API 2 entwickelt und das Frontend besteht hauptsächlich aus AngularJS mit einigen Razor.
Für den Authentifizierungsteil funktioniert alles in allen Browsern, einschließlich Android, aber die Google-Authentifizierung funktioniert nicht auf dem iPhone und gibt mir diese Fehlermeldung
Refused to display 'https://accounts.google.com/o/openid2/auth
?openid.ns=http://specs.openid.ne…tp://axschema.org/namePerson
/last&openid.ax.required=email,name,first,last'
in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.
Für mich verwende ich in meinen HTML-Dateien keinen iframe.
Ich googelte herum, aber keine Antwort brachte mich dazu, das Problem zu beheben.
OK. nachdem Sie mit Hilfe dieses SO - Postens mehr Zeit dafür aufgewendet haben
Überwindung "Anzeige durch X-Frame-Optionen verboten"
Ich konnte das Problem lösen, indem ich &output=embed
am Ende der URL vor dem Posten an die Google-URL hinzufügte:
var url = data.url + "&output=embed";
window.location.replace(url);
Ich habe eine bessere Lösung gefunden, vielleicht kann es jemandem helfen "watch?v="
durch "v/"
ersetzen und es wird funktionieren
var url = url.replace("watch?v=", "v/");
Versuchen zu benutzen
Sie finden den gesamten eingebetteten Code im Abschnitt "Eingebetteter Code", der so aussieht
<iframe width="560" height="315" src="https://www.youtube.com/embed/YOUR_VIDEO_CODE" frameborder="0" allowfullscreen></iframe>
Sie haben den Header in diesem Fall auf SAMEORIGIN gesetzt, was bedeutet, dass das Laden der Ressource in einem Iframe außerhalb ihrer Domäne nicht zulässig ist. Dieser iframe kann also nicht domänenübergreifend angezeigt werden
Zu diesem Zweck müssen Sie die Position in Ihrem Apache oder einem anderen Dienst, den Sie verwenden, anpassen
Wenn Sie Apache verwenden, dann in der Datei httpd.conf.
<LocationMatch "/your_relative_path">
ProxyPass absolute_path_of_your_application/your_relative_path
ProxyPassReverse absolute_path_of_your_application/your_relative_path
</LocationMatch>
Wenn Sie iframe für vimeo verwenden, ändern Sie die URL von:
zu:
Für mich geht das.
Um Youtube-Videos in Ihre anglejs-Seite einzubetten, können Sie einfach den folgenden Filter für Ihr Video verwenden
app.filter('scrurl', function($sce) {
return function(text) {
text = text.replace("watch?v=", "embed/");
return $sce.trustAsResourceUrl(text);
};
});
<iframe class="ytplayer" type="text/html" width="100%" height="360" src="{{youtube_url | scrurl}}" frameborder="0"></iframe>
Ich habe die folgenden Änderungen vorgenommen und funktioniert gut für mich.
Fügen Sie einfach das Attribut <iframe src="URL" target="_parent" />
hinzu.
_parent
: Dadurch würde die eingebettete Seite in demselben Fenster geöffnet.
_blank
: In verschiedenen Registerkarten
Für mich bestand die Lösung darin, auf console.developer.google.com zu gehen und die Anwendungsdomäne zum Abschnitt "Javascript Origins" der OAuth 2-Anmeldeinformationen hinzuzufügen.
Vielen Dank für die Frage . Bei YouTube-Frames ist das erste Problem die von Ihnen angegebene URL. Ist die eingebettete URL oder der URL-Link von der Adressleiste . Dieser Fehler für eine nicht eingebettete URL, wenn Sie jedoch eine nicht eingebettete URL angeben möchten Dann müssen Sie in "Safe Pipe" wie (sowohl für nicht eingebettete als auch für eingebettete URL) codieren:
import {Pipe, PipeTransform} from '@angular/core';
import {DomSanitizer} from '@angular/platform-browser';
@Pipe({name: 'safe'})
export class SafePipe implements PipeTransform {
constructor(private sanitizer: DomSanitizer) {
}
transform(value: any, url: any): any {
if (value && !url) {
const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
let match = value.match(regExp);
if (match && match[2].length == 11) {
console.log(match[2]);
let sepratedID = match[2];
let embedUrl = '//www.youtube.com/embed/' + sepratedID;
return this.sanitizer.bypassSecurityTrustResourceUrl(embedUrl);
}
}
}
}
es wird "vedioId" aufgeteilt. Sie müssen die Video-ID abrufen und dann als eingebettete URL in Html festlegen
<div>
<iframe width="100%" height="300" [src]="video.url | safe"></iframe>
</div>
Angular 2/5 Nochmals vielen Dank.
Etwas spät, aber dieser Fehler kann auch auftreten, wenn Sie einen native application Client ID
anstelle eines web application Client ID
verwenden.
Bei der Verwendung von iframe zum Abmelden von untergeordneten Websites mit unterschiedlichen Domänen kam es zu diesem ähnlichen Problem. Die von mir verwendete Lösung bestand darin, zuerst den iframe zu laden und dann die Quelle zu aktualisieren, nachdem der Frame geladen wurde.
var frame = document.createElement('iframe');
frame.style.display = 'none';
frame.setAttribute('src', 'about:blank');
document.body.appendChild(frame);
frame.addEventListener('load', () => {
frame.setAttribute('src', url);
});
Eine einfache Lösung besteht darin, die Erweiterung "Ignoriere X-Frame-Header" zu Ihrem Chrome.
Es gibt eine Lösung, die für mich funktioniert hat und sich auf die Eltern bezieht. Nachdem Sie die URL erhalten haben, die auf die Google-Authentifizierungsseite umgeleitet wird, können Sie folgenden Code ausprobieren:
var loc = redirect_location;
window.parent.location.replace(loc);