🦁

【Part1】GoMSGraph で始める Microsoft Graph API 操作 — 認証とクライアント初期化の実装解説

2025/02/12に公開

GoMSGraph の概要と graphhelper/client.go の解説

本記事は、Microsoft Graph API を Go 言語で簡単に利用するためのライブラリ「GoMSGraph」についての連載記事の第1回目です。
本シリーズでは、ライブラリ全体の設計思想や各種機能の詳細な実装、利用例などを解説していきます。

今回は、ライブラリの全体概要と、認証やクライアント初期化処理を担う graphhelper/client.go のコード内容について詳しく解説します。


リポジトリについて

GoMSGraph ライブラリは、GitHub 上で公開されています。
ライブラリの最新のソースコードやドキュメント、Issue の管理などは、下記のリポジトリページからご覧いただけます。
ぜひリポジトリも併せてご確認ください。
https://github.com/Tsubasa-2005/GoMSGraph


はじめに

GoMSGraph は、Azure AD アプリケーションを利用した認証処理、OneDrive や SharePoint のドライブ操作、大容量ファイルアップロードなど、Microsoft Graph API の各種機能をシンプルなメソッドで提供する Go 言語向けライブラリです。

主な特徴

  • 認証処理の簡略化
    Azure SDK の azidentity を利用したクライアントシークレット認証により、複雑な認証処理を簡単に実装できます。

  • ドライブ操作
    フォルダ作成、ルートアイテム取得、アイテム削除、ファイルダウンロードなど、基本的なドライブ操作を簡単なメソッドで実現します。

  • カスタムロガー対応
    デフォルトでは Uber の Zap を利用したロガーが組み込まれており、利用者の要件に合わせたロガーの差し替えも可能です。


graphhelper/client.go のコード解説

以下に graphhelper/client.go の主要なコードを掲載し、その内容を解説します。

package graphhelper

import (
	"fmt"

	"go.uber.org/zap"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	auth "github.com/microsoft/kiota-authentication-azure-go"
	msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
)

type GraphHelper struct {
	clientSecretCredential *azidentity.ClientSecretCredential
	appClient              *msgraphsdk.GraphServiceClient
	Logger                 *Logger
}

func NewGraphHelper(clientId, tenantId, clientSecret string, logger *Logger) (*GraphHelper, error) {
	credential, authProvider, err := initializeAuth(clientId, tenantId, clientSecret)
	if err != nil {
		return nil, err
	}
	adapter, err := msgraphsdk.NewGraphRequestAdapter(authProvider)
	if err != nil {
		return nil, fmt.Errorf("failed to create request adapter: %w", err)
	}

	client := msgraphsdk.NewGraphServiceClient(adapter)

	if logger == nil {
		zapLogger, err := zap.NewProduction()
		if err != nil {
			return nil, fmt.Errorf("failed to create default zap logger: %w", err)
		}
		logger = NewDefaultLogger(zapLogger)
	}

	return &GraphHelper{
		clientSecretCredential: credential,
		appClient:              client,
		Logger:                 logger,
	}, nil
}

func initializeAuth(clientId, tenantId, clientSecret string) (*azidentity.ClientSecretCredential, *auth.AzureIdentityAuthenticationProvider, error) {
	credential, err := azidentity.NewClientSecretCredential(tenantId, clientId, clientSecret, nil)
	if err != nil {
		return nil, nil, fmt.Errorf("failed to create credentials: %w", err)
	}

	authProvider, err := auth.NewAzureIdentityAuthenticationProviderWithScopes(credential, []string{
		"https://graph.microsoft.com/.default",
	})
	if err != nil {
		return nil, nil, fmt.Errorf("failed to create an authentication provider: %w", err)
	}

	return credential, authProvider, nil
}

コードのポイント解説

1. パッケージのインポート

  • go.uber.org/zap
    高速で柔軟なロギングライブラリである Zap を利用し、統一されたログ出力を実現しています。

  • azidentity
    Azure AD の認証処理を担当するパッケージです。ここではクライアントシークレット認証を用いてセキュアな認証情報の生成を行います。

  • msgraphsdk
    Microsoft Graph API へのリクエスト処理を簡単にするための SDK を利用しています。
    認証プロバイダーからリクエストアダプターを生成し、Graph API クライアントを作成します。

  • auth (kiota-authentication-azure-go)
    Azure Identity を利用した認証プロバイダーを生成するために用い、Graph API アクセスに必要な認証トークンを提供します。

2. GraphHelper 構造体

ライブラリの中核となる構造体で、以下のフィールドを持ちます。

  • clientSecretCredential
    Azure AD のクライアントシークレット認証情報を保持します。

  • appClient
    Microsoft Graph API へのリクエストを実行するためのクライアントです。

  • Logger
    ログ出力用のラッパーで、引数として渡されなかった場合はデフォルトの Zap ロガーが利用されます(詳細は graphhelper/zaplogger.go を参照)。

3. NewGraphHelper コンストラクタ

NewGraphHelper 関数は、GraphHelper のインスタンスを生成するコンストラクタです。主な流れは以下の通りです。

  1. 認証情報の初期化
    initializeAuth 関数を呼び出し、Azure AD 認証情報(ClientSecretCredential)と認証プロバイダーを生成します。

  2. Graph リクエストアダプターの作成
    認証プロバイダーをもとに、msgraphsdk.NewGraphRequestAdapter を呼び出してリクエストアダプターを生成します。

  3. Graph API クライアントの生成
    作成したアダプターを利用して、msgraphsdk.NewGraphServiceClient により Graph API クライアントを初期化します。

  4. ロガーの初期化
    引数として渡された logger が nil の場合は、Zap のプロダクションロガーを生成し、デフォルトのロガーとして設定します。
    この実装により、GraphHelper のインスタンス生成後は logger が常に nil ではない状態となるため、以降のコードで logger を使用する際に毎回 nil チェックを行う必要がなく、コードがシンプルに保たれます。

4. initializeAuth 関数

この関数は、Azure AD 認証の初期化処理を担当します。

  • クレデンシャルの生成
    azidentity.NewClientSecretCredential を使用して、テナント ID、クライアント ID、クライアントシークレットから認証情報を生成します。

  • 認証プロバイダーの生成
    生成したクレデンシャルをもとに、auth.NewAzureIdentityAuthenticationProviderWithScopes を利用して認証プロバイダーを作成します。
    スコープ "https://graph.microsoft.com/.default" を指定することで、Microsoft Graph API へのアクセス権を確保します。


まとめ

今回の記事では、GoMSGraph ライブラリの全体概要と、graphhelper/client.go における認証・クライアント初期化処理の実装について解説しました。
GoMSGraph は、Microsoft Graph API を扱う際の煩雑な認証処理やリクエスト生成をシンプルなインターフェースにまとめることで、実際のアプリケーション開発を大いに支援します。

次回以降の Part2 では、ドライブ操作や大容量ファイルアップロードの機能について詳しく解説していく予定です。


参考リンク

Discussion