diff --git a/README.md b/README.md index 97a6ba843..57bc26285 100755 --- a/README.md +++ b/README.md @@ -218,6 +218,7 @@ List of Definitions * [NProgress](https://github.com/rstacruz/nprogress) (by [Judah Gabriel Himango](https://github.com/judahgabriel)) * [Numeral.js](https://github.com/adamwdraper/Numeral-js) (by [Vincent Bortone](https://github.com/vbortone/)) * [OpenLayers](https://github.com/openlayers/openlayers) (by [Ilya Bolkhovsky](https://github.com/bolhovsky/)) +* [Passport](http://passportjs.org/) (by [Hiroki Horiuchi](https://github.com/horiuchi/)) * [Parallel.js](https://github.com/adambom/parallel.js) (by [Josh Baldwin](https://github.com/jbaldwin)) * [Parsimmon](https://github.com/jayferd/parsimmon) (by [Bart van der Schoor](https://github.com/Bartvds)) * [PDF.js](https://github.com/mozilla/pdf.js) (by [Josh Baldwin](https://github.com/jbaldwin)) diff --git a/passport/passport-test.ts b/passport/passport-test.ts new file mode 100644 index 000000000..f102b306e --- /dev/null +++ b/passport/passport-test.ts @@ -0,0 +1,61 @@ +/// +/// + +import express = require('express'); +import passport = require('passport'); + +class TestStrategy implements passport.Strategy { + public name: string = 'test'; + constructor() {} + authenticate(req: passport.Request) {} +} + +passport.use(new TestStrategy()); +passport.framework('test'); +passport.serializeUser((user, done) => {}); +passport.deserializeUser((id, done) => {}); + +passport.use(new TestStrategy()) + .unuse('test') + .use(new TestStrategy()) + .framework('test-fw'); + + +var app = express(); +app.configure(() => { + app.use(passport.initialize()); + app.use(passport.session()); +}); + +app.post('/login', + passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), + function(req, res) { + res.redirect('/'); + }); + +app.post('/login', function(req: passport.Request, res: passport.Response, next: (err?: any) => void) { + passport.authenticate('local', function(err, user, info) { + if (err) { return next(err) } + if (!user) { + req.session.error = info.message; + return res.redirect('/login') + } + req.logIn(user, function(err) { + if (err) { return next(err); } + return res.redirect('/users/' + user.username); + }); + })(req, res, next); +}); + +app.get('/logout', function(req: passport.Request, res: passport.Response) { + req.logout(); + res.redirect('/'); +}); + +function ensureAuthenticated(req: passport.Request, res: passport.Response, next: (err?: any) => void) { + if (req.isAuthenticated()) { return next(); } + if (req.isUnauthenticated()) { + res.redirect('/login'); + } +} + diff --git a/passport/passport.d.ts b/passport/passport.d.ts new file mode 100644 index 000000000..ae401b252 --- /dev/null +++ b/passport/passport.d.ts @@ -0,0 +1,60 @@ +// Type definitions for Passport v0.2.0 +// Project: http://passportjs.org +// Definitions by: Horiuchi_H +// DefinitelyTyped: https://github.com/borisyankov/DefinitelyTyped + +/// + +declare module 'passport' { + import express = require('express'); + + function use(strategy: Strategy): Passport; + function use(name: string, strategy: Strategy): Passport; + function unuse(name: string): Passport; + function framework(fw: string): Passport; + function initialize(options?: { userProperty: string; }): express.Handler; + function session(options?: { pauseStream: boolean; }): express.Handler; + + function authenticate(strategy: string, options: Object, callback?: express.Handler): express.Handler; + function authenticate(strategy: string, callback2: (err: any, user: any, info: any) => void): express.Handler; + function authorize(strategy: string, options: Object, callback?: express.Handler): express.Handler; + function serializeUser(fn: (user: any, done: (err: any, id: any) => void) => void): void; + function deserializeUser(fn: (id: any, done: (err: any, user: any) => void) => void): void; + function transformAuthInfo(fn: (info: any, done: (err: any, info: any) => void) => void): void; + + interface Passport { + use(strategy: Strategy): Passport; + use(name: string, strategy: Strategy): Passport; + unuse(name: string): Passport; + framework(fw: string): Passport; + initialize(options?: { userProperty: string; }): express.Handler; + session(options?: { pauseStream: boolean; }): express.Handler; + + authenticate(strategy: string, callback2: (err: any, user: any, info: any) => void): express.Handler; + authenticate(strategy: string, options: Object, callback?: express.Handler): express.Handler; + authorize(strategy: string, options: Object, callback?: express.Handler): express.Handler; + serializeUser(fn: (user: any, done: (err: any, id: any) => void) => void): void; + deserializeUser(fn: (id: any, done: (err: any, user: any) => void) => void): void; + transformAuthInfo(fn: (info: any, done: (err: any, info: any) => void) => void): void; + } + + interface Request extends express.Request { + login(user: any, done: (err: any) => void): void; + login(user: any, options: Object, done: (err: any) => void): void; + logIn(user: any, done: (err: any) => void): void; + logIn(user: any, options: Object, done: (err: any) => void): void; + + logout(): void; + logOut(): void; + + isAuthenticated(): boolean; + isUnauthenticated(): boolean; + } + interface Response extends express.Response {} + + interface Strategy { + name?: string; + authenticate(req: Request, options?: Object): void; + } +} +