问题
I am trying to create my first console app using Google's Directory API for .Net.
I have a code based in a Google's sample. It shows me a couple of errors, one of them is when I am trying to create the service:
var service = new DirectoryService(new BaseClientService.Initializer()
{
Authenticator = auth,
ApplicationName = "Create User",
ApiKey = "<your API Key from Google APIs console>"
});
It shows me: "Error 3 'Google.Apis.Services.BaseClientService.Initializer' doesn't contain a definition for 'Authenticator'"
And the second error is in this function
private static IAuthorizationState GetAuthorization(NativeApplicationClient arg){}
It shows me: "DotNetOpenAuth.OAuth2.UserAgentClient' is defined in an assembly that is not referenced."
In this case I typed (using nuget console): PM> Install-Package DotNetOpenAuth -Version 4.3.4.13329 .... but it doesnt resolve my problem.
This is my code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using DotNetOpenAuth.OAuth2;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
//using Google.Apis.Samples.Helper;
using Google.Apis.Services;
using Google.Apis.Util;
using Google.Apis.Admin.Directory.directory_v1;
using Google.Apis.Admin.Directory.directory_v1.Data;
namespace GoogleDirectoryApi_test02_consola
{
class Program
{
static void Main(string[] args)
{
String CLIENT_ID = "YOUR_CLIENT_ID";
String CLIENT_SECRET = "YOUR_CLIENT_SECRET";
// Register the authenticator and create the service
var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description, CLIENT_ID, CLIENT_SECRET);
var auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthorization);
//New User
User newuserbody = new User();
string userId = "SampleId01";
UserName newusername = new UserName();
newuserbody.PrimaryEmail = userId;
// Create the service.
var service = new DirectoryService(new BaseClientService.Initializer()
{
Authenticator = auth,
ApplicationName = "Create User",
ApiKey = "<your API Key from Google APIs console>"
});
User results = service.Users.Insert(newuserbody).Execute();
}
private static IAuthorizationState GetAuthorization(NativeApplicationClient arg)
{
// Get the auth URL:
//IAuthorizationState state = new AuthorizationState(new[] { DirectoryService.Scopes.AdminDirectoryUser.GetStringValue() });
IAuthorizationState state = new AuthorizationState(new[] { DirectoryService.Scope.AdminDirectoryUser.ToString() });
state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
Uri authUri = arg.RequestUserAuthorization(state);
// Request authorization from the user (by opening a browser window):
Process.Start(authUri.ToString());
Console.WriteLine();
Console.Write("Authorization Code: ");
string authCode = Console.ReadLine();
// Retrieve the access token by using the authorization code:
return arg.ProcessUserAuthorization(authCode, state);
}
}
}
Thanks in advance for your help
回答1:
have to have a service account with Perform Google Apps Domain-Wide Delegation of Authority as defined in
https://developers.google.com/admin-sdk/directory/v1/guides/delegation
it say to add it in the "Manage third party OAuth Client access" i had "Manage OAuth Client access "
String serviceAccountEmail = "......@developer.gserviceaccount.com";
X509Certificate2 certificate = new X509Certificate2(@"C:\key.p12", "notasecret", X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[]
{
DirectoryService.Scope.AdminDirectoryUser
},
User = "admin@domain.com"
}.FromCertificate(certificate));
var ser = new DirectoryService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Get it to work",
});
User newuserbody = new User();
UserName newusername = new UserName();
newuserbody.PrimaryEmail = "jack@domain.com";
newusername.GivenName = "jack";
newusername.FamilyName = "black";
newuserbody.Name = newusername;
newuserbody.Password = "password";
User results = ser.Users.Insert(newuserbody).Execute();
来源:https://stackoverflow.com/questions/21638337/using-googles-directory-api-for-net