www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Создайте REST API с помощью Node и PostgreSQL

Дата публикации Oct 3, 2019

PostgreSQL - это надежная реляционная база данных с открытым исходным кодом, которая поддерживает некоторые из крупнейших в мире приложений.
В этой статье мы узнаем, как создать REST API в Node, который использует Postgres в качестве хранилища данных.

В частности, я собираюсь рассказать вам о создании API, который будет отслеживать фильмы, которыми вы владеете (или имеете доступ) через различные источники (например, DVD-диски и Netflix).
После этого вы сможете запросить этот API, чтобы узнать, какое приложение вам нужно открыть, чтобы получить доступ к фильму, который вы хотите посмотреть.
К концу этой статьи вы узнаете, как создать этот API-интерфейс с помощью Node и Postgres и как защитить свой API-интерфейс с помощью OAuth 2.

Настройте свой узел + зависимости Postgres
Для этого урока мы будем использовать Node 10.5.3.
Вам, вероятно, будет хорошо, если вы используете более позднюю версию или даже Node 8, но если вы используете 0.12, вы можете столкнуться с некоторыми проблемами.
Если у вас еще не установлен Node, самый простой способ - использовать NVM, который позволяет вам устанавливать несколько версий одновременно и делает обновление до последней версии таким же простым, как установочный узел nvm.
Если у вас не установлен Node или NVM, используйте следующую команду для установки NVM:

завитокhttps://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh| удар

Если по какой-то причине это не сработает, в зависимости от вашей системы, вы можете найти дополнительную информацию по устранению неполадок здесь.

Установить PostgreSQL

Я использую PostgreSQL версии 10.4. Я не буду использовать сложные запросы в этом руководстве, поэтому, если у вас установлена ​​другая версия, это не должно быть проблемой.
Postgres поставляется предварительно установленным на некоторых системах. Чтобы проверить, установлен ли Postgres, выполните следующую команду:

postgres - версия

Вы должны получить что-то вроде: postgres (PostgreSQL) 10.4. Если вместо этого вы получите сообщение об ошибке, например bash: postgres: команда не найдена, значит, вы еще не установили ее.
Чтобы установить Postgres, в идеале вам понадобится менеджер пакетов. Если вы используете дистрибутив Linux на основе Debian, вы можете просто запустить:

sudo apt-get установить postgresql-10

Если вы используете MacOS и у вас установлен Homebrew, вы можете просто запустить:

brew установить postgresql

Для любых других операционных систем посетите страницу Загрузок PostgreSQL, чтобы получить помощь в настройке и запуске.

Создать базу данных Postgres
После того, как вы установили Postgres, вам нужно будет создать базу данных для подключения этого приложения.
Введите psql для подключения к серверу Postgres, затем введите create database movie_catalog.

Создайте приложение базового узла
Для начала создайте новый каталог для хранения вашего приложения (например, каталог фильмов).
Затем введите каталог из командной строки (cd movie-catalogue) и введите npm init для инициализации вашего проекта Node (и создания файла package.json):

$ npm init

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

Смотрите `npm help json` для полной документации по этим полям и как именно они работают.

Используйте `npm install`затем установить пакет и
сохраните его как зависимость в файле package.json.

Нажмите ^ C в любое время, чтобы выйти.

название пакета: (фильм-каталог)
версия: (1.0.0) 0.1.0
описание: API каталога фильмов
точка входа: (index.js) src / index.js
тестовая команда:
Git репозиторий:
ключевые слова:
автор:
лицензия: (ISC) Apache-2.0

О том, чтобы написать в /Users/bmk/code/okta/apps/movie-catalog/package.json:

{
«Имя»: «фильм-каталог»,
«Версия»: «0.1.0»,
«Описание»: «API каталога фильмов»,
«Main»: «src / index.js»,
«Сценарии»: {
«Test»: «echo \» Ошибка: тест не указан \ & & exit 1 "
},
«Автор»: «»,
«Лицензия»: «Apache-2.0»
}

Это нормально? (да)

Как правило, файлы конфигурации вашего приложения будут находиться в корне папки вашего проекта, а исходный код - в отдельной папке.
Создайте новую папку src для хранения вашего кода:

MKDIR SRC

