package graphhelper import ( "context" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" auth "github.com/microsoft/kiota-authentication-azure-go" msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go" "github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/microsoftgraph/msgraph-sdk-go/users" ) type GraphHelper struct { // deviceCodeCredential *azidentity.DeviceCodeCredential InteractiveBrowserCredential *azidentity.InteractiveBrowserCredential userClient *msgraphsdk.GraphServiceClient graphUserScopes []string } func NewGraphHelper() *GraphHelper { g := &GraphHelper{} return g } func (g *GraphHelper) InitializeGraphForUserAuth() error { // clientId := os.Getenv("CLIENT_ID") clientId := "dccb4b93-3f75-4775-a94a-da39216d7daf" // tenantId := os.Getenv("TENANT_ID") tenantId := "ceeae22e-f163-4ac9-b7c2-45972d3aed4f" // scopes := os.Getenv("GRAPH_USER_SCOPES") scopes := "user.read" g.graphUserScopes = strings.Split(scopes, ",") // Create the device code credential // credential, err := azidentity.NewDeviceCodeCredential(&azidentity.DeviceCodeCredentialOptions{ credential, err := azidentity.NewInteractiveBrowserCredential(&azidentity.InteractiveBrowserCredentialOptions{ ClientID: clientId, TenantID: tenantId, // UserPrompt: func(ctx context.Context, message azidentity.DeviceCodeMessage) error { // fmt.Println(message.Message) // return nil // }, RedirectURL: "https://alias.spamasaurus.com/", }) if err != nil { return err } g.InteractiveBrowserCredential = credential // Create an auth provider using the credential authProvider, err := auth.NewAzureIdentityAuthenticationProviderWithScopes(credential, g.graphUserScopes) if err != nil { return err } // Create a request adapter using the auth provider adapter, err := msgraphsdk.NewGraphRequestAdapter(authProvider) if err != nil { return err } // Create a Graph client using request adapter client := msgraphsdk.NewGraphServiceClient(adapter) g.userClient = client return nil } func (g *GraphHelper) GetUserToken() (*string, error) { token, err := g.InteractiveBrowserCredential.GetToken(context.Background(), policy.TokenRequestOptions{ Scopes: g.graphUserScopes, }) if err != nil { return nil, err } return &token.Token, nil } func (g *GraphHelper) GetUser() (models.Userable, error) { query := users.UserItemRequestBuilderGetQueryParameters{ // Only request specific properties Select: []string{"displayName", "mail", "userPrincipalName"}, } return g.userClient.Me().Get(context.Background(), &users.UserItemRequestBuilderGetRequestConfiguration{ QueryParameters: &query, }) }