Как безопасно хранить файл ответов OAuth для каждого пользователя, предоставленный Google Drive API - PullRequest
4 голосов
/ 18 мая 2019

Я работаю над приложением asp.net, в котором я прошу людей дать разрешение (используя OAuth) на доступ к их диску Google (к определенной папке), чтобы иметь возможность просматривать файлы в приложении.

Следующий код позволяет пользователям предоставлять авторизацию и создает соответствующий файл Google.Apis.Auth.OAuth2.Responses на сервере, который будет использоваться для будущих запросов.Но этот запрос будет выполняться для каждого пользователя, что создаст больше файлов ответов OAuth.Я не уверен, как разработать приложение и безопасно хранить эти файлы.Возможно, я могу создать новую папку (используя Guid-based UserIds) для каждого пользователя и сохранить файл в этой папке.Имеет ли это смысл?Или вы рекомендуете другой подход?

using (var stream =
    new FileStream("Services/credentials.json", FileMode.Open, FileAccess.Read))
{
    string credPath = "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        Scopes,
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
    Console.WriteLine("Credential file saved to: " + credPath);
}

BaseClientService.Initializer bcs = new BaseClientService.Initializer();
bcs.HttpClientInitializer = credential;

DriveService service = new DriveService(bcs);

1 Ответ

1 голос
/ 23 мая 2019

Исправление

Я работаю над приложением asp.net, в котором я прошу людей дать разрешение (используя OAuth) на доступ к их диску Google (к определенной папке), чтобы иметь возможность просматриватьфайлы в приложении.

Когда вы запрашиваете доступ Это будет для учетной записи полного диска пользователя, а не только для одной папки.

Хранение файлов учетных данных.

Ваш вопрос немного сложен для понимания, но я думаю, что вы спрашиваете, где вы должны хранить свои учетные файлы.Способ работы FileDataStore заключается в том, что он создает новый файл для каждого "user", поэтому в зависимости от того, что вы установили для «пользователя», будет создан файл, как вы можете видеть, я склонен использовать guid в конце и сохранятьв сеансе var таким образом, я знаю, когда пользователь возвращается с этим сеансом var, это тот файл, который мне нужно получить для них.На самом деле клиентская библиотека делает все это за вас, потому что, как только она увидит идентификатор, она будет использовать это автоматически.

enter image description here

Web против установленного приложения.

У меня есть один важный комментарий, если вы используете Asp .net и намереваетесь использоватьвеб-приложение, то вы используете неправильный код.В следующем примере показано, как пройти аутентификацию с помощью веб-приложений asp.net mvc . Обратите внимание на сеанс в приведенном ниже коде.

 public class AppFlowMetadata : FlowMetadata
    {
        private static readonly IAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
                {
                    ClientSecrets = new ClientSecrets
                    {
                        ClientId = "PUT_CLIENT_ID_HERE",
                        ClientSecret = "PUT_CLIENT_SECRET_HERE"
                    },
                    Scopes = new[] { DriveService.Scope.Drive },
                    DataStore = new FileDataStore("Drive.Api.Auth.Store")
                });

        public override string GetUserId(Controller controller)
        {
            // In this sample we use the session to store the user identifiers.
            // That's not the best practice, because you should have a logic to identify
            // a user. You might want to use "OpenID Connect".
            // You can read more about the protocol in the following link:
            // https://developers.google.com/accounts/docs/OAuth2Login.
            var user = controller.Session["user"];
            if (user == null)
            {
                user = Guid.NewGuid();
                controller.Session["user"] = user;
            }
            return user.ToString();

        }

        public override IAuthorizationCodeFlow Flow
        {
            get { return flow; }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...