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

nodejs ライブラリ https://docs.microsoft.com/ja-jp/azure/active-directory/develop/reference-v2-libraries#microsoft-supported-server-middleware-libraries

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