Интеграция Vue js с сервером идентификации 4

Я реализую identity server 4 с vue js на стороне клиента.

В настоящее время у меня есть только логин администратора в приложении с паролем и именем пользователя.

У меня нет общедоступного сайта, с которого ПОЛЬЗОВАТЕЛЬ перенаправляется для входа в систему. Я хотел, чтобы пользователь перенаправлялся на страницу входа напрямую, когда он нажимал URL-адрес клиента приложения.

В настоящее время в пробной версии identity server 4 пользователю необходимо нажать кнопку входа в систему на панели навигации и перенаправить его для входа.

Я хотел сделать следующими способами:

  1. Клиент Нажмите URL. Проверьте, аутентифицирован ли пользователь или нет.
  2. Перенаправление на сервер идентификации.
  3. Войти с помощью имени пользователя/пароля
  4. Перенаправление на клиентский портал после успешного входа в систему.

Мне очень трудно интегрировать этот подход в vue js.

В моей текущей реализации приложение всегда работает в цикле и всегда перенаправляется для входа.

store.getters.isAuthenticated никогда не бывает истинным и всегда перенаправляет приложение с помощью SignIn.

Я не мог понять, пропустил ли я что-то в своем router.beforeEach или что-то в реализации oidc.

Маршруты:

export const routes = [
  {
    component: Full,
    path: "/",
    meta: {
      requiresAuth: true
    },
    children: [
      {
        path: "/dashboard",
        name: "Dahboard",
        component: DashboardView,
        meta: {
          requiresAuth: true
        }
      },
      {
        path: "/signin",
        component: Signin
      },
      {
        path: "/company",
        component: Company,
        meta: {
          requiresAuth: true
        }
      }
    ]
  }
];

import Vue from "vue";
import VueRouter from "vue-router";
import { routes } from "./routes";
import store from '../store'

Vue.use(VueRouter);

let router = new VueRouter({
  mode: "history",
  routes
});

export default router;
router.beforeEach((to, from, next) => {
  if (store.getters.isAuthenticated) {
    const notValid = ['/signin', '/signup']

    if (notValid.lastIndexOf(to.path) >= 0) {
      next({
        path: '/dashboard'
      })
    } else if (to.path === '/signout') {
      store.commit('removeAuthentication')
      next({
        path: '/'
      })
    } else {
      next()
    }
  } else if (to.matched.some(record => record.meta.requiresAuth)) {
    next({
      path: '/signin',
      query: {
        redirect: to.fullPath
      }
    })
  } else if (to.path === '/signout') {
    next({
      path: '/'
    })
  } else {
    next()
  }
})

Компонент входа:

import authService from './authService';

export default {
    name: 'Auth',
    mounted() {
        authService.login();
        authService.completeLogin();
    }
};

Config.js

export default {
    authority: "https://localhost:44350",
    client_id: "js",
    redirect_uri: `${domain}/signin`,
    response_type: "id_token token",
    scope:"openid profile api1",
    post_logout_redirect_uri : `${domain}`,
    silent_redirect_uri: `${domain}/silent.html`,
}

Логин: this.userManager.signinRedirect()

полныйЛогин: this.userManager.signinRedirectCallback()

Тихий.html:

new Oidc.UserManager().signinSilentCallback()
.catch(function (error) {
    console.error(error);
});

person aakash    schedule 07.04.2018    source источник
comment
Вероятно, вам следует пометить свой вопрос тегом openid-connect (протокол реализует сервер Identity) и oidc-client библиотекой, которую вы используете на стороне SPA.   -  person mode777    schedule 07.04.2018


Ответы (1)


Я не уверен, что все правильно понимаю, и я никогда не работал с Vue. Но позвольте мне описать типичный неявный поток, который, как я предполагаю, вы хотите получить здесь:

  1. Пользователь попадет на ваш сайт без аутентификации (например, yoursite.com/dashboard)
  2. AuthService попытается войти в систему пользователя, т. е. он будет перенаправлен на страницу входа на сервер идентификации.
  3. Если у пользователя нет действительного сеанса на сервере идентификации, ему будет предложено ввести учетные данные. В противном случае он/она будет немедленно перенаправлен обратно на запрошенный URI вашего сайта (например, yoursite.com/signin).
  4. В этот момент пользователь вернулся на ваш сайт, но все еще не вошел в систему. Вы заметите, что URL-адрес будет содержать много дополнительного текста после символа «#» (например, yoursite.com/singin#access_token=ey456...)
  5. Когда вы вызываете completeLogin(), oidc-client прочитает эти данные и сохранит их (например, в хранилище сеансов вашего браузера) - после завершения этого метода ваш пользователь войдет в систему, и вы сможете перенаправить его/ее на исходный сайт (например, yoursite.com/dashboard)