Если вы планируете использовать git для управления исходным кодом, вам также следует создать файл .gitignore, чтобы убедиться, что вы не завершите фиксацию каталога monstrous node_modules.
Позже вы также будете использовать файл .env, который не хотите фиксировать.
Создайте файл с именем .gitignore в корневом каталоге вашего проекта и скопируйте следующее содержимое:

node_modules
.env

Затем вам нужно отсортировать схему базы данных. Один из способов сделать это - использовать ORM под названием Sequelize.
Вам необходимо установить зависимости, необходимые для Sequelize, а также библиотеки, необходимые для подключения к Postgres.

npm install [email protected] [email protected]

Создайте новый файл src / database.js.
Здесь вы настроите базу данных Sequelize и модели, необходимые для запуска каталога фильмов.
Вы будете получать информацию о заголовке от третьей стороны, которую вы можете хранить в JSON (используя тип Postgres JSONB) и получать к ней доступ или делать запросы напрямую.
Вы также создадите таблицу для хранения информации о том, какие услуги имеет пользователь (например, Netflix, Hulu, DVD и т. Д.).
Затем вам понадобится стол для соединения двух; Вы можете использовать эту таблицу для предоставления дополнительной информации, такой как местоположение, в случае фильма на DVD или Blu-ray.

const Sequelize = require (‘sequelize’)

const database = new Sequelize ({
база данных: "movie_catalog",
диалект: «postgres»,
Операторы Алиас: Sequelize.Op
})

const Title = database.define (‘title’, {
id: {type: Sequelize.STRING, primaryKey: true},
title: {type: Sequelize.JSONB, allowNull: false}
})

const Service = database.define ("service", {
userId: {type: Sequelize.STRING, уникальный: «user-name», allowNull: false},
name: {type: Sequelize.STRING, уникальный: «user-name», allowNull: false}
})

const TitleService = database.define ("title_service", {
местоположение: Sequelize.STRING
})

TitleService.belongsTo (Title, {
foreignKey: {allowNull: false, уникально: «title-service»},
onDelete: "каскад"
})

TitleService.belongsTo (Service, {
foreignKey: {allowNull: false, уникально: «title-service»},
onDelete: "каскад"
})

module.exports = {
Заглавие,
Обслуживание,
TitleService,
база данных
}

Затем настройте сервер Express, который будет обслуживать контент.
Вам нужно установить еще пару зависимостей:

npm install [email protected] [email protected] [email protected]

Теперь отредактируйте src / index.js:

