Je suis en train de configurer une inscription Facebook pour mon application Web Angular2 . Une fois l'application acceptée via Facebook (après avoir été redirigée vers la page d'autorisation de Facebook), elle est redirigée vers mon application Web avec le jeton et le code en tant que paramètres URL:
http://localhost:55976/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE
Mais une fois la page chargée, les paramètres sont supprimés. L'URL devient:
http://localhost:55976/
Comment puis-je extraire les paramètres (access_token et code) avant qu'ils soient supprimés? Ma configuration de routage contient:
{ path: 'login', component: LoginComponent },
{ path: 'login/:access_token/:code', component: LoginComponent },
MODIFIER:
Voici comment je redirige vers facebook dans mon login.component: Html:
<a class="btn btn-social btn-facebook socialaccount_provider facebook" title="Facebook" href="#" (click)="login_facebook()">
<span class="fa fa-facebook"></span> <span style="padding-left:25px">Sign in with Facebook</span>
</a>
Manuscrit:
login_facebook() {
let url = 'https://www.facebook.com/dialog/oauth?'+
'client_id=my_client_id' +
'&redirect_uri=' + encodeURIComponent('http://localhost:55976/#/login/') +
'&response_type=code%20token';
console.log(url);
window.location.href = url;
}
L'API facebook redirige vers http: // localhost: 55976/#/login/ , c'est ici que j'essaie d'obtenir les paramètres access_token et code.
EDIT 2:
Si je supprime le net dans l'URL de redirection, facebook me redirige vers la bonne URL, mais sans le net, angular ne peut pas résoudre l'URL.
Avant de supprimer '#':
redirect_uri: http://localhost:55976/#/login/
facebook return: http://localhost:55976/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE
Après avoir enlevé '#':
redirect_uri: http://localhost:55976/login/
facebook return: http://localhost:55976/login/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE
Cela signifie que le problème vient du plus vif. Mais sans le tranchant, angular renvoie l'erreur HTTP 404.0 - Introuvable.
Voici mon code de travail final:
Importations:
import { Router, NavigationCancel } from '@angular/router';
import { URLSearchParams, } from '@angular/http';
Constructeur:
constructor(public router: Router) {
router.events.subscribe(s => {
if (s instanceof NavigationCancel) {
let params = new URLSearchParams(s.url.split('#')[1]);
let access_token = params.get('access_token');
let code = params.get('code');
}
});
}
Vous recherchez les paramètres de requête de ActivatedRoute
.
Pour les recevoir, vous pouvez les insérer dans la fonction OnInit
de votre composant, comme suit:
private accesstoken;
private code;
constructor(private route: ActivatedRoute) { }
ngOnInit() {
// Capture the access token and code
this.route
.queryParams
.subscribe(params => {
this.accesstoken = params['#access_token'];
this.code = params['code'];
});
// do something with this.code and this.accesstoken
}
Il y a plus d'exemples dans le lien que j'ai mis ci-dessus. Vous pouvez avoir des problèmes d’angulaire parce que le routeur identifie également les fragments, qui commencent par le # ... Si angulaire est-il l’identifie-t-il comme un fragment, vous pouvez simplement vous abonner au fragment observable depuis ActivatedRoute
et faites-le comme ça.
Je ne sais pas si vous êtes redirigé. Si tel est le cas, ils pourraient utiliser l’option de navigation preserveQueryParams
, par exemple.
this.router.navigate([redirect], {preserveQueryParams: true});
en utilisant Javascript:
(new URL(location)).searchParams.get("parameter_name")
getQueryParams( locationSearch: string):any {
let params = {};
if( locationSearch ) {
locationSearch = locationSearch.split('?')[1];
let splited = locationSearch.split('&');
for( let i = 0; i < splited.length; i++ ) {
let propName = splited[i].split('=')[0];
let propValue = splited[i].split('=')[1];
params[propName] = propValue;
}
}
return params;
}
let q = getQueryParams( location.search );
Cela fonctionne pour moi! :)
import { ActivatedRoute } from '@angular/router';
constructor(private route: ActivatedRoute) { }
/** usage in the method */
let projectId = this.route.snapshot.queryParams.projectId;
Vérifiez ma réponse dans this post.
[MISE À JOUR] Il semble qu'un modérateur a supprimé ma réponse en disant qu'il s'agissait d'une réponse en double. Mais je ne suis pas d'accord, car j'ai posté des extraits de code pertinents en fonction de chaque question. Tant que cette réponse n’est pas supprimée, j’affiche la partie de réponse ici. si vous êtes d’accord, votez pour annuler ma réponse.
Utilisez window.location.hash
pour accéder à tous les paramètres à partir de # . Vous pouvez également utiliser window.location.href
pour accéder à l'URL complète . Pour obtenir le jeton, vous pouvez utiliser window.location.hash.match(/#access_token=([^&]+)/)[1]
.
Remarque: Si vous utilisez TypeScript, vous devez importer une fenêtre dans votre composant.
declare let window;