django-allauthのはてなログイン用providerを作った

みなさんさようなら. またいらんものを作りましたぞ.

django-allauth

djangoで作ったアプリケーションのログインにOAuthを使いたいとき,いくつか提供されているライブラリがあるのだけれど,django-allauthというのを使っている.

で,今回,俺以外誰も使わなそうなサービスを作る上で,はてなログインをやりたいと思ったんだけど,当然そんなものがdjango-allauthのproviderとして用意されているはずもなく…….

仕方ないので自作した.

django-allauth-hatena

本当に今どきはてなアカウントでのログインを作るサービスがあるのか謎なんだけど.

github.com

だいたい普通のdjango-allauthのprovidersと同じように扱えます.

ちゃんとPyPIにも登録したので,pipでインストールできるよ.

注意点として,scopeの設定があるのだが,

SOCIALACCOUNT_PROVIDERS = {
    'hatena': {
      'SCOPE': ['read_public,write_public']
    }
}

https://github.com/pennersr/django-allauth/blob/0.35.0/allauth/socialaccount/providers/oauth/views.py#L47

allauthはscopeが複数指定されていた場合,スペース区切りでscopeを連結してリクエストに渡す.

しかし,はてな側は

http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumer

「,」区切りで渡せと仰せのようで,これに合わせるために上記のようなscopeの指定をしてやる必要がある.普通に配列で渡すとハマる.

あと,allauthこういう設定ミスでエラーがでたときに,プロバイダ側のサーバからのエラーを一度握りつぶして,AuthenticationError を返してくれるので,何が問題で失敗したのかわからない.

せっかくはてな側は認証エラー一覧を見せてくれているのに.

OAuth 認証時のエラー一覧 - Hatena Developer Center

参考

allauhtを普通に使ったり,普通にAuthentication Backendを紹介する記事はあったのだが,Authentication Backendを自作する記事は全然見つからなかった.

Djangoプロジェクト間を OAuth2 連携する

こちらがかなり参考になった. マジ感謝.