检索Google驱动器登录的用户凭据

时间:2012-11-06 09:45:17

标签: c# google-drive-api

我需要检索Google云端硬盘登录的用户凭据。假设我在谷歌驱动器中有一个帐户,我想检索用户信息 - 我怎样才能在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..

2 个答案:

答案 0 :(得分:1)

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

检查一下: - https://developers.google.com/drive/examples/dotnet

答案 1 :(得分:0)

好的,快速浏览一下......你错过了另一个使用指令(虽然我很惊讶你在运行时得到错误而不是编译时间,当然你的IDE可以告诉你这个......)。

我无法确定userinfo属于哪个命名空间,但查看this link,我只能看到您遗漏的google命名空间。尽管如此,我真的没想到那里......

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