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;
+ }
+}
+