ExpressでOpenID認証

イントラにOpenIDを入れたので認証のことを考えなくてもよくなって快適なので、色々作っている。

ちょっとsocket.ioを使いたかったので、Expressでopenid認証させるサンプルを書いてみた。node-openidを使っている。openid.ne.jpのID使って試してある。mixi-openidは動かなかったし、facebookとgoogleのopenidはドキュメントの場所がよくわからなくてイラッと来てやめた。

app.coffee

authenticateっていうパスにアクセスするとopen-id認証してverifyにリダイレクトされてくるようになっている。

express = require("express")
routes = require("./routes")
openid = require('openid')
url = require('url')
querystring = require('querystring')
relyingParty = new openid.RelyingParty(
  'http://localhost:3000/verify',
  null,
  false,
  false,[])

app = module.exports = express.createServer()
app.configure ->
  app.set "views", __dirname + "/views"
  app.set "view engine", "jade"
  app.use express.bodyParser()
  app.use express.methodOverride()
  app.use app.router
  app.use express.static(__dirname + "/public")

app.configure "development", ->
  app.use express.errorHandler(
    dumpExceptions: true
    showStack: true
  )

app.configure "production", ->
  app.use express.errorHandler()

app.get "/", routes.index

app.get "/authenticate", (req, res) ->
  identifier = req.query.openid_identifier
  relyingParty.authenticate identifier, false, (error, authUrl) ->
    if error
      res.send "Authentication failed: " + error
    else unless authUrl
      res.writeHead 200
      res.send "Authentication failed"
    else
      res.redirect(authUrl);

app.get "/verify", (req, res) ->
  relyingParty.verifyAssertion req, (error, result) ->
    if not error and result.authenticated
      res.send 'Success :)'
    else
      res.send 'Failure :('

app.listen 3000
console.log "Express server listening on port %d in %s mode",
  app.address().port, app.settings.env

view/index.jade

formを追加しただけ

h1= title
p Welcome to #{title}

form(method="get", action="/authenticate")
  p Login using OpenID
  input(name="openid_identifier")
  input(type="submit", value="Login")

イラッと来るのはsnow leopardにあげたらmacがやたらと重くなった部分も多い。さすがに4年も経つのでそろそろ買い換えてもいいかなと思ったりするところではある。

iddyってOpenID対応しないの?

iddyみたいなprofileサービスはOpenID対応してほしいなぁとか思う。

openidが気になったので調べてみた

突然、無性に気になって仕方がなくなったので。

OpenIDの仕様と技術を一通り読んだ。連載は分かりやすかったが、 第5回がちょっと理解できていないのであとでもう一度。あと、自分で実装してみないと本当に分かったんだか、分かったつもりになってるだけなのか分からないよねってことで、このblogのurlをvoxにdelegateするようにしてみた。

で、bloggerにテストコメントしてみた

openid_test

上が、kzfm.vox.comで下がblog.kzfmix.com。なんかユーザー名がblogとなっていて気持ち悪い。yahooのopenidだと長い文字列の羅列でさらにアレな感じが漂っていた。

そしてdrkcoreもCatalyst::Plugin::Authentication::Credential::OpenIDを入れてopenidでコメントできるようにいじる。


ところで、openidってのは、urlに人格っていうかヒトっぽいものの個性みたいのがくっついてるから面白いのかなーなんて思うのですよ。だからイントラでの使用ってのはちょっと想像しにくいですな。例えば顔もあわせたことのない巨大な企業とかで、大多数がイントラブログを書いてる状況とかだと有効なのかななんて思うのだけど。そういう認識でいいのだろうか。

それから、研究シーンとかだと、論文業績を個人ごとに集めたurlをpubmedなり出版社なりがopenidにしといたうえで、ヒトの論文にコメントできるようなサービスを構築すればいいのにと思ったり。結局もうちっとパブリックな査読のシステムとか必要なんじゃないの?とか思うことが多かったりとかするし。

雑誌にIFつけるんじゃなくて個々の論文に対するIFみたいなものつけないと駄目だよねとか思っているので、コメントする側のバックグラウンドとかはっきりしてれば、なんか面白そうな気がするけどねー。