Нет пользователя в signinSilentCallback с использованием identityserver и oidc-клиента javascript

Я получаю пользователя undefined в следующем коде.

У меня уже есть аутентифицированный пользователь из MVC.

Но когда я использую signinSilentCallback для получения подробной информации об этом пользователе, он становится неопределенным с использованием oidc-client в js.

Это тоже не дает никаких ошибок.

        var mgr = new UserManager({
                    authority: "http://localhost:5000",
                    client_id: "js",
                    redirect_uri: "http://localhost:50144/signin-oidc",
                    silent_redirect_uri: "http://localhost:50144/signin-oidc",
                    response_type: "id_token token",
                    post_logout_redirect_uri: "http://localhost:50144/signout-callback-oidc",
                });

        mgr.signinSilentCallback().then(function (user) {

            //**Here user is undefined.**
            axios.defaults.headers.common['Authorization'] = "Bearer " + user.access_token;

        });

В Identityserver 4 клиент определяется следующим образом.

new Client
                {
                    ClientId = "js",
                    ClientName = "js",
                    ClientUri = "http://localhost:50144",

                    AllowedGrantTypes = GrantTypes.Implicit,
                    AllowAccessTokensViaBrowser = true,
                    RequireClientSecret = false,
                    AccessTokenType = AccessTokenType.Jwt,

                    RedirectUris = 
                    {
                        "http://localhost:50144/signin-oidc",
                    },

                    PostLogoutRedirectUris = { "http://localhost:50144/signout-callback-oidc" },
                    AllowedCorsOrigins = { "http://localhost:50144" },

                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        IdentityServerConstants.StandardScopes.Email
                    }
                }

person Anonymous Creator    schedule 18.05.2018    source источник


Ответы (2)


signinSilentCallback: возвращает обещание уведомить родительское окно об ответе от конечной точки авторизации. https://github.com/IdentityModel/oidc-client-js/wiki

signinSilentCallback - это не то, что вернет вам объект пользователя.

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

this.userManager.events.addAccessTokenExpiring(() =>
            {
                this.userManager.signinSilent({scope: oidcSettings.scope, response_type: oidcSettings.response_type})
                    .then((user: CoreApi.Authentication.Interfaces.OidcClientUser) =>
                    {
                        this.handleUser(user); // This function just set the current user
                    })
                    .catch((error: Error) =>
                    {
                        this.userManager.getUser()
                            .then((user: CoreApi.Authentication.Interfaces.OidcClientUser) =>
                            {
                                this.handleUser(user);
                            });
                    });
            });

Нам также необходимо обработать getUser в catch из-за одной из ошибок, обнаруженных для iFrame в oidc-client js

Приведенный выше код фокусируется на том, как выполняется автоматическое обновление по истечении срока действия токена.

person Sohan    schedule 21.05.2018
comment
Моя проблема возникла в результате определения Typescript, в котором явно указано, что это Promise ‹User›: signinSilentCallback(url?: string): Promise<User | undefined>;. Теперь я вижу, что он никогда не вернет объект User. Спасибо за указание на это. - person codeMonkey; 06.04.2020

вы можете установить для automaticSilentRenew значение true в своей конфигурации

var mgr = new UserManager({
                authority: "http://localhost:5000",
                client_id: "js",
                redirect_uri: "http://localhost:50144/signin-oidc",
                silent_redirect_uri: "http://localhost:50144/signin-oidc",
                response_type: "id_token token",
                post_logout_redirect_uri: "http://localhost:50144/signout-callback-oidc",
                automaticSilentRenew: true; //here

            });

и вы можете использовать события UserManager для загрузки нового пользователя при обновлении токена

this.mgr.events.addUserLoaded(args => {
  this.mgr.getUser().then(user => {
    this._user = user; // load the new user
  });
});
person Fateh Mohamed    schedule 14.08.2018
comment
Привет! Это addUserLoaded() обновляет данные профиля пользователя в хранилище сеанса? - person Todarmal; 04.09.2019
comment
да тихое обновление всегда обновляет ключ в вашем хранилище сеанса, addUserLoaded - это событие всякий раз, когда появляется новый пользователь, он запускается (запускается после каждого тихого обновления) - person Fateh Mohamed; 04.09.2019
comment
Мне действительно нужно часто это проверять. Есть ли способ уменьшить интервал истечения срока действия токена, чтобы часто запускалось тихое обновление? - person Todarmal; 04.09.2019
comment
да, вы можете изменить это в своей личности, в клиенте, я думаю, что ключ называется временем жизни accesstoken - person Fateh Mohamed; 04.09.2019
comment
Я действительно зациклен, не могли бы вы объяснить, что вы подразумеваете под идентичностью в клиенте? - person Todarmal; 04.09.2019
comment
на вашем сервере идентификации есть конфигурация для каждого клиента, вы можете изменить время жизни tken доступа там - person Fateh Mohamed; 04.09.2019
comment
Я долго боролся с этим, пока не начал обрабатывать событие UserLoaded, устанавливая новый объект пользователя в поле моего контроллера. Точное следование примерам и руководствам из OIDC Client Wiki на самом деле не принесло особой пользы, поскольку они не упоминают ничего подобного - если только я здесь не тупой и слепой :) Ура! - person haugan; 09.12.2019
comment
Просто хотел добавить небольшой комментарий, который авторы oidc-client рекомендуют не использовать automaticSilentRenew и сожалеют о добавлении его в библиотеку. Рекомендуемый подход изложен в принятом ответе на этот вопрос. Этот комментарий предназначен для людей, которые ищут в Google способы реализации этого материала. Замечу, что этот ответ, вероятно, был опубликован до того, как авторы высказали свои мысли по поводу automaticSilentRenew. - person onefootswill; 21.01.2020
comment
@onefootswill У вас есть ссылка на статью или что-то, что объясняет больше о том, почему automaticSilentRenew плохой, и где авторы выражают свои мысли по этому поводу? - person SnorreDan; 03.03.2020
comment
@SnorreDan Взгляните на этот комментарий к этой проблеме GIT github. com / IdentityModel / oidc-client-js / issues / Комментарий оставлен автором. - person onefootswill; 03.03.2020