Я реализую поток oAuth в моем asp.net webapi 2. Мне нужно получить разрешение от пользователя на доступ к своим данным аналитики Google. и для этого я добавил ниже области действия при отправке запроса аутентификации в поток google oAuth2.0. В ответ на это я всегда получаю ошибку «Access_Denied», даже пользователь нажимает кнопку «Разрешить доступ» на экране согласия.«Access_Denied» для Google Analytics
Тот же код работает нормально и получает токен внешнего доступа, если я не добавляю Google Analytics в объем.
Также я включил API Google Analytics в консоли разработчика Google.
Google Аналитические Области применения:
googleAuthOptions.Scope.Add(AnalyticsService.Scope.Analytics);
googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsReadonly);
googleAuthOptions.Scope.Add(AnalyticsService.Scope.AnalyticsManageUsers);
код, написанный в файле startup.cs WebAPI в:
//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 для реализации функции oAuth.
Пожалуйста, помогите мне решить эту проблему.
Благодаря
Вы должны опубликовать весь ваш код, которого недостаточно для отладки вашей проблемы. вы используете клиентскую библиотеку Google? – DaImTo
Hi DalmTo, Спасибо за ответ. Я обновил свой оригинальный вопрос с помощью кода и ссылки. Пожалуйста, дайте мне знать, если вы хотите получить более подробную информацию. –
Пожалуйста, помогите мне решить эту проблему. Я до сих пор не могу решить эту проблему. –