当前位置: 首页 > 知识库问答 >
问题:

角节点控制台显示GEThttp://localhost:4200/user/profile401(未授权)

端木阳荣
2023-03-14

我试图在登录后将数据存储到 /profile。然而,我在登录后的控制台上不断出现这2个错误。

"VM276:1 GEThttp://localhost:4200/user/profile401(未授权)"和"HttpError响应

因为我遵循不同的教程来解决这个问题,所以我知道我在令牌代码上犯了一些错误,我只是不知道如何修复它。我要感谢任何花时间帮忙的人!这是我的authentication.service.ts

import { Injectable } from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {Observable, of} from 'rxjs';
import { map } from 'rxjs/operators';
import {Router} from '@angular/router';


export interface UserDetails{
  username: string
  email: string
  password: string
  exp: number
  iat: number
}
interface TokenResponse{
  token: string
}
export interface TokenPayload{
  username: string
  email: string
  password: string
}
@Injectable({
  providedIn: 'root'
})
export class AuthenticationService {
  private token: string

  constructor(private http: HttpClient, private router: Router) {}

  private saveToken(token: string): void{
    localStorage.setItem('usertoken', token)
    this.token = token
  }
  private getToken(): string{
    if(!this.token){
      this.token = localStorage.getItem('usertoken')
    }
    return this.token
  }
  public getUserDetails(): UserDetails{
    const token = this.getToken()
    let payload
    if(token){
      payload = token.split('.')[1]
      payload = window.atob(payload)
      return JSON.parse(payload)
    }else{
      return null
    }
  }
  public isLoggedIn(): boolean{
    const user = this.getUserDetails()
    if(user){
      return user.exp > Date.now()/ 1000
    }
    else{
      return false
    }
  }
  public login(user: TokenPayload): Observable<any>{
    const base = this.http.post('/user/login', user)
    const request = base.pipe(
      map((data: TokenResponse) => {
        if(data.token){
          this.saveToken(data.token)
        }return data
      })
    )
    return request
  }
  public register(user: TokenPayload) : Observable<any>{
    const base = this.http.post('/user/register', user)
    const request = base.pipe(
      map((data: TokenResponse) => {
        if(data.token){
          this.saveToken(data.token)
        }
        return data
      })
    )
    return request
  }
  public profile(): Observable<any>{
    return this.http.get('/user/profile',{
      headers: {Authorization: `${this.getToken()}`}
    })
  }
  public logout(): void{
    this.token = ''
    window.localStorage.removeItem('usertoken')
    this.router.navigateByUrl('/')
  }

}

这是我的个人资料。组成部分ts

export class ProfileComponent implements OnInit {

  details: UserDetails

  constructor(private auth: AuthenticationService) {}

  ngOnInit() {
    this.auth.profile().subscribe(
      user => {
        this.details = user
      },
      err => {
        console.error(err)
      }
    )
  }
}

这是我的auth.js

const jwt = require("jsonwebtoken");

module.exports = function(req, res, next) {
  const token = req.header("token");
  if (!token) return res.status(401).json({ message: "Auth Error" });

  try {
    const decoded = jwt.verify(token, "randomString");
    req.user = decoded.user;
    next();
  } catch (e) {
    console.error(e);
    res.status(500).send({ message: "Invalid Token" });
  }
};

这是我的/路线/用户。js

// Filename : user.js

const express = require("express");
const {check, validationResult} = require("express-validator");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const router = express.Router();
const auth = require("../middleware/auth");
const User = require("../model/User");



/**
 * @method - POST
 * @param - /signup
 * @description - User SignUp
 */

