Saya mengikuti tutorial tentang cara membuat sistem otentikasi. Saya mencoba memahami sebanyak mungkin saat mengikuti tutorial, tetapi ada hal-hal yang masih belum saya dapatkan, dan sekarang saya mengalami masalah yang telah saya coba banyak hal untuk diperbaiki tetapi jawabannya masih negatif. Masalahnya jwt middleware hanya memungkinkan saya untuk melihat profil pengguna yang saya masuki, tetapi saya tidak menginginkannya, saya ingin pengguna dapat melihat profil setiap pengguna lain, bagaimana saya bisa lakukan itu? Terima kasih sebelumnya!! Untuk backend, inilah "user.route.js" saya

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" });
    }
  });

Untuk front end, ini "authentication.service.ts" saya

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('/')
  }

}

Dan ini adalah kode "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)
        }
      )
  })
}
0
Giang Nguyen 9 Juli 2020, 08:36

1 menjawab

Jawaban Terbaik

Req.user di sana diisi oleh middleware otorisasi, tidak menggunakan id dari jalur url seperti yang Anda inginkan. Untuk itu Anda harus menggunakan req.params.id

2
Lev Kuznetsov 9 Juli 2020, 05:43