1

ASP.NET私は現在、エンド ユーザーが Web サイトから生成されたファイルを自分のGoogle Drive(同じ会社内で)アップロードできるようにする機能を、当社の Web サイトに追加しようとしています。

同社は、メール、ドライブ、連絡先、カレンダー (およびその他ほとんどすべて) を含む独自の Google ドメインを持っています。SAML を使用して、Google にリンクする Active Directory セットアップで認証します。

@gmail.comこのコードは私のアカウントで問題なく動作することに注意してください。会社の Google アプリ ドメイン アカウントを使用すると、資格情報が無効であるというエラーが表示されます (下部に表示されます)。ドライブ API へのアクセスに関して、私のアカウントには制限がないと主張する Google 管理者と話しました。また、API ID/Secret は Gmail アカウントではなく会社のアカウントで作成されていることにも注意してください。

using System;
using System.IO;
using System.Text;
using System.Web;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OAuth2;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Drive.v2;
using Google.Apis.Util;

namespace GoogleTesting
{
    public partial class GoogleAuth : System.Web.UI.Page
    {
        private static readonly string CLIENTID = "xxxxxxxxx.apps.googleusercontent.com";
        private static readonly string CLIENTSECRET = "xxxxxxxxxxxxxxxxxxxxxx";
        private static readonly string APIKEY = "xxxxxxxxxxx";
        private static readonly string REDIRECTURI =  http://localhost:61111/default.aspx";
        private static readonly string[] SCOPES = new[] { DriveService.Scopes.Drive.GetStringValue() };

        private static DriveService driveService;
        private static OAuth2Authenticator<WebServerClient> authenticator;
        private static IAuthorizationState _state;

        private IAuthorizationState AuthState
        {
            get
            {
                return _state ?? HttpContext.Current.Session["GoogleAuthState"] as IAuthorizationState;
            }
        }

        private OAuth2Authenticator<WebServerClient> CreateAuthenticator()
        {
            var provider = new WebServerClient(GoogleAuthenticationServer.Description, CLIENTID, CLIENTSECRET);
            var authenticator = new OAuth2Authenticator<WebServerClient>(provider, GetAuthorization);
            return authenticator;
        }

        private IAuthorizationState GetAuthorization(WebServerClient client)
        {
            IAuthorizationState state = AuthState;
            if (state != null)
            {
                if (state.AccessTokenExpirationUtc.Value.CompareTo(DateTime.Now.ToUniversalTime()) > 0)
                    return state;
                else
                    state = null;
            }
            state = client.ProcessUserAuthorization(new HttpRequestInfo(HttpContext.Current.Request));
            if (state != null && (!string.IsNullOrEmpty(state.AccessToken) || !string.IsNullOrEmpty(state.RefreshToken)))
            {
                if (state.RefreshToken == null)
                    state.RefreshToken = "";
                HttpContext.Current.Session["GoogleAuthState"] = _state = state;
                return state;
            }
            client.RequestUserAuthorization(SCOPES, "", HttpContext.Current.Request.Url);
            return null;
        }


        protected void Page_Load(object sender, EventArgs e)
        {
            if(authenticator == null)
                authenticator = CreateAuthenticator();

            if (driveService == null)
            {
                driveService = new DriveService(authenticator);
                driveService.Key = APIKEY;
            }
            //We should now be authenticated and ready to use Drive API.
            UploadFile();
        }

        private void UploadFile()
        {
            Google.Apis.Drive.v2.Data.File newFile = new Google.Apis.Drive.v2.Data.File { Title = "Test File", MimeType = "text/plain" };
            byte[] byteArray = Encoding.ASCII.GetBytes("Body of the document.");
            MemoryStream stream = new MemoryStream(byteArray);
            FilesResource.InsertMediaUpload request = driveService.Files.Insert(newFile, stream, newFile.MimeType);
            request.Convert = true;
            request.Upload(); 
        }
    }
}

この問題は、次の例外を除いて "request.Upload" 行で発生します。

例外の詳細: System.Exception: 資格情報が無効です

ソース エラー: 85 行目: request.Upload();

ソース ファイル: C:\TMGGoogle\TMGGoogle\TMGGoogle\GoogleAuth.aspx.cs
行: 85

スタックトレース:

[例外: 無効な認証情報]
Google.Apis.Upload.ResumableUpload`1.Upload() +722 GoogleTesting.GoogleAuth.UploadFile
()

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

さて、私は問題の根本原因を突き止めました。当社の Google Apps アカウントで Docs API アクセスがオフになっていることが判明しました。

その後、Google Apps 管理者が有効にしたため、問題は解決しました。

于 2012-09-20T08:43:03.403 に答える