J'essaye d'envoyer un en-tête de jeton dans un http.post. J'essaye ce code mais retourne dans le journal du navigateur:
Accès refusé
const httpOptions = {
headers: new HttpHeaders({
"Authorization": "Token " + localStorage.getItem("token")
})
};
getCron() {
console.log(httpOptions);
return this.http.post(
"URL", httpOptions);
}
console.log renvoie le jeton correct, donc ce n'est pas l'erreur. L'erreur est que je ne sais pas comment ajouter exactement un jeton d'en-tête dans l'appel. La question est donc: comment puis-je ajouter ce jeton dans l'appel?
5 Réponses :
Essayez ceci:
this.http.get(url, { headers: this.headers }).subscribe(...);
Appelez ensuite la requête http en utilisant de nouveaux en-têtes:
headers = new HttpHeaders({ 'Authorization': 'Bearer ' + localStorage.getItem("token") });
Voici la différence entre 401 et 403: une réponse 401 Unauthorized doit être utilisée pour une authentification manquante ou mauvaise, et une réponse 403 Forbidden doit être utilisée par la suite, lorsque l'utilisateur est authentifié mais n'est pas autorisé à effectuer l'opération demandée sur la ressource donnée . Donc bisacally vous êtes authentifié mais pas autorisé à faire certaines opérations, veuillez vérifier avec votre code serveur peut-être vous manquez quelque chose.
Dans Angular, le meilleur moyen est de créer un intercepteur HTTP qui intercepte toutes les requêtes HTTP et les modifie pour inclure des en-têtes HTTP supplémentaires. Pour commencer, créez un service Angular et faites-le implémenter le HttpInterceptor.
import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http';
import {Observable} from "rxjs";
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(){
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
req = req.clone({
setHeaders: {
Authorization: `Bearer ${localStorage.get('token')}`
}
});
return next.handle(req);
}
}
Essayez ce service de code:
ng g service interceptors/auth
Essayez ceci:
import { Http, Headers, RequestOptions} from '@angular/http';
var headers = new Headers();
headers.append('Authorization', 'Bearer ' + localStorage.getItem("token"));
headers.append('Content-Type', 'application/json');
let options = new RequestOptions({ headers: headers });
this.http.post(url, options).map(...);
importer {RequestOptions} depuis '@ angular / http'; let options = new RequestOptions ({headers: headers}); erreur sur {headers: headers}
J'ai modifié ma réponse. qu'est-ce qu'une erreur à {headers: Header}?
erreur: {horodatage: "2019-01-10T10: 30: 04.597 + 0000", état: 403, erreur: "Interdit", message: "Accès refusé", chemin: "URL"} en-têtes: HttpHeaders {normalizedNames: Map ( 0), lazyUpdate: null, lazyInit: ƒ} message: "Réponse d'échec HTTP pour l'URL: 403 OK" nom: "HttpErrorResponse" ok: faux état: 403 statusText: "OK"
Cette erreur n'est pas due à {headers: headers}. Habituellement, 403 est pour refuse d'autoriser
Vous pouvez ignorer ceci: let options = new RequestOptions ({headers: headers}); ligne aussi.
Pour résoudre ce problème, veuillez vérifier si vous avez ajouté l'annotation @CrossOrigin dans votre service backend pour autoriser les demandes provenant de différentes origines, comme celle que vous envoyez depuis l'application Angular. En outre, vous pouvez vérifier l'API à l'aide de Postman, vous pouvez avoir une meilleure idée
Ceci est dû au fait que la méthode post () accepte un corps de requête comme deuxième argument, les options vers http doivent être le troisième argument.
const httpOptions = {
headers: new HttpHeaders({
"Authorization": "Token " + localStorage.getItem("token")
})
};
getCron() {
console.log(httpOptions);
return this.http.post(
"URL", null, httpOptions); // replace the null with a body
}
Si vous n'avez aucune donnée à publier , vous voudrez peut-être changer le point de terminaison en un GET au lieu d'un POST.
Utilisez des intercepteurs pour ajouter un jeton à chaque requête HTTP. Stockez le jeton dans un objet utilisateur et utilisez un service d'authentification pour le récupérer.
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import { Observable } from 'rxjs';
import { AuthenticationService } from '../service/Authentication/authentication-service.service';
@Injectable()
export class JwtInterceptor implements HttpInterceptor {
constructor(private authenticationService: AuthenticationService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// add authorization header with jwt token if available
let currentUser = this.authenticationService.currentUserValue;
if (currentUser && currentUser.token) {
request = request.clone({ headers: request.headers.append('Authorization', 'Bearer '+ currentUser.token) });
}
return next.handle(request`enter code here`);
}
}
Avez-vous vérifié si vous aviez un jeton dans votre stockage local?
Oui. J'imprime console.log (localStorage.getItem ("token")) et j'ai le token.
@ElHombreSinNombre je pense que votre code essaie bien
json parsevaleur de stockage localÇa ne marche pas. SyntaxError: jeton e inattendu dans JSON à la position 0
J'ai essayé cette
"Autorisation": `Token $ {JSON.parse (window.localStorage.getItem (" token ") ||" ")}`?Qu'en est-il également des autres options telles que
type de contenu, type d'application