如何使用 Keycloak 获取当前用户名?

How to get current user name with Keycloak?

我正在尝试修改此 example Angular2 application 以显示当前登录的用户。首先,我尝试直接从 KeycloakService.tokenParsed.preferred_username 获取它,但它似乎不存在于示例代码中。我的猜测是我必须向 KeycloakService 添加一个函数来单独获取用户名,但我不确定这是最简单的方法以及如何去做?

解决方案:根据@uchihaitachi的建议,这是我添加到我的KeycloakService中的工作方法:

getPreferredUserName(): Promise<string> {
    return new Promise<string>((resolve, reject) => {
        if (KeycloakService.auth.authz.token) {
            KeycloakService.auth.authz.loadUserInfo().success((data) => {
                resolve(<string>data.preferred_username);
            }).error(() => {
                reject('Failed to get preferred user name');
            });
        }
    });
}

恐怕我以前没有使用过 Typescript,但我使用了 loadUserInfo() 方法。假设您要加载获取范围可变名称 userName 中的值:

那么我想这应该可以正常工作:

此代码有效

KeycloakService.auth.authz.loadUserInfo().success(function(data){
  $scope.userName =  data.name ;
}) 

已接受的答案在 Keycloak 中不再有效(我们正在使用 3.x)

KeycloakService.auth.authz.loadUserProfile().success(function(data){
     $scope.username =  data.name ;
}) 

Keycloak loadUserProfile 我的示例代码。它工作完美试试这个:

keycloak.service.ts

loadProfile(): Promise<any> {
    return new Promise<any>((resolve, reject) => {
      if (KeycloakService.auth.authz.token) {
        KeycloakService.auth.authz
          .loadUserProfile()
          .success(data => {
            resolve(<any>data);
          })
          .error(() => {
            reject('Failed to load profile');
          });
      } else {
        reject('Not loggen in');
      }
    })
  }

app.component.ts

export class AppComponent implement OnInit {
    private agentProfile: any = {};

    constructor(private kc: KeycloakService) { }

    ngOnInit() {
        this.kc.loadProfile().then(user => {
            this.agentProfile = user;
        })
    }
}

如果有人正在寻找更简洁的方法来使用 Keycloak 获取当前用户名..
在你的xxxx.component.ts

ngOnInit() {
this.loadProfile().then(user => {
    console.log(user.username)
})
}

loadProfile(): Promise<any>{
return new Promise<any>((resolve, reject) => {
  if(this.auth.isLoggedIn()){
    this.auth.loadUserProfile()
    .then(data => resolve(data))
    .catch(error => console.log(error))
  } else{
    console.log('user not logged in')
  }
})
}
import {KeycloakService} from 'keycloak-angular';

constructor(private keycloakService: KeycloakService) {}

ngOnInit(): void {
   console.log(this.keycloakService.getUsername());
   let userDetails = await this.keycloakService.loadUserProfile();
   console.log(userDetails);
}