我需要检索 Google Drive 登录的用户凭据。假设我在谷歌驱动器中有一个帐户,并且我想检索用户信息 - 我怎样才能让它在 C# 中工作?
当我运行下面的代码时,出现错误:
using System;
using System.Diagnostics;
using DotNetOpenAuth.OAuth2;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Drive.v2;
using Google.Apis.Drive.v2.Data;
using Google.Apis.Util;
using Google.Apis.Requests;
using System.Collections.Generic;
using System.Net;
using Google.GData.Client;
using Google.GData.Documents;
using Google.GData.Extensions;
using Google.Apis.Oauth2.v2;
using Google.Apis.Oauth2.v2.Data;
using Google.Apis.Authentication;
namespace google_drive_iterate_folders
{
class Program
{
static DriveService BuildService(IAuthenticator credentials)
{
return new DriveService(credentials);
}
public static IAuthenticator GetCredentials(String authorizationCode, String state)
{
String emailAddress = "";
try
{
IAuthorizationState credentials = ExchangeCode(authorizationCode);
Userinfo userInfo = GetUserInfo(credentials);
String userId = userInfo.Id;
emailAddress = userInfo.Email;
if (!String.IsNullOrEmpty(credentials.RefreshToken))
{
StoreCredentials(userId, credentials);
return GetAuthenticatorFromState(credentials);
}
else
{
credentials = GetStoredCredentials(userId);
if (credentials != null &&
!String.IsNullOrEmpty(credentials.RefreshToken))
{
return GetAuthenticatorFromState(credentials);
}
}
}
catch (Exception ex)
{
Console.WriteLine("An error occurred during code exchange.");
// Drive apps should try to retrieve the user and credentials for
// the current session.
// If none is available, redirect the user to the authorization URL.
e.AuthorizationUrl = GetAuthorizationUrl(emailAddress, state);
throw e;
}
//catch ()
//{
// Console.WriteLine("No user ID could be retrieved.");
//}
// No refresh token has been retrieved.
String authorizationUrl = GetAuthorizationUrl(emailAddress, state);
throw new NoRefreshTokenException(authorizationUrl);
}
/// <summary>
/// Exchange an authorization code for OAuth 2.0 credentials.
/// </summary>
/// <param name="authorizationCode">Authorization code to exchange
//// for OAuth 2.0 credentials.</param>
/// <returns>OAuth 2.0 credentials.</returns>
/// <exception cref="CodeExchangeException">An error occurred.</exception>
static IAuthorizationState ExchangeCode(String authorizationCode)
{
var provider = new NativeApplicationClient(
GoogleAuthenticationServer.Description,
ClientCredentials.CLIENT_ID,
ClientCredentials.CLIENT_SECRET);
IAuthorizationState state = new AuthorizationState();
state.Callback = new Uri(ClientCredentials.REDIRECT_URI);
try
{
state = provider.ProcessUserAuthorization(authorizationCode, state);
return state;
}
catch (ProtocolException)
{
throw new CodeExchangeException(null);
}
}
/// <summary>
/// Send a request to the User Info API to retrieve the user's information.
/// </summary>
/// <param name="credentials">OAuth 2.0 credentials to authorize
//// the request.</param>
/// <returns>User's information.</returns>
/// <exception cref="NoUserIdException">An error occurred.</exception>
static Userinfo GetUserInfo(IAuthenticator credentials)
{
Oauth2Service userInfoService = new Oauth2Service(credentials);
Userinfo userInfo = null;
try
{
userInfo = userInfoService.Userinfo.Get().Fetch();
}
catch (GoogleApiRequestException e)
{
Console.WriteLine("An error occurred: " + e.Message);
}
if (userInfo != null && !String.IsNullOrEmpty(userInfo.Id))
{
return userInfo;
}
else
{
throw new NoUserIdException();
}
}
/// <summary>
/// Retrieve an IAuthenticator instance using the provided state.
/// </summary>
/// <param name="credentials">OAuth 2.0 credentials to use.</param>
/// <returns>Authenticator using the provided OAuth 2.0
/// credentials</returns>
public static IAuthenticator GetAuthenticatorFromState(
IAuthorizationState credentials)
{
var provider = new StoredStateClient(
GoogleAuthenticationServer.Description, ClientCredentials.CLIENT_ID,
ClientCredentials.CLIENT_SECRET, credentials);
var auth = new OAuth2Authenticator<StoredStateClient>(
provider, StoredStateClient.GetState..