KoaでGitHubのAccessTokenが欲しくなって調べてやってみたのでメモ。
PassportのGitHubStrategyを使えば簡単。
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できる