Аутентификация в Google Drive API - выполнить аутентификацию на клиенте? - PullRequest
0 голосов
/ 27 февраля 2020

Я вызываю следующий код на своем бэкэнде, когда пользователь хочет получить доступ к своему диску Google через мой сервис.

  public static DriveService GetService(string app_userID)
    {

        //get Credentials from client_secret.json file 
        UserCredential credential;
        var path = HttpContext.Current.Server.MapPath(@"~/client_secret.json");
        using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            // The file token.json stores the user's access and refresh tokens, and is created
            // automatically when the authorization flow completes for the first time.
            string credPath = HttpContext.Current.Server.MapPath(@"~/token.json");
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                app_userID,
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
        }

        //create Drive API service.
        DriveService service = new DriveService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "GoogleDriveRestAPI-v3",
        });
        return service;

Проблема, однако, в том, что я думаю, что этот код разработан для запуска во внешнем приложении. Я получаю следующую ошибку, и я думаю, что программа пытается открыть веб-страницу для аутентификации, но на внутреннем сервере.

{
"Message": "An error has occurred.",
"ExceptionMessage": "One or more errors occurred.",
"ExceptionType": "System.AggregateException",
"StackTrace": "   at System.Threading.Tasks.Task`1.GetResultCore(Boolean .......GoogleDrive.GoogleDriveFilesRepository.GetService(String tt_userID) in ,,,
"InnerException": {
    "Message": "An error has occurred.",
    "ExceptionMessage": "Failed to launch browser with \"...(google url)..." for authorization. See inner exception for details.",
    "ExceptionType": "System.NotSupportedException",
    "StackTrace": "   ...
    "InnerException": {
        "Message": "An error has occurred.",
        "ExceptionMessage": "Access is denied",
        "ExceptionType": "System.ComponentModel.Win32Exception",
        "StackTrace": "   at ...

Как я могу изменить, чтобы конечный пользователь проходил аутентификацию на стороне клиента? См. Мое устройство ниже.

enter image description here

Обратите внимание, что я все еще хотел бы иметь возможность вызывать API из серверной части, если это возможно.

1 Ответ

0 голосов
/ 07 марта 2020

Ну, вот как я наконец решил это.

Аутентификация должна быть выполнена на стороне клиента и, следовательно, также реализована в коде сценария java. В результате аутентификации будет получен код аутентификации.

Поскольку я выполняю свою реализацию в vue, я использовал эту библиотеку: vue -google-oauth2

Если вы хочу реализовать в javascript напрямую , это руководство может помочь (сначала часть до тех пор, пока вы не получите "код").

Код аутентификации можно использовать один раз для запроса токена доступа. Код аутентификации должен быть передан на внутренний сервер, в этом случае с помощью API, реализованного в ASP. NET.

На стороне сервера я использовал эту библиотеку вместе с этой реализацией . Единственным исключением является то, что я установил для redirect_uri значение «postmessage». При таком подходе я могу получить токен доступа без использования redirect_uri. Не уверен в цели redirect_uri. Однако при использовании «postmessage» не нужно устанавливать redirect_uri в консоли Google.

Я использовал один и тот же clientID как на сервере, так и на веб-клиенте. Это работало нормально, но я не уверен, что так и должно быть.

Наконец, вам нужно в некоторой степени понять oauth2, чтобы иметь возможность реализовать oauth2. Диаграмма внизу на этой странице дает довольно хороший обзор. Однако, если вы планируете реализовать это в реальной производственной среде, вам следует убедиться, что вы освоили топи c или получить помощь от того, кто это делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...