Open edXのユーザ認証にAuth0を使う

Auth0_login

はじめに

既存の学習支援システムにあるアカウントリストを使って,Open edXへの認証があると便利だろうなと考えていて,調査を行いました.その結果,Third Party Authentication という仕組みを使うことで,ソーシャル認証ができることがわかりました.また,標準では自前アカウントソースを使うことは難しく,OAuth2を用いたバックエンドを作成し,Open edXに設定することで対応することが可能であることもわかりました.

今回,OAuth2で認証ができる認証基盤サービスのAuth0を使ったバックエンドを作成しました.これを用いたOpen edXへのユーザ認証を行いました.結果,ユーザー認証をすることが可能となりました.

Open edX Third Party Authentication

最近のOpen edXには,Third Party Authentication の仕組みが備わっています.これを使うことでGoogleやFacebookなどのソーシャル認証やSAML認証が可能になります.

認証のイメージ

Third Party Authentication

  • 認証先を個別に設定する必要がある.

Auth0 は便利な認証基盤サービス

Auth0は,認証基盤サービスです.Auth0にもユーザDBがありますが,外部データソースへ接続することができます.接続先には,ソーシャル, Database, LDAP, SAML パスワードレスなど様々です. つまり,Auth0による認証ができれば,他のサービスによる連携も可能となるのです.

Auth0を使った認証のイメージ

with_auth0

  • Auth0をハブとして様々な認証を連携できる.Auth0上での連携設定はTTWで簡単に設定が可能.

Open edXの ソーシャル認証には, Python Social Auth を使っている

Open edX の外部認証機能のソーシャル認証は,Python Social Auth を使っています. このモジュールに標準であるバックエンド(google, facebook, linkedin等)の場合, lms.env.jsonlms.auth.json に利用バックエンドとIDとシークレット等を記述し,再起動すれば使えるようになります.

しかし,バックエンドが無いときは backend を作成する必要があります. Third Party Authentication には,dummy.pyというテスト用のコードがあるのでそれを参考にすれば容易に作成が可能です. Auth0に対応したのバックエンドは,以下のアドレスにあります.

セットアップ: Auth0側

はじめに,Auth0でOpen edXで利用するための設定を行います.

Auth0のダッシュボードから, Apps / APIs を選択し,画面右上の + NEW APP/API ボタンをクリックします.ダイアログが表示されるのでタイトルを記入します.

new_auth0

  • Allowed Callback URLs にOpen edXのコールバックURLを入力します.

Open edX側の設定では, Domain , Client ID , Client Secret を使用します.

http://{your open edx address}/auth/login/oa2-auth0/, http://{your open edx address}/auth/complete/oa2-auth0/, http://{your open edx address}/auth/disconnect/oa2-auth0/

セットアップ: Open edX側

openedx_auth0 をOpen edXにインストールします.

sudo su - edxapp -s /bin/bash
cd ~/
. edxapp_env
mkdir src && cd src
git clone https://github.com/ngi644/openedx_auth0
pip install openedx_auth0/

バックエンドのインストールが終わりました.

環境ファイルの編集

lms.env.json

  • ルートノードに "ADDL_INSTALLED_APPS": ["openedx_auth0"]"THIRD_PARTY_AUTH_BACKENDS": ["openedx_auth0.auth0.Auth0OAuth2"] を追記します.
  • FEATURESノード内の "ENABLE_THIRD_PARTY_AUTH": true, と変更し, "AUTH0_DOMAIN": "{your.auth0.com}" を追記します.

Open edX DB をマイグレーションします.

  • Cypress まで
 cd /edx/app/edxapp/edx-platform
 python /edx/app/edxapp/edx-platform/manage.py lms syncdb --migrate --settings=aws
 
  • dogwoodからは, Django1.8なので,python manage.py migrations , python manage.py migrate コマンドとなります.

Open edXを再起動します

sudo /edx/bin/supervisorctl restart edxapp:

Django Admin にアクセスします.

http://{your lms address}/admin

Third_Party_Auth でプロバイダの設定を行います.

  • Home › Third_Party_Auth › Provider Configuration へ進みます.

django_admin

  • Enabled:

    チェックを入れます.有効になっているとログイン画面にリンクが表示されます.

  • Name:

    名前を入力します.ログイン画面の表示に使われます.

  • Skip email verification:

    チェックを入れることでOpen edXによるメール認証をスキップします.

  • Skip registration form:

    Open edXは外部認証でも内部にユーザを作成します.これにチェックを入れることで自動登録します.

  • Backend name:

    外部認証の際に利用するバックエンドを選択します. oa2-auth0 を選択します.

  • Client ID:

    Auth0で作成した, Client ID を入力します.

  • Client Secret:

    Auth0で作成した, Client Secret を入力します.

Save をクリックして保存します.

動作確認

  • Open edXの画面から Sign in ボタンをクリックします.

openedx_1st_page

  • 従来のフォームの下に,Auth0へのリンクが表示されていますので,クリックします.

login_form

  • Auth0へのログイン画面が表示されるので,メールアドレス・パスワードを入力してログインします.

auth0_redirect

  • ログインできました.

dashboard

おわりに

Open edXの外部認証先としてAuth0を使って認証することができました.バックエンドの書き方がわかったのでいろいろとできそうです.また,Auth0の便利さを実感しました. Auth0の外部DBを使う方法はまた別の機会に.とっても簡単ですよ.

リファレンス