1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

qnoteAdvent Calendar 2020

Day 4

スクリプトでOffice365の二段階ログインを自動化してみた

Last updated at Posted at 2020-12-03

背景

リモート制度に切り替えに伴って Microsoft Teams のシフト機能を使うようになりました。
が、記録するのは面倒くさく、忘れた場合も多かったです。
そこで、スクリプトで自動化してみました。

これで実現します!

pass

pass というコマンドを使います。
pass は、コマンドラインベースのパスワードマネージャー
UNIX 哲学に従え、シンプルかつ拡張しやすいアプリです。

pass-otp

pass はただパスワードを保存するアプリなので、TOTP(ログインする際に必要な6桁数字)を生成する機能がついていません。
そこで、pass-otp という拡張機能を使います。

GnuPG

passがパスワードデータを暗号化するために使うプログラムです。
SSHの秘密鍵の似ていて、秘密鍵と公開鍵があります。

Puppeteer

Node.js ベースのブラウザ操作を自動化するライブラリー。
ただの好みで、ブラウザ操作とシェルコマンドを実行可能のであれば他の言語のブラウザ自動化ライブラリーを使っても大丈夫です。

手順

1. passpass-otpgpupg をインストール・設定

MacOS の場合は、homebrew を使うと便利です。

$ brew install pass pass-otp gnupg

2. GnuPG 鍵を作る

$ gpg --gen-key

本名、メールアドレス、パスフレーズを入力します。

3. pass のストアを初期化

$ pass init "[指定したメールアドレス]"

4. TOTP の QR コードを取得

MSの2段階認証設定画面からAuthenticatorアプリ用のQRコードを取得します。このQRコードに otpauth:// というURIが入っているので、zbarというコマンドラインアプリでQRから解読できます。

$ zbarimg -q -—raw [path/to/qrcode.png] 

5. TOTP 情報を pass に登録

$ pass otp insert [任意の名前]
Enter otpauth:// for [任意の名前]:
Retype otpauth:// for [任意の名前]:

6. TOTP を動いているか確認

MSの設定画面に戻り、pass-otp で生成した6桁コードを入力。

$ pass otp [登録した名前]
XXXXXX

パスフレーズを聞かれた場合はGnuPG鍵のパスフレーズを入力すれば良いです。

7. スクリプトで利用

スクリプト言語のシェルコマンド実行機能を使い、OTPコードを取得してブラウザに入力します。Node.js + Puppeteer の場合はこんな感じです。

// TOTPコードを取得
import util from util
import childProcess from child_process

const exec   = util.promisify(childProcess.exec)
const result = await exec(pass otp [登録した名前])
const totp   = result.stdout

// ブラウザフォームに入力
import puppeteer from puppeteer

const browser = await puppeteer.launch()
const page    = await browser.newPage()
// URL にアクセス、メールアドレス・パスワード入力を省略
const input = await page.$(input[name=otc])
await input.type(totp)
await input.press(Enter)

GnuPG鍵のパスフレーズが毎回聞かれてうざい!

と思っている方も思うので、MacOSの場合は GPGTools でパスフレーズをMacOSキーチェンに保存され、解消できます。

Microsoft Teams 自動出勤・退勤スクリプト

これをベースにしたスクリプトを作りました。
興味があればGithubリポを見てみてください!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?