Azure
CLI のセットアップ
インストール
Windows の場合は WSL に Homebrew を入れておけば MacOS と同じ手順でインストールできる。
# インストール
brew update && brew install azure-cli
Ref: https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-macos?view=azure-cli-latest
サインイン
az login
Azure AD で独自アプリのシングルサインオン
事前準備
まずテナント名を確認する。
az ad signed-in-user show --query 'userPrincipalName' | cut -d '@' -f 2 | sed 's/\"//'
# -> ***.onmicrosoft.com など
ここで表示されるテナント(ドメイン)のアカウントで SSO できるようにする。
Ref: https://stackoverflow.com/a/53280978
アプリを登録する
リダイレクト URL はクライアントから認証画面へ飛ぶときの URL を指定する。
これが一致していないと認証時にエラーになる。
az ad app create \
--display-name <表示名> \
--oauth2-allow-implicit-flow \
--reply-urls <リダイレクトURL>
# 例
az ad app create \
--display-name my-app \
--oauth2-allow-implicit-flow \
--reply-urls https://my-app.example.com/login
成功すると登録したアプリの情報が表示されるので、アプリ ID(appId)をメモしておく。
アプリ ID を再確認したい場合は以下コマンドで。
az ad app list --display-name <表示名> --query [0].appId
--query
で指定する JMESPath について:
https://dev.classmethod.jp/cloud/aws/jmespath-tutorial/
「エンタープライズアプリケーション」と「アプリの登録」の違いについて
GUI でやる場合はここから。
https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
ユーザを登録する
ユーザがいない場合は動作確認のために登録する。
ユーザ名のドメインは既定の***.onmicrosoft.com
(Azure が勝手に生成)か、独自ドメインが使える。
既定のドメインは以下(Azure AD の Overview)で確認できる。
https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview
az ad user create \
--display-name test-user \
--password pasSw0rd_ \
--user-principal-name test-user@***.onmicrosoft.com
GUI でやる場合はここから。
https://portal.azure.com/#blade/Microsoft_AAD_IAM/UsersManagementMenuBlade/AllUsers
アプリから API へのアクセス許可を設定
特別なアクセス許可が必要な場合は設定する。
ココで許可していないアクセスをクライアントからリクエストすると、認証時に
The application 'myapp' asked for scope 'user.write' that doesn't exist on the resource
のようなエラーが出る。
az ad app permission add \
--id <アプリID> \
--api 00000002-0000-0000-c000-000000000000 \
--api-permissions 311a71cc-e848-46a1-bdf8-97ff7156d8e6=Scope
--api-permission
で指定できる GUID について:
https://blogs.msdn.microsoft.com/aaddevsup/2018/06/06/guid-table-for-windows-azure-active-directory-permissions/
GUI でやる場合はここから。アプリを選択し、APIのアクセス許可
から設定する。
https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
クライアント側に認証を実装する
msalを使う。
yarn add msal
<clientID>
はアプリ ID、<tenant ID>
はテナント名(***.onmicrosoft.com など)に置き換える。
authority
はデフォルトではhttps://login.microsoftonline.com/common
になっている。これはマルチテナント用の URL で、シングルテナントとして認証する場合は以下のようにauthority
を指定する必要がある。
import { UserAgentApplication } from "msal";
const config = {
auth: {
clientId: "<clientID>"
authority:
"https://login.microsoftonline.com/<tenant ID>"
}
};
const userAgentApplication = new UserAgentApplication(config);
const loginRequest = {
scopes: ["user.read"]
};
userAgentApplication
.loginPopup(loginRequest)
.then(function(loginResponse) {
//login success
console.warn("ログイン成功", loginResponse);
let idToken = loginResponse.idToken;
})
.catch(function(error) {
//login failure
console.log(error);
});
トークンの検証
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/access-tokens#validating-tokens
https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2
アプリのマニフェスト設定で accessTokenAcceptedVersion を 2 に設定する。 https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/590#issuecomment-486295437
REST APIを使ってパスワード認証でトークンを取得する
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v2-oauth-ropc
Ref:
https://stackoverflow.com/a/55009496
自作のWebAPIを使って自分の代わりにメール送信する
アプリ登録する。
アクセストークンを取得する
https://login.microsoftonline.com/{テナントID}/oauth2/v2.0/token
Header:
key | value |
---|---|
Content-Type | application/x-www-form-urlencoded |
Cache-Control | no-cache |
Body:
key | value |
---|---|
client_id | クライアントID |
grant_type | "password"(固定文字列) |
username | ユーザ名(メールアドレス) |
password | パスワード |
scope | https://graph.microsoft.com/user.read mail.send |