Google OAuth возвращает дополнительные области без запроса

#oauth #google-oauth #scopes

#оавт #google-oauth #области #oauth

Вопрос:

Я тестировал oauth от Google и пробовал разные области.

Однако затем я сократил свой запрос области только до этого: «https://www.googleapis.com/auth/userinfo.email «

Следующее больше в dotnetcore

   Dictionary<string, string> queries = new Dictionary<string, string>();
            queries.Add("scope", "https://www.googleapis.com/auth/userinfo.email");
            queries.Add("access_type", "offline");
            queries.Add("include_granted_scopes" ,"true");
            queries.Add("response_type", "code");
            queries.Add("state", "state");
            queries.Add("redirect_uri", "http://localhost:5000/api/authenticate/googauth");
            queries.Add("client_id", _clientId);
            queries.Add("prompt", "consent");

            UriBuilder builder = new UriBuilder();
            builder.Host = "accounts.google.com";
            builder.Scheme = "https";
            builder.Path = "o/oauth2/v2/auth";
            //builder.Query = ""

            foreach (var query in queries)
            {
                if (string.IsNullOrEmpty(builder.Query))
                {
                    builder.Query  = $"{query.Key}={query.Value}";
                }
                else
                {
                    builder.Query  = $"amp;{query.Key}={query.Value}";
                }
            }

            var redirectUri = builder.Uri.ToString();

            return Redirect(redirectUri);
  

Затем из возвращенного кода я извлек токен доступа и т.д.

    Dictionary<string, string> values = new Dictionary<string, string>();
            values.Add("code", code);
            values.Add("client_id", _clientId);
            values.Add("client_secret",_clientSecret);
            values.Add("redirect_uri", "http://localhost:5000/api/authenticate/googauth");
            values.Add("grant_type", "authorization_code");

            var client = new HttpClient();
            var result = await client.PostAsync("https://oauth2.googleapis.com/token", new FormUrlEncodedContent(values));
            var content = await result.Content.ReadAsStringAsync();
            var convertedContent = JsonSerializer.Deserialize<GoogleAccesstoken>(content);
  

Однако, похоже, я получаю больше, чем просил. Я получаю это в возвращенных областях :

OpenID https://www.googleapis.com/auth/user.gender.read https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/user.birthday.read

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

Кто-нибудь может мне помочь в этом?

Спасибо.

Ответ №1:

Позволяет приложениям использовать инкрементную авторизацию для запроса доступа к дополнительным областям в контексте. Если вы установите значение этого параметра равным true и запрос на авторизацию будет удовлетворен, то новый токен доступа также будет охватывать все области, к которым пользователь ранее предоставил приложению доступ. Смотрите примеры в разделе инкрементная авторизация.

выдержка из документации Google:https://developers.google.com/identity/protocols/oauth2/web-server

В основном означает, что пользователь ранее предоставил вам другие области. Возможно, это было через экран входа в систему или что-то еще, где вы использовали тот же идентификатор клиента

Комментарии:

1. Чтобы добавить еще немного деталей, проблема связана со строкой: queries.Add("include_granted_scopes" ,"true"); , которая сообщает Google включить области, которые были ранее предоставлены, в текущий грант.

2. извините за крайне поздний ответ, но спасибо!