チュートリアルの開始

Getting StartedからIntegrate Auth0 into your applicationへ。Create Applicationからチュートリアルを開始。

Auth0 Django Tutorial width=640

testappとして、Regular Web Applicationを選択。

Auth0 Django Tutorial width=640

Django選択。

Auth0 Django Tutorial width=640

作成されたアプリケーションのページ。

Auth0 Django Tutorial width=640

GitHubからサンプルをfork。

Auth0 Django Tutorial width=640

python-social-auth/social-app-django

Python Social Auth is an easy to setup social authentication/registration mechanism with support for several frameworks and auth providers.
This is the Django component of the python-social-auth ecosystem, it implements the needed functionality to integrate social-auth-core in a Django based project.

Djangoプロジェクトにソーシャル認証を組み込み、OAuthによる認証認可を行うことができる。サンプルアプリ側ではこれを利用してauth0の認証を行っている。

Get Your Application Keys

When you signed up for Auth0, a new application was created for you, or you could have created a new one.

新しアプリケーションを作成すると、以下が発行されるので、Settingsから取得する。

  • Domain
  • Client ID
  • Client Secret

Configure Callback URLs

A callback URL is a URL in your application where Auth0 redirects the user after they have authenticated.
The callback URL for your app must be whitelisted in the Allowed Callback URLs field in your Application Settings. If this field is not set, users will be unable to log in to the application and will get an error.

認証後のリダイレクト先。Settingsでホワイトリスト登録する必要がある。

Configure Logout URLs

A logout URL is a URL in your application that Auth0 can return to after the user has been logged out of the authorization server. This is specified in the returnTo query parameter.
The logout URL for your app must be whitelisted in the Allowed Logout URLs field in your Application Settings. If this field is not set, users will be unable to log out from the application and will get an error.

ログアウト後のリダイレクト先。Settingsでホワイトリスト登録する必要がある。

Django Settings

サンプルアプリはほぼ設定済で、環境変数のみ.envに設定すればOK。

1
2
3
AUTH0_CLIENT_ID={CLIENT_ID}
AUTH0_DOMAIN={DOMAIN}
AUTH0_CLIENT_SECRET={CLIENT_SECRET}

Install the Dependencies

pip install -r requirements.txtでインストール。チュートリアルのDockerイメージはビルドの中でこれらもインストールされる。

1
2
3
4
django~=2.1
social-auth-app-django~=3.1
python-jose~=3.0
python-dotenv~=0.9

以下のDockerfileが用意されており、サンプルアプリを利用可能な状態になっている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM python:3.6

WORKDIR /home/app

#If we add the requirements and install dependencies first, docker can use cache if requirements don't change
ADD requirements.txt /home/app
RUN pip install --no-cache-dir -r requirements.txt

ADD . /home/app

# Migrate the database
RUN python manage.py migrate

CMD python manage.py runserver 0.0.0.0:3000

EXPOSE 3000

docker-composeで操作したいので、docker-compose.ymlを作成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'

services:
auth0:
container_name: auth0-django
build:
context: .
dockerfile: Dockerfile
tty: true
ports:
- "3000:3000"
environment:
AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID}
AUTH0_DOMAIN: ${AUTH0_DOMAIN}
AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET}
1
2
3
$ docker-compose up -d
Creating network "01-login_default" with the default driver
Creating auth0-django ... done

サンプルアプリへのログイン

【GET /】http://localhost:3000にアクセス。

Auth0 Django Tutorial width=640

【GET /login/auth0】auth0のユニバーサルログインページに転送され、ログインすると…

Auth0 Django Tutorial width=640

【GET /dashboard】属性情報を表示されるアプリに転送され、渡されたユーザデータが表示される。

Auth0 Django Tutorial width=640

アプリサイドのログ

