Теперь мы собираемся настроить учетную запись auth0 или нашу аутентификацию для наших конечных точек и провести быстрый обзор нашего файла package.json.

Давайте сначала настроим нашу учетную запись auth0. Перейдите по этой ссылке.



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

Затем сделайте его личным аккаунтом, пусть он будет разработчиком и превратит свой проект в Just Playing Around.

Теперь вы попадете на панель инструментов, в которой вы создадите новое приложение. Назовите свое приложение mern-ecommerce-app и сделайте его одностраничным приложением.

Начнем с настройки наших переменных в нашем файле .env. Мы перейдем на вкладку настроек. Затем вы скопируете client_id, auth0_domain и client_secret. Затем вставьте его в свой файл .env и назовите переменные REACT_APP_AUTH0_CLIENT_ID, REACT_APP_AUTH0_DOMAIN и REACT_APP_AUTH0_CLIENT_SECRET. ПРИМЕЧАНИЕ. Вам понадобится REACT_APP, чтобы вы могли получить доступ к этим переменным во внешнем интерфейсе.

REACT_APP_AUTH0_CLIENT_ID = <client id>
REACT_APP_AUTH0_CLIENT_SECRET = <client secret>
REACT_APP_AUTH0_DOMAIN = <auth0 domain>

Также укажите URL-адрес обратного вызова, равный http: // localhost: 3000 / auth / callback. Это позволяет auth0 автоматически возвращать этот URL-адрес в вашем интерфейсе. Следовательно, это устраняет необходимость в вызове axios в вашем интерфейсе. На вкладке настроек. ПРИМЕЧАНИЕ: та же вкладка, на которой мы находимся.

У нас есть переменные для настройки аутентификации. Перейдите в социальные сети и включите те, которые вам нужны. В этом случае нам нужно просто включить github и facebook, так как это самые простые из них для аутентификации.

Отлично, теперь у нас есть наши настройки. Давайте объясним, как наши данные распространяются с помощью Auth0.

  1. Он перенаправит пользователя в наш домен auth0.
  2. Затем он перейдет к выбранному пользователем социальному провайдеру.
  3. Социальный провайдер предоставляет доступ к Auth0
  4. Auth0 отправляет authorization_code на ваш сервер.
  5. Сервер отправляет обратно объект с client_id, client_secret, grant_type, redirect_uri и кодом, полученным на шаге 4.
  6. Auth0 отправляет access_token, который будет использоваться для запроса информации о пользователе.
  7. Сервер Получает access_token для обмена для получения информации о пользователе.
  8. Поэтому Auth0 отправляет обратно информацию о пользователе, где она настраивает информацию о пользователе для сеанса и помещает в нашу базу данных.
  9. Сервер перенаправляет пользователя обратно к клиенту.
  10. componentDidMount запускает вызов axios для запроса сеанса пользователя с сервера.
  11. Сервер отправляет информацию обратно клиенту.

Теперь давайте сделаем быстрый обзор того, как у нас настроен package.json. Посмотрите на наше свойство прокси в нашем package.json. У нас есть два прокси: один - это / auth / callback, который является базовым путем для auth0, а / api - это базовый путь для всех наших вызовов api к нашему бэкэнду. Целью является сам прокси с запущенным приложением порта.

 "proxy": {
"/auth/callback": {
"target": "http://localhost:5000"
},
"/api": {
"target": "http://localhost:5000"
}
},

Перед настройкой аутентификации измените конечную точку в вашем файле index.js, отвечающую за вход в систему, чтобы она соответствовала прокси-серверу auth0, и сделайте это получением.

//BEFORE
app.post('/api/login', userController.login);
//AFTER
app.get('/auth/callback', userController.login);

Наконец, давайте настроим нашу аутентификацию в нашем приложении. Перейдите в свой файл user_controller в папке server / controllers. Мы получим токен доступа пользователя (шаг 5), отправив вам почтовый запрос в домен auth0 через oauth. Затем передайте объект с необходимыми параметрами, такими как client_id, client_secret, code, grant_type и redirect_uri.

return axios.post(`https://${process.env.REACT_APP_AUTH0_DOMAIN}/oauth/token`, {
 client_id: process.env.REACT_APP_AUTH0_CLIENT_ID,
 client_secret: process.env.REACT_APP_AUTH0_CLIENT_SECRET,
 code: req.query.code,
 grant_type: 'authorization_code',
 redirect_uri: `http://${req.headers.host}/auth/callback`
}).then(accessTokenResponse => {
 //Now Get user info 
}).catch(err => console.log('Auth0 Axios Post backend Error------------', err));

Теперь мы получаем наш ответ с нашим токеном доступа, затем мы назначим переменную с именем accessToken для хорошей меры, чтобы назначить ее accessTokenResponse.data.access_token.

const accessToken = accessTokenResponse.data.access_token

Мы вернем вам запрос на получение auth0_domain, используя наш accessToken в качестве параметра запроса. Что вернет наши пользовательские данные. Мы будем использовать .find ({}) для нашей коллекции с этими данными, в первую очередь с идентификатором auth0, чтобы найти идентичного пользователя. Или он пополнит наши пользовательские коллекции в базе данных. В любом случае он назначает userData сеансу, а затем сохраняет сеанс в локальном хранилище перед перенаправлением пользователя домой.

return axios.get(`https://${process.env.REACT_APP_AUTH0_DOMAIN}/userinfo?access_token=${accessToken}`).then(userDataResponse => {
 //Destruct the  data from  from auth0
 const { name, nickname, email, picture, sub } =          userDataResponse.data;
 console.log('user data--------', userDataResponse.data);
  // res.status(200).json({message: 'mEssages'})
  User.findOne({auth0_id: sub}, (err, user) => {
  if(err) console.log('Login Error--------------', err);
  //If the user is undefined.
  if(!user) {
   //Create a new user.
  let newUser = new User({
   name: name,
   email: email,
   username: nickname,
   profile_picture: picture,
   auth0_id: sub
  });
 //Assign the user to the session.
  req.session.user = newUser;
  //Save the session
  req.session.save();
  //Save the newUser instance to mongodb
  newUser.save();
 }
  req.session.user = user;
  req.session.save();
  res.redirect('/');
 })
 }).catch(err => console.log('Auth0 get user info Error------------', err));

Заметили что-то не так? В нашей модели нет свойства profile_picture, поэтому перейдите в папку моделей и добавьте в файл user.js изображение профиля с типом данных String. Наша новая модель должна выглядеть так.

const user = new Schema({
//THis is where the user will login
//For Now we will be inserting test data
name: String,
email: String,
username: String,
auth0_id: String,
profile_picture: String
});

Пока мы добавляем свойства к моделям, мы добавим свойство изображения к продукту также в нашем файле product.js. Наша новая модель должна выглядеть так.

//Need an id, name, description, price,
//Id is created by default in mongodb
const product = new Schema({
name: String,
description: String,
price: Number,
picture: String
});

Теперь, когда у нас есть вся наша проверка подлинности. Мы будем обрабатывать все эти данные на переднем плане и добавим в наше приложение пару интересных функций. Auth0 может быть чрезвычайно утомительным и разочаровывающим, поэтому всегда связывайтесь со мной, если у вас возникнут проблемы, и отправляйте мне снимки вашего кода. Вот мой facebook, linkedin или instagram для помощи или комментариев ниже, так что я могу помочь.







Вот мой гитхаб для справки:



Теперь закончим auth0.



Удачного кодирования!