Как выйти из Google, используя https://appengine.google.com/_ah/logout и подписанный URL? - PullRequest
0 голосов
/ 26 июня 2019

В моем приложении для iOS я добавляю пользователям возможность выходить из аккаунта Google. Для этого я запускаю новый экземпляр SFSafariViewController по следующему адресу, как объясняется в этом вопросе :

https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://myapp.mycompany.ca/api/v1/logout/google

Это работает, за исключением того, что Google выдает раздражающее уведомление о перенаправлении:

Redirection Notice

Как объяснено в этом вопросе, это предполагаемое поведение , разработанное Google, и URL должен быть подписан. Я создал следующее клиентское приложение, позволяющее подписать мой URL:

try
{
    using (Stream certJsonStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ServiceAccountKeyFile))
    {
        var certDefinition = new {client_email = "", private_key = ""};

        using (var streamReader = new StreamReader(certJsonStream))
        {
            var jsonAsObject = JsonConvert.DeserializeAnonymousType(await streamReader.ReadToEndAsync(), certDefinition);

            // Create an explicit ServiceAccountCredential credential
            var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(jsonAsObject.client_email)
            {
                Scopes = new[]
                {
                    IAMCredentialsService.Scope.CloudPlatform
                }

            }.FromPrivateKey(jsonAsObject.private_key));

            var iamCredentialsService = new IAMCredentialsService(
                new BaseClientService.Initializer()
                {
                    HttpClientInitializer = xCred,
                });

            var signBlobRequest = new SignBlobRequest
            {
                Payload = Convert.ToBase64String(Encoding.UTF8.GetBytes(Url)),
            };

            ProjectsResource.ServiceAccountsResource.SignBlobRequest signBlobRequest1 = iamCredentialsService.Projects.ServiceAccounts.SignBlob(signBlobRequest, "projects/-/serviceAccounts/*service-account-name*@appspot.gserviceaccount.com");
            SignBlobResponse response = await signBlobRequest1.ExecuteAsync();

            Console.WriteLine($"Blob to sign: {Url}");
            Console.WriteLine($" Signed data: {response.SignedBlob}");
        }
    }
}
catch (Exception exc)
{
    Console.WriteLine();
    Console.WriteLine($"The following error has been thrown: {exc}");
}

Console.WriteLine();
Console.WriteLine($" -= PRESS A KEY TO EXIT =-");
Console.ReadLine();

где:

  • ServiceAccountKeyFile указывает на файл JSON, содержащий закрытый ключ, сгенерированный для моей учетной записи службы;
  • Url URL для подписи;

Вопрос

Как мне использовать подписанный блоб? Должен ли я вставить его в https://appengine.google.com/_ah/logout URL? Я не нашел никакой документации относительно этой части.

...