router.post(
    "/register",
    [
        check("username", "Please Enter a Valid Username")
        .not()
        .isEmpty(),
        check("email", "Please enter a valid email").isEmail(),
        check("password", "Please enter a valid password").isLength({
            min: 6
        })
    ],
    async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({
                errors: errors.array()
            });
        }

        const {
            username,
            email,
            password
        } = req.body;
        try {
            let user = await User.findOne({
                email
            });
            if (user) {
                return res.status(400).json({
                    msg: "User Already Exists"
                });
            }

            user = new User({
                username,
                email,
                password
            });

            const salt = await bcrypt.genSalt(10);
            user.password = await bcrypt.hash(password, salt);

            await user.save();

            const payload = {
                user: {
                    id: user.id
                }
            };

            jwt.sign(
                payload,
                "randomString", {
                    expiresIn: 10000
                },
                (err, token) => {
                    if (err) throw err;
                    res.status(200).json({
                        token
                    });
                }
            );
        } catch (err) {
            console.log(err.message);
            res.status(500).send("Error in Saving");
        }
    }
);
router.post(
    "/login",
    [
      check("email", "Please enter a valid email").isEmail(),
      check("password", "Please enter a valid password").isLength({
        min: 6
      })
    ],
    async (req, res) => {
      const errors = validationResult(req);
  
      if (!errors.isEmpty()) {
        return res.status(400).json({
          errors: errors.array()
        });
      }
  
      const { email, password } = req.body;
      try {
        let user = await User.findOne({
          email
        });
        if (!user)
          return res.status(400).json({
            message: "User Does Not Exist"
          });
  
        const isMatch = await bcrypt.compare(password, user.password);
        if (!isMatch)
          return res.status(400).json({
            message: "Incorrect Password!"
          });
  
        const payload = {
          user: {
            id: user.id
          }
        };
  
        jwt.sign(
          payload,
          "randomString",
          {
            expiresIn: 3600
          },
          (err, token) => {
            if (err) throw err;
            res.status(200).json({
              token
            });
          }
        );
      } catch (e) {
        console.error(e);
        res.status(500).json({
          message: "Server Error"
        });
      }
    }
  );

  /**
 * @method - POST
 * @description - Get LoggedIn User
 * @param - /user/me
 */

router.get("/profile", auth, async (req, res) => {

    try {
      // request.user is getting fetched from Middleware after token authentication
      const user = await User.findById(req.user.id);
      res.json(user);
    } catch (e) {
      res.send({ message: "Error in Fetching user" });
    }
  });
module.exports = router;

共有1个答案

巴学潞
2023-03-14

在您的角应用程序中,您正在发送带有授权标头的令牌

Authorization: token

但是在您的API(auth.js)中,您试图访问令牌标头

req.header("token")

将您的api代码替换为

req.header("authorization")
 类似资料:
  • 问题内容: 在Java中,我尝试将String写入控制台。字符串的长度为20166个字符。将字符串打印到控制台后,仅出现字符串的后半部分。 整个字符串是一长行: 看起来像什么: 从一开始就有很多空格(应该是字母数字字符),然后是其余的字符串。 我试图将控制台编码从默认更改为UTF-16和UTF-8,但这没有帮助。 我要输出的字符串是从特定网页(http://docs.jquery.com/Tuto

  • 我的控制台: 我的“application.properties”现在处于默认状态: mydb.sql: 有线索吗?谢谢

  • 我有一个与CORS和所需标头相关的问题。 设置:我运行angular项目和AngularCLI(localhost:4200),我想通过HTTP请求从Web服务访问JSON。当我在浏览器中直接使用URL时,一切都很好,并显示JSON。当我从angular应用程序发送请求时,我收到以下错误: 以下是程序代码: 我在网上搜索了一下,发现这个错误与CORS有关。因此我追加到header . append

  • 我正在尝试将数据从Spring Boot应用程序获取到Angular应用程序。 我的角度组件具有以下代码: 我的Spring boot controller具有以下代码: 然而,当我运行这个应用程序时,我得到了一个404错误,如下图所示:

  • 我想使用输入值在角控制器,我做了一个按钮,称为函数,在控制器内定义,当我得到控制器内的值显示未定义的值。请检查我的代码,告诉我哪里错了,对不起这个愚蠢的问题,但我是新的.提前感谢 角度控制器: Html代码:

  • 按钮 开关 滑块 指示灯 标签 折线图 数字输入 文本输入