"Access_Denied" 用于 Google 分析
"Access_Denied" for Google Analytics
我正在我的 asp.net webapi 2 中实施 oAuth 流程。我必须获得用户的许可才能访问他们的 google 分析数据。为此,我在向 google oAuth2.0 流程发送身份验证请求时添加了以下范围。作为回应,我总是收到 "Access_Denied" 错误,即使用户在同意屏幕上单击 "Allow Access" 按钮也是如此。
如果我不在范围内添加 Google 分析,相同的代码工作正常并获得外部访问令牌。
我还在 google 开发者控制台中启用了 Google 分析 API。
Google 分析范围:
googleAuthOptions.Scope.Add(AnalyticsService.Scope.Analytics);
googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsReadonly);
googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsManageUsers);
在 WebApi 的 startup.cs 文件中编写的代码:
//Configure Google External Login
GoogleOAuth2AuthenticationOptions googleAuthOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = ConfigurationManager.AppSettings["GoogleClientID"],
ClientSecret = ConfigurationManager.AppSettings["GoogleClientSecret"],
Provider = new GoogleAuthProvider()
};
//1st trial=>
//googleAuthOptions.Scope.Add("https://www.googleapis.com/auth/analytics");
//2nd trial
//googleAuthOptions.Scope.Add(AnalyticsService.Scope.Analytics);
//googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsReadonly);
//googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsManageUsers);
app.UseGoogleAuthentication(googleAuthOptions);
WebAPI 控制器 [ExternalLogin] 中的方法:
[OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
[AllowAnonymous]
[Route("ExternalLogin", Name = "ExternalLogin")]
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
{
string redirectUri = string.Empty;
if (error != null)
{
return BadRequest(Uri.EscapeDataString(error));
}
if (!User.Identity.IsAuthenticated)
{
return new ChallengeResult(provider, this);
}
var redirectUriValidationResult = ValidateClientAndRedirectUri(this.Request, ref redirectUri);
if (!string.IsNullOrWhiteSpace(redirectUriValidationResult))
{
return BadRequest(redirectUriValidationResult);
}
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
if (externalLogin == null)
{
return InternalServerError();
}
if (externalLogin.LoginProvider != provider)
{
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
return new ChallengeResult(provider, this);
}
//IdentityUser user = await _repo.FindAsync(new UserLoginInfo(externalLogin.LoginProvider, externalLogin.ProviderKey));
int profileID = Convert.ToInt32(HttpContext.Current.Request.QueryString["profile_id"]);
var user = new UserRepository().SearchProfileByID(profileID);
bool hasRegistered = user != null;
redirectUri = string.Format("{0}#external_access_token={1}&provider={2}&haslocalaccount={3}&external_user_name={4}",
redirectUri,
externalLogin.ExternalAccessToken,
externalLogin.LoginProvider,
hasRegistered.ToString(),
externalLogin.UserName);
return Redirect(redirectUri);
}
我已经按照 this link 实现了 oAuth 功能。
请帮我解决这个问题。
谢谢
我终于找到了问题的解决方案,我们还需要添加 "email" 范围。
我添加了以下 2 个范围以使其工作:
googleAuthOptions.Scope.Add("email");
googleAuthOptions.Scope.Add("https://www.googleapis.com/auth/analytics.readonly");
这现在通过 google 解析 api
的访问向我返回外部令牌
谢谢
维杰
我正在我的 asp.net webapi 2 中实施 oAuth 流程。我必须获得用户的许可才能访问他们的 google 分析数据。为此,我在向 google oAuth2.0 流程发送身份验证请求时添加了以下范围。作为回应,我总是收到 "Access_Denied" 错误,即使用户在同意屏幕上单击 "Allow Access" 按钮也是如此。
如果我不在范围内添加 Google 分析,相同的代码工作正常并获得外部访问令牌。
我还在 google 开发者控制台中启用了 Google 分析 API。
Google 分析范围:
googleAuthOptions.Scope.Add(AnalyticsService.Scope.Analytics);
googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsReadonly);
googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsManageUsers);
在 WebApi 的 startup.cs 文件中编写的代码:
//Configure Google External Login
GoogleOAuth2AuthenticationOptions googleAuthOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = ConfigurationManager.AppSettings["GoogleClientID"],
ClientSecret = ConfigurationManager.AppSettings["GoogleClientSecret"],
Provider = new GoogleAuthProvider()
};
//1st trial=>
//googleAuthOptions.Scope.Add("https://www.googleapis.com/auth/analytics");
//2nd trial
//googleAuthOptions.Scope.Add(AnalyticsService.Scope.Analytics);
//googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsReadonly);
//googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsManageUsers);
app.UseGoogleAuthentication(googleAuthOptions);
WebAPI 控制器 [ExternalLogin] 中的方法:
[OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
[AllowAnonymous]
[Route("ExternalLogin", Name = "ExternalLogin")]
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
{
string redirectUri = string.Empty;
if (error != null)
{
return BadRequest(Uri.EscapeDataString(error));
}
if (!User.Identity.IsAuthenticated)
{
return new ChallengeResult(provider, this);
}
var redirectUriValidationResult = ValidateClientAndRedirectUri(this.Request, ref redirectUri);
if (!string.IsNullOrWhiteSpace(redirectUriValidationResult))
{
return BadRequest(redirectUriValidationResult);
}
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
if (externalLogin == null)
{
return InternalServerError();
}
if (externalLogin.LoginProvider != provider)
{
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
return new ChallengeResult(provider, this);
}
//IdentityUser user = await _repo.FindAsync(new UserLoginInfo(externalLogin.LoginProvider, externalLogin.ProviderKey));
int profileID = Convert.ToInt32(HttpContext.Current.Request.QueryString["profile_id"]);
var user = new UserRepository().SearchProfileByID(profileID);
bool hasRegistered = user != null;
redirectUri = string.Format("{0}#external_access_token={1}&provider={2}&haslocalaccount={3}&external_user_name={4}",
redirectUri,
externalLogin.ExternalAccessToken,
externalLogin.LoginProvider,
hasRegistered.ToString(),
externalLogin.UserName);
return Redirect(redirectUri);
}
我已经按照 this link 实现了 oAuth 功能。
请帮我解决这个问题。
谢谢
我终于找到了问题的解决方案,我们还需要添加 "email" 范围。 我添加了以下 2 个范围以使其工作:
googleAuthOptions.Scope.Add("email");
googleAuthOptions.Scope.Add("https://www.googleapis.com/auth/analytics.readonly");
这现在通过 google 解析 api
的访问向我返回外部令牌谢谢
维杰