Создать пользователя и установить customClaims с Firebase Authentication - PullRequest
0 голосов
/ 10 апреля 2019

Когда я регистрирую нового пользователя, я сразу настраиваю некоторые значения для управления доступом пользователя.

Проблема в том, что данные, которые я настраиваю, отображаются только в следующих сеансах после того, как вы вошли в систему.вне сеанса аутентифицированного пользователя после того, как вы его создали.

Так что моя проблема в том, что я не могу получить претензии после того, как создал учетную запись и затем определил ее, мне нужны эти данные вскоре после создания нового пользователя.в Firebase Authentication.

auth.service.ts

public user: any;
public firestoreCollection: string;
public admin: boolean;

constructor(private _angularFireauth: AngularFireAuth) {

    this.getUser().subscribe((user: firebase.User) => {

        this.user = user;

        if (this.user) {
            // You must logout() and then login() to get the claims.
            user.getIdTokenResult().then(idTokenResult => {
                this.firestoreCollection = idTokenResult.claims.firestoreCollection;
                this.admin = idTokenResult.claims.admin;
            });
        }
    });
}

public getUser(): Observable<firebase.User> {
    return this._angularFireauth.authState;
}

public async createAccount(user: any): Promise<void> {
    const auth = await this._angularFireauth.auth
        .createUserWithEmailAndPassword(user.email, user.password);

    const userObject = {
        displayName: user.nome.trim(),
        photoURL: 'assets/images/avatars/profile.jpg'
    };

    await auth.user.updateProfile(userObject);

    const setUserControlAccess = firebase.functions()
        .httpsCallable('setUserControlAccess');

    await setUserControlAccess({
        admin: true, assinante: true, profissional: true,
        firestoreCollection: auth.user.uid,
        email: auth.user.email
    });

    // I tried to re-authenticate to see if I could get claims.
    await this.reauthenticateUser(user.email, user.password);
}

Облачные функции

 export const setUserControlAccess = functions.https.onCall(async (data, context) => {
     try {
        const customUserClaims = {
        admin: data.admin,
        firestoreCollection: data.firestoreCollection
    };

    const user = await admin.auth().getUserByEmail(data.email);
    await authentication.setCustomUserClaims(user.uid, customUserClaims);

} catch (error) {
    console.error(error);
    return error;
}
 });

1 Ответ

0 голосов
/ 10 апреля 2019

Если вам нужны роли пользователя сразу, рассмотрите возможность использования другого механизма, нежели пользовательские утверждения для них. Обычно хранение этой информации в базе данных гарантирует, что она доступна сразу и лучше масштабируется. Пользовательские утверждения обычно лучше использовать для менее изменчивых вещей, таких как идентификация администратора приложения. Подробнее об этом см. Видео Пять советов по обеспечению безопасности приложения .

Тем не менее, вы можете принудительно перезагрузить профиль пользователя , чтобы получить последние изменения токена (включая утверждения). Если это не сработает, пользователь должен будет выйти и войти снова.

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