115 lines
5.1 KiB
Markdown
115 lines
5.1 KiB
Markdown
![]() |
---
|
|||
|
id: 589a69f5f9fc0f352b528e71
|
|||
|
title: Реалізація соціальної автентифікації ІІ
|
|||
|
challengeType: 2
|
|||
|
forumTopicId: 301557
|
|||
|
dashedName: implementation-of-social-authentication-ii
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
Остання частина налаштування автентифікації GitHub – це створення самої стратегії. Для цього вам потрібно буде додати залежність від `passport-github@~1.1.0` до вашого проєкту та викликати її у своєму `auth.js` як `GithubStrategy`, це: `const GitHubStrategy = require('passport-github').Strategy;`. Не забудьте викликати та налаштовувати `dotenv` для використання змінних середовища.
|
|||
|
|
|||
|
Щоб налаштувати стратегію GitHub, ви повинні сказати Passport використовувати примірник `GitHubStrategy`, який приймає 2 аргументи: об'єкт (який містить `clientID`, `clientSecret` та `callbackURL`) та функцію, яку слід викликати після успішної автентифікації користувача, яка визначатиме, чи є користувач новим і які поля спочатку зберегти в об’єкті бази даних користувача. Це типово для багатьох стратегій, але деяким може знадобитися більше інформації, як зазначено в цій конкретній стратегії GitHub README. Наприклад, так Google вимагає *scope*, що визначає, яку інформацію просить повернути ваш запит, і просить користувача надати дозвіл на такий доступ. Використання поточної стратегії, яку ми впроваджуємо описане [тут](https://github.com/jaredhanson/passport-github/), але ми все це розглянемо тут, на freeCodeCamp!
|
|||
|
|
|||
|
Ось як ваша нова стратегія має виглядати на цьому етапі:
|
|||
|
|
|||
|
```js
|
|||
|
passport.use(new GitHubStrategy({
|
|||
|
clientID: process.env.GITHUB_CLIENT_ID,
|
|||
|
clientSecret: process.env.GITHUB_CLIENT_SECRET,
|
|||
|
callbackURL: /*INSERT CALLBACK URL ENTERED INTO GITHUB HERE*/
|
|||
|
},
|
|||
|
function(accessToken, refreshToken, profile, cb) {
|
|||
|
console.log(profile);
|
|||
|
//Database logic here with callback containing our user object
|
|||
|
}
|
|||
|
));
|
|||
|
```
|
|||
|
|
|||
|
Ваша автентифікація ще не є успішною, і насправді видасть помилку без логіки бази даних та зворотного виклику, але вона повинна зареєструвати ваш профіль GitHub на вашій консолі, якщо ви це спробуєте!
|
|||
|
|
|||
|
Підтвердьте сторінку, якщо все зрозуміло. Якщо виникла помилка, ви можете перевірити виконання проєкту до цього етапу [тут](https://gist.github.com/camperbot/ff3a1166684c1b184709ac0bee30dee6).
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
Необхідно додати залежність passport-github.
|
|||
|
|
|||
|
```js
|
|||
|
(getUserInput) =>
|
|||
|
$.get(getUserInput('url') + '/_api/package.json').then(
|
|||
|
(data) => {
|
|||
|
var packJson = JSON.parse(data);
|
|||
|
assert.property(
|
|||
|
packJson.dependencies,
|
|||
|
'passport-github',
|
|||
|
'Your project should list "passport-github" as a dependency'
|
|||
|
);
|
|||
|
},
|
|||
|
(xhr) => {
|
|||
|
throw new Error(xhr.statusText);
|
|||
|
}
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
Слід вказати passport-github.
|
|||
|
|
|||
|
```js
|
|||
|
(getUserInput) =>
|
|||
|
$.get(getUserInput('url') + '/_api/auth.js').then(
|
|||
|
(data) => {
|
|||
|
assert.match(
|
|||
|
data,
|
|||
|
/require.*("|')passport-github("|')/gi,
|
|||
|
'You should have required passport-github'
|
|||
|
);
|
|||
|
},
|
|||
|
(xhr) => {
|
|||
|
throw new Error(xhr.statusText);
|
|||
|
}
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
Стратегію GitHub слід правильно налаштувати.
|
|||
|
|
|||
|
```js
|
|||
|
(getUserInput) =>
|
|||
|
$.get(getUserInput('url') + '/_api/auth.js').then(
|
|||
|
(data) => {
|
|||
|
assert.match(
|
|||
|
data,
|
|||
|
/passport\.use.*new GitHubStrategy/gis,
|
|||
|
'Passport should use a new GitHubStrategy'
|
|||
|
);
|
|||
|
assert.match(
|
|||
|
data,
|
|||
|
/callbackURL:\s*("|').*("|')/gi,
|
|||
|
'You should have a callbackURL'
|
|||
|
);
|
|||
|
assert.match(
|
|||
|
data,
|
|||
|
/process\.env(\.GITHUB_CLIENT_SECRET|\[(?<q>"|')GITHUB_CLIENT_SECRET\k<q>\])/g,
|
|||
|
'You should use process.env.GITHUB_CLIENT_SECRET'
|
|||
|
);
|
|||
|
assert.match(
|
|||
|
data,
|
|||
|
/process\.env(\.GITHUB_CLIENT_ID|\[(?<q>"|')GITHUB_CLIENT_ID\k<q>\])/g,
|
|||
|
'You should use process.env.GITHUB_CLIENT_ID'
|
|||
|
);
|
|||
|
},
|
|||
|
(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.
|
|||
|
*/
|
|||
|
```
|