0.0.3 • Published 5 years ago

koa-openid-connect v0.0.3

Weekly downloads
2
License
ISC
Repository
github
Last release
5 years ago

koa-openid-connect

OpenID Connect Middleware for use with Koa

Overview

We support Authorization Code Flow

Getting Started

Install with npm:

npm i koa-openid-connect --save

Require in your Node-Koa server.js file:

const KoaOpenIdConnect = require('koa-openid-connect')

Define an openid const:

const openid = new KoaOpenIdConnect(defaultConfig, openidConfig)

Call inside your home route:

homeRoute.get('/', async function (ctx, next) {
	if (true) {
		return await openid.goLogin(ctx)
	}
}) 

See full example below:

Example

Create .env file in your root directory with the following config variables

# Node Evironment
NODE_ENV=development

# Koa OpenID Default Config Variables
URI_BASE=https://mydomain.example.com/openId

URI_AUTH=https://mydomain.example.com/openId/authenticate

URI_TOKEN=https://mydomain.example.com/openId/token

URI_USERINFO=https://mydomain.example.com/openId/userinfo

URI_LOGOUT=https://mydomain.example.com/openId/logout

SCOPE="openid profile email"

# Koa OpenID Config Variables
CLIENT_ID="<your_client_id>"

CLIENT_SECRET="<your_client_secret>"

URI_REDIRECT=https://mydomain.example.com/redirect

Node-Koa server.js

require('dotenv').config()

const Koa = require('koa')
const Router = require('koa-router')
const combineRouters = require('koa-combine-routers')
const logger = require('koa-logger')
const cors = require('kcors')
const bodyParser = require('koa-bodyparser')
const Chance = require('chance')
const chance = new Chance()
const _log = require('ololog').configure({locate: false})

const KoaOpenIdConnect = require('koa-openid-connect')

const app = new Koa()

const defaultConfig = {
	base_uri: process.env.URI_BASE,
	authorize_uri: process.env.URI_AUTH,
	token_uri: process.env.URI_TOKEN,
	userinfo_uri: process.env.URI_USERINFO,
	scope: process.env.SCOPE
}

const openidConfig = {
	client_id: process.env.CLIENT_ID,
	client_secret: process.env.CLIENT_SECRET,
	redirect_uri: process.env.URI_REDIRECT,
	state: chance.guid()
}

const openid = new KoaOpenIdConnect(defaultConfig, openidConfig)

const homeRoute = new Router()
const loginRoute = new Router()
const redirectRoute = new Router()
const registerRoute = new Router()

homeRoute.get('/', async function (ctx, next) {
	if (true) {
		return await openid.goLogin(ctx)
	}
})

loginRoute.get('/login', async function (ctx, next) {
	return await openid.getUserInfo(ctx, next, function (result) {
		if (!result.error) {
			_log.lightCyan(result.userInfo)
		} else {
			let loginMsg = 'You must register at https://example.com/register'
			_log.red('loginMsg: ', loginMsg)
			// redirect to '/register'
		}
	})
})

redirectRoute.get('/redirect', async function (ctx,  next) {
	// handle OpenID redirect
})

registerRoute.get('/register', async function (ctx,  next) {
	// register user
})

const router = combineRouters(
	homeRoute,
	loginRoute,
	redirectRoute,
	registerRoute
)

app.use(cors())
app.use(logger())
app.use(bodyParser())
app.use(router())

app.listen(6001, () => _log.blue(`Server listening on port ${6001}`))

When you start the app and navigate to http://localhost:6001 the KoaOpenIdConnect checks if you are already authenticated and redirects you the URI_REDIRECT you specified in the .env file