Вы, вероятно, получите бесконечный цикл между шагами 1-4, потому что вы никогда не позволяете шагу 5 произойти, поэтому вход в систему никогда не завершается.

Попробуйте изменить компонент входа

import authService from './authService';

export default {
    name: 'Auth',
    mounted() {
        //authService.login(); -- This line will redirect the user again before the login can complete
        authService.completeLogin();
    }
};

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

person mode777    schedule 07.04.2018
comment
Да, вы правы, я получаю цикл на шаге 4. Он каждый раз перенаправляется с одним и тем же URL-адресом токена. Полный вход в систему никогда не происходит. Итак, где мне вызвать 'signinRedirect()'? - person aakash; 08.04.2018
comment
Это зависит от варианта использования. Вызовите signInRedirect() всякий раз, когда пользователь должен быть аутентифицирован, но еще не аутентифицирован. Например. перед загрузкой определенного маршрута или когда пользователь нажимает кнопку входа. Не вызывайте signinredirect перед загрузкой или внутри компонента sigin, так как это вызовет цикл. - person mode777; 08.04.2018
comment
Да, то же самое происходит в моем приложении, я делаю все так, как вы говорите, что этого делать нельзя. Но я поражен, чтобы убрать это из SignIn. Потому что мне нужно перенаправить мое приложение на компонент SignIn после проверки того, аутентифицирован ли маршрут или нет. и он движется в цикле, потому что completeLogin() никогда не завершается. - person aakash; 08.04.2018
comment
Хорошо, вот ваша ошибка: доступ к компонентам входа должен быть доступен после входа пользователя в систему. Вы должны настроить маршрутизацию, чтобы сервер идентификации мог перенаправить ее, например. http://yoursite.com/signin, и он должен быть доступен без входа в систему. Вам не нужен компонент входа перед входом в систему, потому что вы можете просто вызвать signInRedirect(), когда пользователь должен войти в систему. - person mode777; 08.04.2018
comment
Да, я немного приблизился к вашей точке зрения. Но у меня не будет кнопки входа в систему или чего-либо, что могло бы вызвать signInRedirect(). Мне нужно активировать это в основном URL-адресе приложения. В настоящее время я делаю это в SignIn Component. Но где я должен реализовать логику для запуска signInRedirect? Что ты посоветуешь? - person aakash; 08.04.2018
comment
Итак, вам нужно что-то, чтобы вызвать перенаправление входа, когда пользователь пытается получить доступ к защищенному маршруту и ​​еще не аутентифицирован. В вашем случае защищены все маршруты, кроме конечной точки sigin. Я не знаю, как это сделать в vue, но у angular есть охранники, которые вы можете настроить для запуска до загрузки маршрута - я думаю, что vue имеет что-то подобное - person mode777; 08.04.2018
comment
Да, vue также имеет то же самое, что я показал в своем вопросе. router.beforeEach((to, from, next) => {}. - person aakash; 08.04.2018
comment
Просто быстрый вопрос. Нужно ли очищать куки в браузере при выходе из системы? Потому что я все еще вхожу в систему, когда выхожу из учетной записи. - person aakash; 09.04.2018
comment
когда вы получаете доступ к выходу на сервере идентификации, он должен делать это автоматически — если вы используете удостоверение aspnet. На клиенте oidc-client также должен очистить хранилище сеансов. - person mode777; 09.04.2018
comment
Да, я использую идентификатор Asp.net. и я хранил access_token в файлах cookie. Но this.userManager.signoutRedirect() перенаправляет меня, но не очищает куки. - person aakash; 09.04.2018
comment
Давайте продолжим обсуждение в чате. - person mode777; 09.04.2018
comment
Спасибо за вашу огромную помощь. - person aakash; 09.04.2018
comment
Пожалуйста, нужна ваша помощь в этом. stackoverflow.com/questions/50197603 / - person aakash; 06.05.2018