jwt не позволяет мне видеть профили других пользователей nodejs, angular - PullRequest
0 голосов
/ 09 июля 2020

Я следовал руководству по созданию системы аутентификации. Я пытался понять как можно больше, следуя руководству, но есть вещи, которых я до сих пор не понимаю, и теперь я столкнулся с проблемой, которую я пытался исправить, но ответ все еще отрицательный. Проблема в том, что промежуточное ПО jwt позволяет мне видеть только профиль пользователя, под которым я вошел в систему, но я не хочу этого, я хочу, чтобы пользователь мог видеть профили всех остальных пользователей, как я могу сделай это? Заранее спасибо!! Для серверной части это мой «user.route. js»

router.get("/profile/:id",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" });
    }
  });

для внешнего интерфейса, вот мой «authentication.service.ts»

export interface UserDetails{
  username: string
  email: string
  password: string
  firstName: string
  lastName: string
  exp: number
  iat: number
}
interface TokenResponse{
  token: string
}
export interface TokenPayload{
  username: string
  email: string
  password: string
  firstName: string
  lastName: 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(id): Observable<any>{
    const username = this.getUserDetails().username
    return this.http.get(`/user/profile/${id}`,
    {
      headers: {Authorization: `${this.getToken()}`}
    })
  }
  public logout(): void{
    this.token = ''
    window.localStorage.removeItem('usertoken')
    this.router.navigateByUrl('/')
  }

}

и этот это код "profile.component.ts"

 ngOnInit() {
    
    this.route.params.subscribe(params => {
      const id = params.id;
      this.auth.profile(id).subscribe(
        user => {
          this.details = user
        },
        err => {
          console.error(err)
        }
      )
  })
}

1 Ответ

2 голосов
/ 09 июля 2020

req.user там заполнен промежуточным программным обеспечением авторизации, он не использует идентификатор из пути URL, как вы хотите. Для этого вы должны использовать req.params.id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...