O365でアプリケーション登録→APIアクセスの続き

2018年10月19日

認証コード取得の自動化を検討

認証コードは取得から一定時間経過すると無効になってしまうので定期的に取得したい。前回書いた通り

  1. 以下のフォーマットで認証エンドポイントにアクセス
  2. このようなレスポンスがあれば成功

と、やりたいのはレスポンス先のURL(リダイレクト先URL)に含まれる認証トークン文字列の取り出してある。

Invoke-WebRequestで取得を試みる

Invoke-WebRequest -url "https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id=[クライアントID]&resource=https%3a%2f%2foutlook.office365.com%2f&redirect_uri={リダイレクトURL}"

を実行し戻り値にリダイレクト先のURLが含まれていないか調べたが、存在しなかった。

“リダイレクト先 url 取得"はどの言語でも話題になっており、例えばURLステータスコードが302だからURLを追跡するなどの方法が書いてあったが、上記アクセスは200で返ってくるので追いようがない(というかリダイレクト処理じゃないし)

で、気づいたのが、これはリダイレクト先のWebサイトで開発を行い、ブラウザからのアクセスが発生した場合、code=[認証トークン部分]を自動的に取り出すようなプログラムを実装する必要があるとわかった。今回、ローカルのPC環境から実行したいだけなので、まさかこれだけのためにローカルにWebサーバー立ててプログラム開発するのも面倒なので、手動取得する事にした。

※ 認証API v2.0 だと302で返ってくるらしい

ExchangeOnlineにアクセス

認証コードは手で取る事にして、前回のブログの「4. プログラムからアクセス」でaccess_tokenをゲットします。

$response = Invoke-RestMethod -uri $url -Method Post -Body $body -ContentType $ContentType
$response.access_token #> アクセストークン

このアクセストークンをヘッダーに含めてアクセスします。

$headers = @{
"Accept" = "Application/json"
"Authorization" = ("Bearer " + $response.access_token)
}
$ContentType = "Application/json"

例えば、受信トレイの最新10件を取得するスクリプト

Invoke-RestMethod -uri "https://outlook.office.com/api/v1.0/me/folders/inbox/messages?$top=10" -Method Get -ContentType $ContentType -Headers $headers

例えば、JSONファイルの中身の予定を登録するスクリプト(詳細は別エントリで書きます)

Invoke-RestMethod -Uri "https://outlook.office365.com/api/v1.0/me/events"  -Method Post -InFile ".\jsontest.json" -ContentType 'application/json' -Headers $headers

が実行できます。

こうなると、繰り返し処理していろいろやりたいところなのですが、アクセストークンには時限があるので定期的に再取得してやる必要があります。めんどくさ…。やっぱv2でアクセスしないといけないのか…。

Posted by tera