【Part1】GoMSGraph で始める Microsoft Graph API 操作 — 認証とクライアント初期化の実装解説
GoMSGraph の概要と graphhelper/client.go の解説
本記事は、Microsoft Graph API を Go 言語で簡単に利用するためのライブラリ「GoMSGraph」についての連載記事の第1回目です。
本シリーズでは、ライブラリ全体の設計思想や各種機能の詳細な実装、利用例などを解説していきます。
今回は、ライブラリの全体概要と、認証やクライアント初期化処理を担う graphhelper/client.go
のコード内容について詳しく解説します。
リポジトリについて
GoMSGraph ライブラリは、GitHub 上で公開されています。
ライブラリの最新のソースコードやドキュメント、Issue の管理などは、下記のリポジトリページからご覧いただけます。
ぜひリポジトリも併せてご確認ください。
はじめに
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 のインスタンスを生成するコンストラクタです。主な流れは以下の通りです。
-
認証情報の初期化
initializeAuth 関数を呼び出し、Azure AD 認証情報(ClientSecretCredential)と認証プロバイダーを生成します。 -
Graph リクエストアダプターの作成
認証プロバイダーをもとに、msgraphsdk.NewGraphRequestAdapter を呼び出してリクエストアダプターを生成します。 -
Graph API クライアントの生成
作成したアダプターを利用して、msgraphsdk.NewGraphServiceClient により Graph API クライアントを初期化します。 -
ロガーの初期化
引数として渡された 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