Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

oauth2orize-koa

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

oauth2orize-koa

OAuth 2.0 authorization server toolkit for Node.js.

  • 1.2.1
  • Source
  • npm
  • Socket score

Version published
Maintainers
1
Created
Source

OAuth2orize-koa

Build Coverage Quality Dependencies Tips

This is a complete koa port of OAuth2orize. OAuth2orize is an authorization server toolkit for Node.js. It provides a suite of koa v2 middleware that can be used to assemble a server that implements the OAuth 2.0 protocol.

Install

$ npm install oauth2orize-koa

Usage

OAuth 2.0 defines an authorization framework, allowing an extensible set of authorization grants to be exchanged for access tokens. Implementations are free to choose what grant types to support, by using bundled middleware to support common types or plugins to support extension types.

Create an OAuth Server

Call createServer() to create a new OAuth 2.0 server. This instance exposes middleware that will be mounted in routes, as well as configuration options.

var server = oauth2orize.createServer();
Register Grants

A client must obtain permission from a user before it is issued an access token. This permission is known as a grant, the most common type of which is an authorization code.

server.grant(oauth2orize.grant.code(async function(client, redirectURI, user, ares) {
  var code = utils.uid(16);

  var ac = new AuthorizationCode(code, client.id, redirectURI, user.id, ares.scope);
  await ac.save();
  return code;
}));

OAuth2orize also bundles support for implicit token grants.

Register Exchanges

After a client has obtained an authorization grant from the user, that grant can be exchanged for an access token.

server.exchange(oauth2orize.exchange.code(async function(client, code, redirectURI) {
  code = await AuthorizationCode.findOne(code);
  if (client.id !== code.clientId) { return false; }
  if (redirectURI !== code.redirectUri) { return false; }

  var token = utils.uid(256);
  var at = new AccessToken(token, code.userId, code.clientId, code.scope);
  await at.save();
  return token;
}));

OAuth2orize also bundles support for password and client credential grants. Additionally, bundled refresh token support allows expired access tokens to be renewed.

Implement Authorization Endpoint

When a client requests authorization, it will redirect the user to an authorization endpoint. The server must authenticate the user and obtain their permission.

router.get('/dialog/authorize',
  login.ensureLoggedIn(),
  server.authorize(async function(clientID, redirectURI) {
    var client = await Clients.findOne(clientID);
    if (!client) { return false; }
    if (!client.redirectUri != redirectURI) { return false; }
    return [client, client.redirectURI];
  }),
  function(ctx) {
    res.render('dialog', { transactionID: ctx.state.oauth2.transactionID,
                           user: ctx.state.user, client: ctx.state.oauth2.client });
  });

In this example, connect-ensure-login middleware is being used to make sure a user is authenticated before authorization proceeds. At that point, the application renders a dialog asking the user to grant access. The resulting form submission is processed using decision middleware.

 router.post('/dialog/authorize/decision',
   login.ensureLoggedIn(),
   server.decision());

Based on the grant type requested by the client, the appropriate grant module registered above will be invoked to issue an authorization code.

Session Serialization

Obtaining the user's authorization involves multiple request/response pairs. During this time, an OAuth 2.0 transaction will be serialized to the session. Client serialization functions are registered to customize this process, which will typically be as simple as serializing the client ID, and finding the client by ID when deserializing.

server.serializeClient(function(client) {
  return client.id;
});

server.deserializeClient(async function(id) {
  var client = await Clients.findOne(id);
  return client;
});
Implement Token Endpoint

Once a user has approved access, the authorization grant can be exchanged by the client for an access token.

router.post('/token',
  passport.authenticate(['basic', 'oauth2-client-password'], { session: false }),
  server.token(),
  server.errorHandler());

Passport strategies are used to authenticate the client, in this case using either an HTTP Basic authentication header (as provided by passport-http) or client credentials in the request body (as provided by passport-oauth2-client-password).

Based on the grant type issued to the client, the appropriate exchange module registered above will be invoked to issue an access token. If an error occurs, errorHandler middleware will format an error response.

Implement API Endpoints

Once an access token has been issued, a client will use it to make API requests on behalf of the user.

router.get('/api/userinfo',
  passport.authenticate('bearer', { session: false }),
  function(ctx) {
    ctx.body = req.user;
  });

In this example, bearer tokens are issued, which are then authenticated using an HTTP Bearer authentication header (as provided by passport-http-bearer)

Examples

This example demonstrates how to implement an OAuth service provider, complete with protected API access.

  • oauth2orize-openid — Extensions to support OpenID Connect

Tests

$ npm install
$ npm test

Debugging

oauth2orize uses the debug module. You can enable debugging messages on the console by doing export DEBUG=oauth2orize before running your application.

Credits

License

The MIT License

Copyright (c) 2012-2015 Jared Hanson <http://jaredhanson.net/>

Keywords

FAQs

Package last updated on 20 Jan 2016

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc