1

我需要检索 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..
4

2 回答 2

1

Google Drive SDK 文档包含一个完整的 .NET 示例,展示了如何在数据库中存储凭据并在需要时恢复它们:

看看这个:- https://developers.google.com/drive/examples/dotnet

于 2012-11-06T09:48:25.730 回答
0

好的,快速浏览一下...您缺少另一个 using 指令(尽管我很惊讶您在运行时而不是编译时收到错误,但您的 IDE 肯定可以告诉您这一点...)。

我不能确定 userinfo 属于哪个名称空间,但是查看此链接,我只能看到您缺少的 google 名称空间。尽管如此,我真的不期待它在那里......

无论如何,谷歌是你的朋友。

于 2012-11-09T07:54:45.993 回答