const express = require (‘express ')
const cors = требуется (‘cors’)
const bodyParser = require ("body-parser")

const {база данных} = требуется (/ ./ база данных ’)

const port = process.env.SERVER_PORT || 3000

const app = express ()
app.use (CORS ())
app.use (bodyParser.json ())

// TODO: удалите эту функцию и фактически осуществите аутентификацию
app.use (‘/’, (req, res, next) => {
req.userId = ‘TODO’
следующий()
})

// TODO: Добавить маршруты

database.sync (). then (() => {
app.listen (port, () => {
console.log (`Прослушивание порта $ {port}`)
})
})

Пока что это ничего не делает.
Вы можете запустить его, запустив узел, но на самом деле он просто размещает сервер без маршрутов.
Вам нужно будет добавить их дальше. Этот код также заглушается в идентификаторе пользователя TODO, который вы исправите позже.
До тех пор ваш API будет принимать только одного пользователя.

Получить названия фильмов с узла
Чтобы получить метаданные о фильме или телешоу, вам нужно использовать сторонний API.
Легко начать с The Open Movie Database.
Вам необходимо зарегистрировать бесплатный ключ API и подтвердить свой адрес электронной почты.
Получив ключ API, создайте новый файл с именем .env в корневом каталоге и добавьте ключ API:

OMDB_API_KEY = abcd1234

Вам также необходимо добавить пару новых зависимостей.
Чтобы прочитать файл .env и добавить значения в качестве переменных среды, к которым вы можете получить доступ в коде, вам необходимо установить dotenv.
Для извлечения фильмов вам понадобится извлечение узла, которое предоставляет тот же API, который есть у браузеров по умолчанию, и более прост в использовании, чем встроенный API Node:

npm install [email protected] [email protected]

Чтобы dotenv мог творить чудеса, вам нужно добавить следующую строку в самый верх src / index.js.
Это должен быть первый фрагмент кода:

требовать ( «dotenv»). конфиг ()

Чтобы найти названия фильмов, вы, по сути, напишите простую обертку над API OMDb.
Это позволит вам хранить все необходимое в одном месте.
Чтобы было еще проще, давайте создадим служебный файл в src / omdb.js, который даст вашему коду простой способ поиска заголовков:

const fetch = require (‘node-fetch’)

const {OMDB_API_KEY} = process.env
const API_URL = ‘https://www.omdbapi.com’

const search = асинхронный запрос => {
const url = новый URL (API_URL)
url.searchParams.set («apikey», OMDB_API_KEY)
url.searchParams.set ("v", 1)
url.searchParams.set (‘s’, запрос)

константный ответ = ожидание получения (URL)
const {
Ответ: успех,
Поиск: searchResults
} = await response.json ()

вернуть успех === "Верно"? результаты поиска : []
}

const getTitle = async id => {
const url = новый URL (API_URL)
url.searchParams.set («apikey», OMDB_API_KEY)
url.searchParams.set ("v", 1)
url.searchParams.set («я», id)

константный ответ = ожидание получения (URL)
const {
Ответ: успех,
Ошибка: ошибка,
…заглавие
} = await response.json ()

if (success === ‘True’) {
вернуть заголовок
}

кинь новую ошибку (error)
}

module.exports = {search, getTitle}

Теперь у вас есть две функции, которые позволяют вам искать заголовок по имени или выбирать более подробную информацию о заголовке по определенному идентификатору.
Теперь создайте новый файл src / title.js, который будет обрабатывать все действия, связанные с заголовком:

const express = require (‘express ')
const omdb = require (‘./ omdb’)

const router = express.Router ()

router.get (‘/’, async (req, res, next) => {
пытаться {
if (! req.query.s) выбрасывает новую ошибку («Требуется параметр поиска (` s`) »)

res.json (ожидайте omdb.search (req.query.s))
} catch (error) {
res.json ({error: error.message})
}
})

маршрутизатор get (‘/: id’, async (req, res, next) => {
пытаться {
res.json (ожидание omdb.getTitle (req.params.id))
} catch (error) {
res.json ({error: error.message})
}
})

module.exports = router

При использовании маршрутизаторов в Express ваши пути относительно пути, который вы указываете при использовании маршрутизатора.
В src / index.js добавьте следующее после комментария TODO, который вы оставили ранее:

app.use (‘/ title’, require (‘./ title’))

При использовании маршрутизаторов в Express маршруты зависят от того, где вы их добавили.
В файле src / title.js вы указали, что / route должен позволять вам искать заголовки.
Но в src / index.js вы указали, что маршрут должен быть относительно / title.
Поэтому, если вы перейдете к / title, вы сможете искать, и вы можете получить информацию для конкретного заголовка, используя / title /: id.

Перезагрузите сервер (вы можете нажать ctrl-c, чтобы остановить его, затем узел., Чтобы запустить его снова).
Чтобы проверить это сейчас, вы можете использовать curl в командной строке.

curl -s http: // localhost: 3000 / title? s = Fight + Club

Вы должны вернуть большой блок JSON.
Чтобы было легче читать, вы можете установить полезный инструмент командной строки:

npm install - global [email protected]

Попробуйте еще раз, отправив результаты в JSON.
Без каких-либо опций он покажет все в удобном для чтения формате.
Вот пара примеров с некоторыми опциями, которые извлекают некоторую соответствующую информацию:

$ curl -sHttp: // Localhost: 3000 / названия s = Гарри Поттер +| json -a название года imdbID | Сортировать
2001 Гарри Поттер и философский камень tt0241527
2002 Гарри Поттер и Тайная комната tt0295297
2002 Гарри Поттер и Тайная комната tt0304140
2004 Гарри Поттер и Узник Азкабана tt0304141
2005 Гарри Поттер и Кубок Огня tt0330373
2007 Гарри Поттер и Орден Феникса tt0373889
2009 Гарри Поттер и Принц-полукровка tt0417741
2010 Гарри Поттер и Дары смерти: Часть 1 tt0926084
2010 Гарри Поттер и Запретное Путешествие tt1756545
Гарри Поттер 2011 и Дары смерти: часть 2 tt1201607

$ curl -sHTTP: // локальный: 3000 / названия / tt0137523| JSON Название Год Режиссер Сценарист Актеры
Бойцовский клуб
1999
Дэвид Финчер
Чак Паланнюк (роман), Джим Улс (сценарий)
Эдвард Нортон, Брэд Питт, Мясной рулет, Зак Гренье

Взаимодействовать с Postgres используя Node
На этом этапе у вас должен быть простой API, который может получать информацию о названиях фильмов.
Теперь пришло время интегрировать Postgres в ваше приложение, чтобы вы могли отслеживать эти фильмы.

Создать сервисные маршруты узлов
Прежде чем вы спросите API, какие заголовки у вас есть (или у вас есть доступ), вам нужно создать сервис, чтобы указать, как вы можете смотреть данный фильм.
Создайте новый файл src / services.js и скопируйте в следующий код:

const express = require (‘express ')
const {Service} = требуется (‘./ база данных’)

const router = express.Router ()

router.get (‘/’, async (req, res, next) => {
const {userId} = req
res.json (жду Service.findAll ({
атрибуты: [‘id’, ‘name’],
где: {userId}
}))
})

router.post (‘/’, async (req, res, next) => {
пытаться {
const {userId} = req
const {name} = req.body
const {id} = await Service.create ({userId, name})
res.json ({success: true, id})
} catch (error) {
res.json ({success: false, error: error.message})
}
})

router.delete (‘/: id’, async (req, res, next) => {
пытаться {
const {userId} = req
const {id} = req.params
if (ожидайте Service.destroy ({где: {userId, id}})) {
res.json ({success: true})
}
} catch (error) {}

res.json ({success: false, error: ‘Invalid ID’})
})

module.exports = router

Вам также нужно добавить маршрут в src / index.js, сразу после маршрута / title, который вы добавили выше:

app.use (‘/ services’, require (‘./ services’))

Это дает вам три различных варианта маршрута / services.
Вы можете отправить запрос GET для просмотра всех ваших услуг, запрос POST для добавления нового или запрос DELETE для удаления одного из них.

Попробуйте это:

$ curl -sH ‘Content-Type: application / json’ http: // localhost: 3000 / services
[]

$ curl -sH ‘Content-Type: application / json’Http: // Localhost: 3000 / услуг-XPOST -d ‘{« имя »:« Netflix »}’
{ «Успех»: правда,»идентификатор»: 1}

$ curl -sH ‘Content-Type: application / json’Http: // Localhost: 3000 / услуги-XPOST -d ‘{« имя »:« asdf »}’
{ «Успех»: правда,»идентификатор»: 2}

$ curl -sH ‘Content-Type: application / json’Http: // Localhost: 3000 / услуги-XPOST -d ‘{« name »:« Blu-ray »}’
{ «Успех»: правда,»идентификатор»: 3}

$ curl -sH ‘Content-Type: application / json’Http: // Localhost: 3000 / услуги
[{ «ID»: 3,»название»:»Blu-Ray»}, { „идентификатор“: 2,»название»:»ASDF»}, { „ID“: 1,»имя»:»Netflix»} ]

$ curl -sH ‘Content-Type: application / json’HTTP: // локальный: 3000 / услуги / 2-XDELETE
{ «Успех»: истинный}

$ curl -sH ‘Content-Type: application / json’Http: // Localhost: 3000 / услуги
[{ «ID»: 3,»название»:»Blu-Ray»}, { „идентификатор“: 1,»название»:»Netflix»}]

Создать маршруты заголовка узла
Теперь вам нужен способ связать сервис с заголовком.
Создайте новый маршрутизатор в src / my-title.js.
Этот будет немного более длинным, так как он объединит Название с Сервисом и позволит вам обновить местоположение с помощью запроса PUT:

const express = require (‘express ')
const {getTitle} = требуется (/ ./ omdb ’)
const {Title, TitleService, Service} = require (‘./ database’)

const router = express.Router ()

router.get (‘/’, async (req, res, next) => {
пытаться {
const full = 'full' в запросе
const {userId} = req

const data = await TitleService.findAll ({
атрибуты: [‘id’, ‘location’],
где: {‘$ service.userId $’: userId},
включают: [{
модель: название,
атрибуты: [‘название’]
}, {
Модель: Сервис,
атрибуты: [‘id’, ‘name’]
}]
})

res.json (
data.map (({id, location, title: {title}, service}) => ({
мне бы,
место расположения,
название: полный
? заглавие
: {id: title.imdbID, name: `$ {title.Title} ($ {title.Year})`},
service: {id: service.id, name: service.name}
}))
)
} catch (error) {
res.json ({error: error.message})
}
})

router.post (‘/’, async (req, res, next) => {
пытаться {
const {titleId, serviceId, location} = req.body

await Title.upsert ({id: titleId, title: await getTitle (titleId)})

const {userId} = await Service.findByPk (serviceId)
if (userId === req.userId) {
const {id} = await TitleService.create ({titleId, serviceId, location})

вернуть res.json ({id})
}
} catch (error) {
console.log (ошибка)
}

res.json ({ошибка: «Ошибка добавления заголовка»)
})

router.put (‘/: id’, async (req, res, next) => {
пытаться {
const {location} = req.body
const {id} = req.params
const {userId} = req

const titleService = await TitleService.findByPk (id, {include: [{model: Service}]}})
if (titleService && titleService.service.userId === userId) {
await titleService.update ({location})
вернуть res.json ({id})
}
} catch (error) {
console.log (ошибка)
}

res.json ({ошибка: «неверный идентификатор»)
})

router.delete (‘/: id’, async (req, res, next) => {
пытаться {
const {id} = req.params
const {userId} = req

const titleService = await TitleService.findByPk (id, {include: [{model: Service}]}})
if (titleService && titleService.service.userId === userId) {
ожидание titleService.destroy ()
res.json ({success: true})
}
} catch (error) {
console.log (ошибка)
}

res.json ({ошибка: «неверный идентификатор»)
})

module.exports = router

Опять же, вам нужно добавить маршрутизатор в src / index.js, после других маршрутов, которые вы добавили ранее:

app.use (‘/ my-title’, require (‘./ my-title’))

Запросы DELETE и POST в конечном итоге очень похожи на маршрут / services.
Основное отличие от запроса POST состоит в том, что он также проверит наличие заголовка в OMDb и вставит значение в таблицу заголовков для более быстрого поиска в дальнейшем.
Запрос PUT является новым, что позволяет вам изменять существующий «my-title».
Запрос GET немного длиннее только потому, что ему нужно собрать всю информацию.
Это также позволит вам добавить полный параметр, чтобы получить больше информации, но возвращает только пару полей без него. Проверьте это:

$ curl -sH ‘Content-Type: application / json’ http: // localhost: 3000 / my-title
[]

$ curl -sH 'Content-Type: application / json' http: // localhost: 3000 / my-title -XPOST -d '{«serviceId»: 3, «titleId»: «tt0241527», «location»: »Книжная полка «}»
{ «ID»: 1}

$ curl -sH ‘Content-Type: application / json 'http: // localhost: 3000 / my-title -XPOST -d‘ {«serviceId»: 1, «titleId»: «tt4574334"} ’
{ «ID»: 2}

$ curl -sH ‘Content-Type: application / json’ http: // localhost: 3000 / my-title | JSON-о проверять
[{id: 1,
расположение: ‘Книжная полка’,
заглавие:
{id: ‘tt0241527’,
имя: «Гарри Поттер и философский камень (2001)»,
услуга: {id: 3, имя: ‘Blu-ray’}},
{id: 2,
местоположение: ноль,
title: {id: ‘tt4574334’, имя: ‘Stranger Things (2016–)’},
сервис: {id: 1, имя: ‘Netflix’}}]

$ curl -sH ‘Content-Type: application / json’ http: // localhost: 3000 / my-title / 2 -XPUT -d ‘{« location »:« Internet »}’
{ «ID»:»2" }

$ curl -sH ‘Content-Type: application / json’ http: // localhost: 3000 / my-title / 1 -XDELETE
{ «Успех»: истинный}

$ curl -sH ‘Content-Type: application / json’ http: // localhost: 3000 / my-title | JSON-о проверять
[{id: 2,
местоположение: "Интернет",
title: {id: ‘tt4574334’, имя: ‘Stranger Things (2016–)’},
сервис: {id: 1, имя: ‘Netflix’}}]

Добавьте аутентификацию пользователя к вашему Node API
Теперь у вас есть простой API, который вы можете использовать для отслеживания ваших фильмов и телепередач.
К сожалению, только один человек может использовать его, если вы не хотите, чтобы все использовали одну и ту же библиотеку.
Здесь вы можете использовать Okta для добавления аутентификации и облегчения предоставления каждому пользователю своего собственного каталога фильмов.
Okta - это облачный сервис, который позволяет разработчикам создавать, редактировать и безопасно хранить учетные записи пользователей и данные учетных записей пользователей, а также связывать их с одним или несколькими приложениями.
API Okta позволяет вам:

Аутентификация и авторизация ваших пользователей
> Храните данные о ваших пользователях
> Выполнить логин на основе пароля и социальный вход
> Защитите свое приложение с многофакторной аутентификацией

Если у вас его еще нет, зарегистрируйте бесплатную учетную запись разработчика.
Войдите в консоль разработчика, перейдите в «Приложения» и нажмите «Добавить приложение».
Выберите Web, затем нажмите Next.

Вы хотите изменить порты по умолчанию с 8080 на 3000, чтобы они соответствовали вашему серверу.
Ваши настройки должны выглядеть примерно так:

Новые настройки приложения
Нажмите «Готово», чтобы сохранить приложение, затем скопируйте свой идентификатор клиента и секрет клиента и вставьте их как переменные в файл .env в корневом каталоге вашего проекта.
Вам также необходимо добавить URL своей организации (без суффикса -admin).
Добавьте эти три переменные в существующий файл .env:

OKTA_ORG_URL = https: // {yourOktaDomain}
OKTA_CLIENT_ID = {yourClientId}
OKTA_CLIENT_SECRET = {yourClientSecret}

Вам также нужен секрет приложения.
Один из способов получить случайный APP_SECRET - использовать следующие команды, которые сгенерируют случайное значение и добавят его в ваш файл .env.

npm install -g uuid-cli
echo «APP_SECRET =` uuid` »>> .env

Теперь, когда ваши переменные среды готовы, вам нужно установить несколько новых зависимостей для работы Okta:

npm install @ okta / jwt-verifyier @ 0.0.14 @ okta / oidc-middleware @ 2.0.0 [email protected]

Создайте новый файл src / okta.js.
Здесь вы создадите функцию инициализации, для которой требуется приложение Express и номер порта для инициализации.
Вы передадите эту информацию из src / index.js.
Вы также экспортируете специальное промежуточное программное обеспечение requireUser, которое проверит, чтобы убедиться, что пользователь аутентифицирован, и добавит правильный идентификатор пользователя в запрос, а не TODO.
Если пользователь не аутентифицирован, он получит сообщение об ошибке.

const session = require («экспресс-сессия»)
const {ExpressOIDC} = требуется (‘@ okta / oidc-middleware’)
const OktaJwtVerifier = require (‘@ okta / jwt-verifyier’)

const isser = `$ {process.env.OKTA_ORG_URL} / oauth2 / default`

const initialize = (приложение, порт) => {
const oidc = новый ExpressOIDC ({
эмитента,
client_id: process.env.OKTA_CLIENT_ID,
client_secret: process.env.OKTA_CLIENT_SECRET,
appBaseUrl: process.env.APP_BASE_URL || `HTTP: // локальный: $ {порт}`,
область применения: «профиль openid»
})

app.use (сессия ({
секрет: process.env.APP_SECRET,
Resave: правда,
saveUninitialized: false
}))
app.use (oidc.router)

app.get (‘/’, oidc.ensureAuthenticated (), (req, res) => {
res.send (req.userContext.tokens.access_token)
})

возврат OIDC
}

const oktaJwtVerifier = new OktaJwtVerifier ({
эмитента,
clientId: process.env.OKTA_CLIENT_ID
})

const requireUser = async (req, res, next) => {
пытаться {
const {authorization} = req.headers
если (! авторизация) выдает новую ошибку («Вы должны отправить заголовок авторизации»)

const [authType, token] = authorization.split (‘‘)
if (authType! == ‘Bearer’) выдает новую ошибку (‘Ожидается токен Bearer’)

const {претензий: {sub}} = await oktaJwtVerifier.verifyAccessToken (токен)
req.userId = sub
следующий()
} catch (error) {
Рез json ({error: error.message})
}
}

module.exports = {initialize, requireUser}

Теперь вернитесь в src / index.js и внесите несколько изменений.
Замените поддельную функцию аутентификации следующим:

const okta = требуется (‘./ okta’)
okta.initialize (приложение, порт)

Вы также захотите добавить okta.requireUser в качестве промежуточного программного обеспечения в ваши маршруты / services и / my-title.
Это зависит от вас, если вы также хотите, чтобы пользователь запрашивал заголовки, но это не является строго необходимым, поскольку вы просто запрашиваете API OMDb по этому маршруту.
Ваш файл src / index.js должен теперь выглядеть так:

требовать ( «dotenv»). конфиг ()

const express = require (‘express ')
const cors = требуется (‘cors’)
const bodyParser = require ("body-parser")

const {база данных} = требуется (/ ./ база данных ’)
const okta = требуется (‘./ okta’)

const port = process.env.SERVER_PORT || 3000

const app = express ()
app.use (CORS ())
app.use (bodyParser.json ())
okta.initialize (приложение, порт)

app.use (‘/ title’, require (‘./ title’))
app.use (‘/ services’, okta.requireUser, require (‘./ services’))
app.use (‘/ my-title’, okta.requireUser, require (‘./ my-title’))

database.sync (). then (() => {
app.listen (port, () => {
console.log (`Прослушивание порта $ {port}`)
})
})

Время проверить все.
Чтобы пройти аутентификацию с помощью этого API, вам нужно перейти на http: // localhost: 3000 в веб-браузере.
Это предложит вам войти в систему и после аутентификации распечатать маркер аутентификации.
Скопируйте его и добавьте в качестве заголовка в ваши запросы curl.
Самый простой способ сделать это - создать новый файл с вашими заголовками.
Это должно выглядеть примерно так:

Тип контента: приложение / JSON
Разрешение: на предъявителя… NysQChA

Фактический токен намного длиннее, но это идея.
В curl вместо -H ‘Content-Type: application / json’ теперь вы можете сделать -H «$ (cat headers.txt)», предполагая имя файла headers.txt в том же каталоге.
Попробуйте несколько вещей после того, как вы вошли в систему (помните, что все, что вы ввели ранее, не будет доступно, так как это было под идентификатором пользователя TODO).

$ curl -sH «$ (cat headers.txt)»Http: // Localhost: 3000 / My-тайтлов| JSON-о проверять
[]

$ curl -sH «$ (cat headers.txt)»Http: // Localhost: 3000 / услуги-XPOST -d ‘{« name »:« HBO Go »}’
{ «Успех»: правда,»идентификатор»: 4}

$ curl -sH «$ (cat headers.txt)»Http: // Localhost: 3000 / названия s = игра + из + троны| json 0.Title 0.imdbID
Игра престолов
tt0944947

$ curl -sH «$ (cat headers.txt)»Http: // Localhost: 3000 / My-тайтлов-XPOST -d ‘{« titleId »:« tt0944947 »,« serviceId »: 4}’
{ «ID»: 3}

$ curl -sH «$ (cat headers.txt)»Http: // Localhost: 3000 / My-тайтлов| JSON-о проверять
[{id: 3,
местоположение: ноль,
title: {id: ‘tt0944947’, name: ‘Game of Thrones (2011–)’},
служба: {id: 4, имя: ‘HBO Go’}}]

Это оно!

Теперь у вас должен быть полностью аутентифицированный API для отслеживания ваших фильмов и телешоу, который использует Postgres для хранения данных и Okta + OAuth2 для аутентификации API.

Эта мощная статья первоначально появилась на странице разработчика Oktahttps://developer.okta.com/и был написан Брэденом Келли.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map