1923

都内と業界の隅っこで生活しているエンジニアのノート

Microsoft Graph チュートリアル を Go で試してみる

Microsoft Graph チュートリアル の、Microsoft Graph で .NET Core アプリを構築する と似たような感じの簡単なサンプルを Go で試してみます。

まだパブリックプレビューにはなっていませんが、Microsoft Authentication Library (MSAL) for Go がありますので、認証(デバイスコードフロー)はこちらを使用。予定表は REST API を使用します。

github.com

docs.microsoft.com

今回作成したサンプル(認証のキャッシュや mailbox settings 部分は省略)
Graph チュートリアル go sample

アプリ作成

Go コンソール アプリを作成。MSAL Go を使用するのでインストール。

go get -u github.com/AzureAD/microsoft-authentication-library-for-go/

ポータルでアプリを登録する

ポータルでアプリを登録するを参考にアプリを登録します。ページに記載されているようにアプリケーション (クライアント) ID の値を使用しますので、メモしておきます。

Azure AD 認証を追加する

環境変数に以下の値を設定します。 mailbox settingsは今回使いませんでしたので、SCOPESから削除しています。

APP_ID:アプリケーション (クライアント) ID
SCOPES:user.read,calendars.readwrite

main.go

appId := os.Getenv("APP_ID")
scopes := strings.Split(os.Getenv("SCOPES"), ",")

MSAL Go のサンプルを参考にデバイスコードフローを実装します。

graph.go

app, err := public.New(appId, public.WithAuthority("https://login.microsoftonline.com/common"))
if err != nil {
    panic(err)
}

ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
defer cancel()
devCode, err := app.AcquireTokenByDeviceCode(ctx, scopes)
if err != nil {
    panic(err)
}
fmt.Printf("Device Code is: %s\n", devCode.Result.Message)
result, err := devCode.AuthenticationResult(ctx)
if err != nil {
    panic(fmt.Sprintf("got error while waiting for user to input the device code: %s", err))
}

予定表ビューを取得する

Microsoft Graph をアプリケーションに組み込みます。このアプリケーションでは http.Client を使用して Microsoft Graph を呼び出します。

graph.go

t := time.Now().UTC()
t1 := t.AddDate(0, 0, int(t.Weekday())*-1)
t2 := t1.AddDate(0, 0, 7)
url := fmt.Sprintf("https://graph.microsoft.com/v1.0/me/calendarview?startDateTime=%s&endDateTime=%s", t1.Format("2006-01-02T00:00:00Z"), t2.Format("2006-01-02T00:00:00Z"))
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+g.token)

resp, err := g.cli.Do(req)
if err != nil {
    return err
}

新しいイベントを作成する

予定表ビューの取得と同様に http.Client を使用して Microsoft Graph を呼び出します。

graph.go

event := models.Event{}
event.Subject = subject
event.Start.DateTime = start.Format("2006-01-02T15:04:05Z")
event.Start.TimeZone = "UTC"
event.End.DateTime = end.Format("2006-01-02T15:04:05Z")
event.End.TimeZone = "UTC"
event.Body.Content = content
event.Body.ContentType = "Text"
event.Attendees = []models.Attendee{}
j, _ := json.Marshal(event)
req, _ := http.NewRequest("POST", "https://graph.microsoft.com/v1.0/me/events", bytes.NewBuffer(j))
req.Header.Set("Authorization", "Bearer "+g.token)
req.Header.Set("Content-Type", "application/json")
resp, err := g.cli.Do(req)
if err != nil {
    return err
}
defer resp.Body.Close()

終わり

これで、デバイスコードフローで認証し、予定表ビューの取得、イベントを作成する Go アプリ(Graph チュートリアル go sample)は完成です。

Microsoft Graph チュートリアル 的なものを Go で試すことができました。

f:id:taka1923:20210609190333p:plain