如何获取经过身份验证的用户的数据/ ID?

时间:2019-11-11 15:48:34

标签: javascript angular typescript ionic-framework ionic4

我正在为一个问题而苦苦挣扎,这些问题涉及我的代码应如何知道经过身份验证的用户的数据,或者我该如何获取这些数据。

我已经完成了身份验证流程,这意味着我可以成功注册并使用令牌登录。我仍然以刷新页面的方式登录,我的令牌仍存储在ionic / storage中。

我认为,这实际上应该足以获取特定的用户数据/用户身份验证数据的权限。但是我不知道该怎么做。

当我从列表中获取任何用户并查看其个人资料时,我只需传递其ID即可。只需单击“个人资料”标签,如何获得经过身份验证的用户的ID?

我不是来自另一个可以获取ID的页面。我还放了我的auth.service代码,如果由于令牌的帮助而对您有所帮助,但最后两个摘要(我认为是重要的)很重要。

这是我的代码:

auth.service.ts

 private token = null;
  user = null;
  authenticationState = new BehaviorSubject(false);



  constructor(private http: HttpClient, private alertCtrl: AlertController, private storage: Storage, private helper: JwtHelperService,
              private plt: Platform) {
    this.plt.ready().then(() => {
      this.checkToken();
    });
   }

   checkToken() {
       this.storage.get(TOKEN_KEY).then(access => {
           if (access) {
               this.user = this.helper.decodeToken(access);
               this.authenticationState.next(true);
           }
       });
   }

   apilogin(username: string, password: string) {
    return this.http.post<any>(`${this.url}/api/token/`, { username, password })
    .pipe(
        tap(res => {
            this.storage.set(TOKEN_KEY, res['access']);
            this.storage.set(USERNAME_KEY, username);
            this.user = this.helper.decodeToken(res['access']);
            console.log('my user: ', this.user);
            this.authenticationState.next(true);
        }),
        catchError(e => {
            this.showAlert('Oops smth went wrong!');
            throw new Error(e);
        }));
}

user.service.ts

  // get a user's profile
  getUserDetails(id: number): Observable<any> {
    return this.http.get(`${this.url}/users/${id}/`);
  }

profile.ts

 information = null;
 id: number;


      ngOnInit() {
        // How to get just the authenticated api?
        this.activatedRoute.paramMap.subscribe(params => { 
         this.id = validateId(params.get('id'));
     });

        function validateId(id: any): number {
           return parseInt(id);
    }

     // Get the information from the API
    this.userService.getUserDetails(this.id).subscribe(result => {
      this.information = result;
     });
   }

1 个答案:

答案 0 :(得分:1)

更新后的答案 您需要像这样

user_id保存到存储中
this.storage.set(USER_ID, this.validateId(res['user_id']))

,然后在当前用户个人资料组件中获取此user_id并将其传递给this.userService.getUserDetails方法,例如:

const currentUserId = this.storage.get(USER_ID); 

this.userService.getUserDetails(currentUserId).subscribe(user => { 
  console.log('user data', user);
});

旧答案 假设任何用户的个人资料都在同一路由(ex: profile/:userId)上,包括当前经过身份验证的用户

您只需将此通话添加到activatedRoute.paramMap的订阅中,

尝试

ngOnInit() {
  // How to get just the authenticated api?
  this.activatedRoute.paramMap.subscribe(params => { 
    this.id = validateId(params.get('id'));

    // Get the information from the API
    this.userService.getUserDetails(this.id).subscribe(result => {
      this.information = result;
    });
  });

  function validateId(id: any): number {
    return parseInt(id);
  }
}

让我解释发生了什么,当您输入此组件时,将调用ngOnInit钩子并按id获取用户,并尝试打开当前经过身份验证的用户后,仅activatedRoute.paramMap订阅的回调并非全部ngOnInit方法都被称为。