我正在为一个问题而苦苦挣扎,这些问题涉及我的代码应如何知道经过身份验证的用户的数据,或者我该如何获取这些数据。
我已经完成了身份验证流程,这意味着我可以成功注册并使用令牌登录。我仍然以刷新页面的方式登录,我的令牌仍存储在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;
});
}
答案 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
方法都被称为。