social-auth-app-django(Python)で躓いたこと(SSO:Microsoft)

Microsoftに関するSSO(シングルサインオン)の記事が少なくていろいろと躓いたのでまとめた

間違いとかあればコメントお願いします.

Microsoftのシングルサインオンは,AzurePortalというサービスを行うので,以下Azureと呼んでいます

EC2

次の項目でのパッケージのバージョンのやり取りのため,EC2の初期で入れていたPython3.6をPython3.8へアップデート

バージョン

  • Python3.8 +
  • social-auth-app-django5.0.0+
  • PyJWT≥2.0.0

AzureでのAPIの仕様変更に伴って,以前のバージョン(social-auth-app-django<5.0.0)が使用不可になった.なので,social-auth-app-djangoを使用してAzureのSSOを実装する場合は,5.0.0以上が必要になります.

Python3.6では,PyJWT2.0.0以上が使えないかつ,social-auth-app-django5.0.0以上は,PyJWT2.0.0以上が必要なので,公式に習って,Python3.8以上で実装した(Python3.7は未検証)

social-auth-app-django

公式ドキュメントには,

  • OAuth2 
  • Tenant
  • B2C Tenant

の三つの設定があったが,今回のコードをOAuth2に合わせても動かなかった.なので,Tenantを使用していく.B2C Tenantは未検証

Azure Portalパラメーター

Azureページと変数がどれがどれに値するかドキュメントだけだとわかりづらかったので,以下に

SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY

SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID

SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET
(作成時のみ見れる)

AzureのAPIを使用して,メールアドレスのアカウント登録

SSOのメールアドレス登録をAPIを使用して,登録することで,Microsoftアカウントでログイン

その時に,必要になるAPIを中心に

まずは,APIを使用するためのアクセストークンを得ます.必要なパラメーターとURLはしたのを参考に!詳細

URL
https://login.microsoftonline.com/<ディレクトリ (テナント) ID>/oauth2/v2.0/token

POST
{
	"client_id": "<アプリケーション (クライアント) ID>",
	"scope": "https://graph.microsoft.com/.default",
	"client_secret": "<認証とシークレットのシークレットID>",
	"grant_type": "client_credentials"
}
Request
{
    "token_type": "Bearer",
    "expires_in": <アクセス トークンの有効期間 (秒単位)。>,
    "ext_expires_in": <アクセス トークンの延長?>,
    "access_token": <アクセス トークン>,
}

次にユーザを追加していくが,今回はメールアドレスを持つMicrosoftアカウントでログインできるようにするので,メールアドレスに招待を送るという形で実装する.※デフォルトでは,メールは届きません.詳細

URL POST
https://graph.microsoft.com/v1.0/invitations

Headers
{
	"Content-Type": "application/json",
	"Authorization": "Bearer <Token>"
}
POST
{
    "invitedUserEmailAddress": "<メール アドレス>", 
    "inviteRedirectUrl": "<リダイレクトURL>",
		
}

最後に追加したアカウントの削除 詳細

URL DELETE
https://graph.microsoft.com/v1.0/users/<id>
Headers
{
	"Content-Type": "application/json",
	"Authorization": "Bearer <Token>"
}

必要コードまとめ

最終的に実装した時のコードの早見表です.

settings.pyに追加する

INSTALLED_APPS = [
	...,
	'social_django'
	...,
]
MIDDLEWARE = [
 ...,
 'account.social_login.middleware.CustomSocialAuthExceptionMiddleware',
]
TEMPLATES = [
    {
        ...,
        'OPTIONS': {
            'context_processors': [
		...,
		'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

# アプリケーション (クライアID
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY = '<アプリケーション (クライアント) ID>'
# 認証とシークレットの値
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET = '<認証とシークレットの値>'
# ディレクトリ (テナント) ID
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID = '<ディレクトリ (テナント) ID>'

# ログイン後のリダイレクトURL
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
# ログイン時のエラーURL
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
# 例外処理を発生させるか
SOCIAL_AUTH_RAISE_EXCEPTIONS = False
# getパラメーターに追加するパラメーター
SOCIAL_AUTH_FIELDS_STORED_IN_SESSION = ["<getパラメーターの追加>",]
# SSO後のリダイレクトにHTTPSに
SOCIAL_AUTH_REDIRECT_IS_HTTPS = True

# パイプラインの詳細
# https://qiita.com/cokemaniaIIDX/items/1df141bc22363ff37c4a
SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.auth_allowed',
    <カスタムアカウント用の処理ファイルを入れる>,
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)
html 用のリンクはの参考例
<a href="{% url "social:begin" "azuread-tenant-oauth2" %}?<getパラメーター>">

コメントを残す