страницы razor с авторизацией firebase — куда поместить этот токен? :)

#firebase-authentication #razor-pages

#firebase-аутентификация #страницы razor

Вопрос:

я работаю над веб-сайтом со страницами razor. часть сайта должна быть доступна только зарегистрированным пользователям. решил использовать аутентификацию firebase (теперь с логином и паролем).

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

             services.AddRazorPages(options =>
            {
                options.Conventions.AuthorizeAreaFolder("User", "/");
            })
 

добавлено промежуточное программное обеспечение jwt

  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
 

добавлен код на страницу входа в систему для вызова firebase для получения токена

    function login()
        {
            firebase.auth().signInWithEmailAndPassword(email, password)
                .then((userCredential) => {
                    // Signed in
                    var user = userCredential.user;
                    // ...
                    alert("signed");
                })
                .catch((error) => {
                    var errorCode = error.code;
                    var errorMessage = error.message;
                    alert(errorMessage);
                });
        }
 

получил токен из firebase.

если бы я вызвал сервис next, я бы просто поместил токен в заголовок «bearer».

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

как я понимаю, мне нужно, чтобы этот токен добавлялся в заголовок auth? как ? 🙂

чувствую себя глупо; (пытался погуглить, но большинство примеров предназначены для использования этого токена позже с вызовами api. или я иду в неправильном направлении?

тиа иш

Ответ №1:

хорошо. кажется, что невозможно добавить bearer из js, поэтому я переключился на cookies

в startup.cs используйте файлы cookie

   options.Events = new JwtBearerEvents
                    {
                        OnMessageReceived = context =>
                        {
                            context.Token = context.Request.Cookies["bearer"];
                            return Task.CompletedTask;
                        }
                    };
 

код для входа в систему с помощью firebase, поместите токен в файл cookie и перенаправьте

         function login() {
            firebase.auth().signInWithEmailAndPassword(email, password)
                .then((userCredential) => {
                    // Signed in
                    var user = userCredential.user;
                    firebase.auth().currentUser.getIdToken(true).then(function (idToken)
                    {
                        document.cookie = "bearer"   "="   idToken;
                        window.location.href = "/user/index";
                    }).catch(function (error) {
                        // Handle error
                    });
                    alert("signed");
                })
                .catch((error) => {
                    var errorCode = error.code;
                    var errorMessage = error.message;
                    alert(errorMessage);
                });
        }
 

или то же самое с FirebaseUI

         function login1()
        {
            ui.start('#firebaseui-auth-container', {
                signInSuccessUrl: '/User/index',
                signInOptions: [
                    {
                        provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
                        requireDisplayName: false
                    }
                ],
                callbacks:
                {
                    signInSuccessWithAuthResult: function (authResult, redirectUrl)
                    {
                        var user = authResult.user;
                        firebase.auth().currentUser.getIdToken(true).then(function (idToken) {
                            document.cookie = "bearer"   "="   idToken;
                        }).catch(function (error) {
                            // Handle error
                        });
                        return true;
                    }
                }
            });
        }