Google OAuth 在不请求的情况下返回额外的范围
Google OAuth Returning Additional Scopes Without Requesting
我正在使用 Google 的 oauth 进行测试并尝试不同的范围。
但是,我随后将我的范围请求缩减为:“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 += $"&{query.Key}={query.Value}";
}
}
var redirectUri = builder.Uri.ToString();
return Redirect(redirectUri);
然后我从 returned 代码中检索了访问令牌等。
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);
然而,我得到的似乎比我要求的更多。我在 returned 范围内得到了这个:
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 和不同的浏览器,它们都 return 一样(认为这可能是缓存问题)。
有人能帮我解决这个问题吗?
谢谢。
使应用程序能够使用增量授权来请求访问上下文中的其他范围。如果将此参数的值设置为 true 并授予授权请求,则新的访问令牌还将涵盖用户先前授予应用程序访问权限的任何范围。有关示例,请参阅增量授权部分。
摘自 google 文档:https://developers.google.com/identity/protocols/oauth2/web-server
基本上意味着用户之前已授予您其他范围。可能是通过登录屏幕或您使用相同 clientId
的其他内容
我正在使用 Google 的 oauth 进行测试并尝试不同的范围。
但是,我随后将我的范围请求缩减为:“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 += $"&{query.Key}={query.Value}";
}
}
var redirectUri = builder.Uri.ToString();
return Redirect(redirectUri);
然后我从 returned 代码中检索了访问令牌等。
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);
然而,我得到的似乎比我要求的更多。我在 returned 范围内得到了这个:
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 和不同的浏览器,它们都 return 一样(认为这可能是缓存问题)。
有人能帮我解决这个问题吗?
谢谢。
使应用程序能够使用增量授权来请求访问上下文中的其他范围。如果将此参数的值设置为 true 并授予授权请求,则新的访问令牌还将涵盖用户先前授予应用程序访问权限的任何范围。有关示例,请参阅增量授权部分。
摘自 google 文档:https://developers.google.com/identity/protocols/oauth2/web-server
基本上意味着用户之前已授予您其他范围。可能是通过登录屏幕或您使用相同 clientId
的其他内容