Posted at

koa+passportでGitHub認証

More than 1 year has passed since last update.

KoaでGitHubのAccessTokenが欲しくなって調べてやってみたのでメモ。

PassportGitHubStrategyを使えば簡単。


passportの設定

認証に必要な情報をStrategyを通してセットアップする。

passportはexpress準拠に作られているが、koa-passportがexpressのAPIとの互換性を保持してくれるのでそいつを使う。

scopeについては本家を参照。


passport.ts

import passport from 'koa-passport'

import { Strategy } from 'passport-github'

passport.use(new Strategy({
clientID: process.env.GITHUB_OAUTH_CLIENT_ID,
clientSecret: process.env.GITHUB_OAUTH_CLIENT_SECRET,
callbackUrl: 'http://localhost:3000/auth/github/callback',
scope: ['repo'],
}, (accessToken, refreshToken, profile, cb) => {
cb(null, { accessToke }) // XXX ここでユーザ認証を行う
})

// sessionにつっこむようにシリアライズする
passport.serializeUser(function (user, done) {
done(null, user)
})

// sessionから取り出すときにデシリアライズする
passport.deserializeUser(function (user, done) {
done(null, user)
})

export default passport


koa-passportでもpassportと同様に扱える。


認証用のルーティング設定

ドキュメントからほぼコピペでいい。


router.ts

import Router from 'koa-router'

import passport from './passport'

const router = new Router()

router.get('/auth/github', passport.authenticate('github'))
router.get('/auth/github/callback', passport.authenticate('github', {
successRedirect: '/',
failureRedirect: '/auth/github/failled',
}))



koaでpassportを有効化


app.ts

import Koa from 'koa'

import logger from 'koa-logger'
import bodyParser from 'koa-bodyparser'
import session from 'koa-session'

import router from './router'
import paspport from './passport'

const app = new Koa()

app.use(logger())
app.use(bodyParser())

app.keys = ['secret'[
app.use(session({}, app))

app.use(passport.initialize())
app.use(passport.session())

app.use(router.routes())
app.use(router.allowedMethods())

app.listen(3000)



まとめ


  • passportを使うと簡単にOAuthできる

  • koaでもpassportできる