Microsoftに関するSSO(シングルサインオン)の記事が少なくていろいろと躓いたのでまとめた
間違いとかあればコメントお願いします.
Microsoftのシングルサインオンは,AzurePortalというサービスを行うので,以下Azureと呼んでいます
EC2
次の項目でのパッケージのバージョンのやり取りのため,EC2の初期で入れていたPython3.6をPython3.8へアップデート
sudo yum install python38-devel mysql-devel
sudo yum install python38
バージョン
- 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での操作の流れを参考までに
Microsoft Entra ID -> アプリの登録 -> +新規登録 -> 必要項目の入力,登録 -> 証明書とシークレットで新しい鍵の作成
Azureページと変数がどれがどれに値するかドキュメントだけだとわかりづらかったので,以下に
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY

SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID

SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET
(作成時のみ見れる)

AzureのAPIを使用して,メールアドレスのアカウント登録
※下記のAPIに必要な権限
※登録したアプリから API のアクセス許可 のところで追加
Directory.ReadWrite.All
User.Invite.All
User.ReadWrite.All
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パラメーター>">
