【问题标题】:How to pass Authorization Header Token in api call in angular如何在 api 调用中以角度传递授权标头令牌
【发布时间】:2020-03-09 02:13:57
【问题描述】:

我正在使用 get api 调用来使用 http 从 json doc 中获取数据。但是我只启用了对令牌持有者的授权。当我调用 get 请求时,我想在标题中的 Authorization 中传递令牌的值(我可以通过 localStorage.getItem("token"); 获得)。

API.SERVICE.TS

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs';
import { HttpClientModule } from '@angular/common/http';
import { HttpClient, HttpRequest, HttpEventType, HttpHeaders, HttpParams, HttpEvent, HttpErrorResponse, HttpResponse } from '@angular/common/http';

import 'rxjs/add/operator/map';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(private http: Http) { }

  getTransferIp(){
    return this.http.get('http://localhost:3003/transferip').map(res => res.json() );
  }

}

目前,只有当我在节点服务器获取路由器中关闭身份验证时,我才允许获取数据... 但我不想这样做,也不想使用拦截器

正在下面附加节点服务器文件...

AUTH.JS

const jwt = require('jsonwebtoken')
const User = require('../models/user')

const auth = async (req, res, next) => {
    try {
        const token = req.header('Authorization').replace('Bearer ', '')
        const decoded = jwt.verify(token, 'mango@123')
        const user = await User.findOne({ _id: decoded._id, 'tokens.token': token })

        if (!user) {
            throw new Error()
        }

        req.token = token
        req.user = user
        next()
    } catch (e) {
        res.status(401).send({ error: 'Please authenticate.' })
    }
}

module.exports = auth

TRANSFERIP.JS(路由器)

const express = require('express')
const TransferIp = require('../models/transferip')
const auth = require('../middleware/auth')
const router = new express.Router()

router.post('/transferip', auth, async (req, res) => {
    const task = new TransferIp({
        ...req.body,
        owner: req.user._id
    })

    try {
        await task.save()
        res.status(201).send(task)
    } catch (e) {
        res.status(400).send(e)
    }
})
router.get('/transferip', auth, function(req, res, next) {
    TransferIp.find(function (err, events) {
      if (err) return next(err);
      res.json(events);
    });
});

module.exports = router

使用 POSTMAN 使用令牌成功获取请求的屏幕截图

【问题讨论】:

标签: angular api http


【解决方案1】:

试试这样:

使用 HttpClient

import { Injectable } from "@angular/core";
import { HttpClient,HttpHeaders  } from '@angular/common/http';

@Injectable()
export class ApiService {
  constructor(private http: HttpClient) {}

  getTransferIp() {
    let header = new HttpHeaders().set(
      "Authorization",
       localStorage.getItem("token")
    );

    return this.http.get("http://localhost:3003/transferip", {headers:header});
  }
}

【讨论】:

  • 你为什么用地图,你用的是哪个版本的Angular
  • im 使用 8.2 btw 在尝试您的答案时遇到此错误``` 类型“HttpHeaders”的参数不可分配给“RequestOptionsArgs”类型的参数。属性“headers”在“HttpHeaders”类型中是私有的,但在“RequestOptionsArgs”类型中不是私有的```
  • 使用httpclient,构造函数(private http: HttpClient) { }
  • 可以试试最新的吗?
  • 试过了。不走运:(顺便说一句,我没有收到第二条评论错误。但我无法获取数据,因为我得到了 401:未授权
【解决方案2】:

您可以创建一个拦截器来为每个请求添加Authorization 标头。

https://medium.com/@ryanchenkie_40935/angular-authentication-using-the-http-client-and-http-interceptors-2f9d1540eb8

如果您只想为这个特定请求添加标头,暂时可以使用类似的东西。

getTransferIp(){ {
    const token = localStorage.getItem("token");
    const header = new Headers({ 'Authorization': `Bearer ${token}` });
    const options = {
       headers: header,
    };

    return this.http.get('http://localhost:3003/transferip', options);   
}

【讨论】:

  • 在浏览器的网络选项卡中,请求是否包含授权标头?
  • 是的。并且当我通过邮递员添加令牌获得请求时,它可以工作
  • 是 cors 问题吗?在 api 请求失败之前是否有选项请求?在浏览器的控制台中,是否有Cross Origin错误?
  • @JasonWhite 是的,我有类似的问题,我得到了 CORS 错误,即使我在后端处理了 CORS,你能帮忙吗?由于我使用的是 angular 9,所以我的问题也略有不同。
  • @Petar 如果您遇到 CORS 问题,很可能是您的后端配置方式有问题。 CORS 请求由浏览器而不是 Angular 发送/处理,因此问题很可能与 Angular 无关。没有看到任何源代码,很难说出问题。
【解决方案3】:

要在 Angular 中拦截 http 请求,您可以编写一个服务,从 common/http 模块实现 HttpsInterceptor 接口。

 @Injectable()
export class JwtInterceptor implements HttpInterceptor {
  constructor() { }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = 'token...'; // your auth token
    if (authorized) { // your authorized  logic
      request = request.clone({
        setHeaders: {
          Authorization: `${token}`
        }
      });
    }

    return next.handle(request);
  }
}

别忘了在你的 module.ts 文件中提供你的服务

{provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor},

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 2013-01-21
    • 2018-02-26
    • 1970-01-01
    • 2019-02-27
    • 2019-11-06
    • 2020-05-10
    • 2021-04-02
    • 2020-09-11
    相关资源
    最近更新 更多