81 lines
3.9 KiB
Markdown
81 lines
3.9 KiB
Markdown
---
|
||
id: 589a8eb3f9fc0f352b528e72
|
||
title: Реалізація соціальної автентифікації ІІІ
|
||
challengeType: 2
|
||
forumTopicId: 301558
|
||
dashedName: implementation-of-social-authentication-iii
|
||
---
|
||
|
||
# --description--
|
||
|
||
Кінцева частина стратегії керує профілем поверненим з GitHub. Якщо існує об'єкт бази даних користувача, необхідно його завантажити. У разі відсутності, потрібно його створити. Потім заповнюємо поля профілю і повертаємо об'єкт користувача. У межах кожного профілю GitHub надає нам унікальний *id*, який можна використовувати для пошуку для того, щоб серіалізувати користувача (уже реалізовано). Нижче наведено приклад реалізації, який ви можете використовувати у вашому проєкті - це відбувається завдяки функції, яка є другим аргументом для нової стратегії, нижче де `console.log(profile);` наразі є:
|
||
|
||
```js
|
||
myDataBase.findOneAndUpdate(
|
||
{ id: profile.id },
|
||
{
|
||
$setOnInsert: {
|
||
id: profile.id,
|
||
name: profile.displayName || 'John Doe',
|
||
photo: profile.photos[0].value || '',
|
||
email: Array.isArray(profile.emails)
|
||
? profile.emails[0].value
|
||
: 'No public email',
|
||
created_on: new Date(),
|
||
provider: profile.provider || ''
|
||
},
|
||
$set: {
|
||
last_login: new Date()
|
||
},
|
||
$inc: {
|
||
login_count: 1
|
||
}
|
||
},
|
||
{ upsert: true, new: true },
|
||
(err, doc) => {
|
||
return cb(null, doc.value);
|
||
}
|
||
);
|
||
```
|
||
|
||
`findOneAndUpdate` дозволяє шукати та оновлювати об'єкт. У разі, якщо об'єкта не існує, його вставлять та зроблять доступним для функції зворотнього зв'язку. У цьому прикладі, ми завжди встановлюємо `last_login`, збільшуємо `login_count` на `1` та після додавання нового об'єкту (користувача) лише заповнюємо більшість полів. Зверніть увагу на використання значень за замовчуванням. Іноді повернений профіль не міститиме усієї інформації або ж користувач зробить її приватною. У такому випадку, ви його обробляєте задля уникнення помилки.
|
||
|
||
Ви повинні мати змогу увійти в ваш додаток прямо зараз — спробуйте!
|
||
|
||
Підтвердьте сторінку, якщо все виконано вірно. Якщо виникла помилка, ви можете перевірити виконання проєкту до цього етапу [тут](https://gist.github.com/camperbot/183e968f0e01d81dde015d45ba9d2745).
|
||
|
||
# --hints--
|
||
|
||
Ви повинні завершити налаштування стратегії GitHub.
|
||
|
||
```js
|
||
(getUserInput) =>
|
||
$.get(getUserInput('url') + '/_api/auth.js').then(
|
||
(data) => {
|
||
assert.match(
|
||
data,
|
||
/GitHubStrategy[^]*myDataBase/gi,
|
||
'Strategy should use now use the database to search for the user'
|
||
);
|
||
assert.match(
|
||
data,
|
||
/GitHubStrategy[^]*return cb/gi,
|
||
'Strategy should return the callback function "cb"'
|
||
);
|
||
},
|
||
(xhr) => {
|
||
throw new Error(xhr.statusText);
|
||
}
|
||
);
|
||
```
|
||
|
||
# --solutions--
|
||
|
||
```js
|
||
/**
|
||
Backend challenges don't need solutions,
|
||
because they would need to be tested against a full working project.
|
||
Please check our contributing guidelines to learn more.
|
||
*/
|
||
```
|