この時のサーバログは以下の内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Creating network "01-login_default" with the default driver
Creating auth0-django ... done
Attaching to auth0-django
auth0-django | Watching for file changes with StatReloader
auth0-django | Performing system checks...
auth0-django |
auth0-django | System check identified no issues (0 silenced).
auth0-django | June 05, 2020 - 11:14:04
auth0-django | Django version 2.2.13, using settings 'webappexample.settings'
auth0-django | Starting development server at http://0.0.0.0:3000/
auth0-django | Quit the server with CONTROL-C.
auth0-django | [05/Jun/2020 11:14:13] "GET / HTTP/1.1" 200 899
auth0-django | [05/Jun/2020 11:14:18] "GET /login/auth0 HTTP/1.1" 302 0
auth0-django | [05/Jun/2020 11:14:29] "GET /complete/auth0?code=kOYVXXXXXMVD8Sl&state=s0l9XXXXXXXXXXXXbPBNzeaA HTTP/1.1" 302 0
auth0-django | [05/Jun/2020 11:14:29] "GET /dashboard HTTP/1.1" 200 1371

Auth0サイドのログ

Auth0のログ

Auth0 Django Tutorial width=640

Type:Success ExchangeAuthorization Code for Access TokenというDescriptionが付与されており、前述のGET /complete/auth0?code=で指定している認可コードを取得している。

内容はにRawContextDataとしてJSON形式で確認できる。

Rawでは以下が表示され、アプリからのリクエスト情報が記録されている。
User-Agentはアプリであり、内部的に使用されるPython RequestsのUser-Agentが記録されている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"date": "2020-06-05T11:14:28.994Z",
"type": "seacft",
"description": "Authorization Code for Access Token",
"connection_id": "",
"client_id": "orEXXXXXXXXXXXXXXXXXIFWsMF",
"client_name": "testapp",
"ip": "XXX.XXX.XXX.XXX",
"user_agent": "Python Requests 2.23.0 / Other 0.0.0",
"details": {
"code": "*************8Sl"
},
"hostname": "devXXXXXXXXXXXXX.auth0.com",
"user_id": "auth0|XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"user_name": "XXXXXXXXXXXXX@xxxxxxx.xxxxxx",
"log_id": "9002020XXXXXXXXXXXXXXXXXXXXXXXXXXXX08290750546",
"_id": "9002020XXXXXXXXXXXXXXXXXXXXXXXXXXXX08290750546",
"isMobile": false
}

ContextDataにはdetailsの内容が入っている。

1
2
3
{
"code": "*************8Sl"
}

Type:Success Loginはクライアントのログイン認証の成功を示している。利用者からの認証であり、User-Agentは利用者のブラウザの情報が記録されている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
"date": "2020-06-05T11:14:28.363Z",
"type": "s",
"connection": "Username-Password-Authentication",
"connection_id": "con_XXXXXXXXXXXXXXv7",
"client_id": "orEXXXXXXXXXXXXXXXXXIFWsMF",
"client_name": "testapp",
"ip": "XXX.XXX.XXX.XXX",
"user_agent": "Chrome 83.0.4103 / Windows 10.0.0",
"details": {
"prompts": [
{
"name": "lock-password-authenticate",
"initiatedAt": 1591355668017,
"completedAt": 1591355668324,
"connection": "Username-Password-Authentication",
"connection_id": "con_XXXXXXXXXXXXXXv7",
"strategy": "auth0",
"identity": "5edXXXXXXXXXXXXXXXcf9",
"stats": {
"loginsCount": 6
},
"session_user": "5edaXXXXXXXXXXXXXXX2e9d36",
"elapsedTime": 307
},
{
"name": "login",
"flow": "login",
"initiatedAt": 1591355658531,
"completedAt": 1591355668329,
"user_id": "auth0|XXXXXXXXXXXXXXX6ecf9",
"user_name": "XXXXXXXXXXXXX@xxxxxxx.xxxxxx",
"elapsedTime": 9798
}
],
"initiatedAt": 1591355658530,
"completedAt": 1591355668362,
"elapsedTime": 9832,
"session_id": "0FetBO15mf0vQs_YfMoZTQdeItwyJKdH",
"stats": {
"loginsCount": 6
}
},
"hostname": "dev-e6hrtsp8.auth0.com",
"user_id": "auth0|5ed5fb1b424ed40bee36ecf9",
"user_name": "XXXXXXXXXXXXX@xxxxxxx.xxxxxx",
"strategy": "auth0",
"strategy_type": "database",
"log_id": "900202XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7572418",
"_id": "900202XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7572418",
"isMobile": false,
"description": "Successful login"
}