ASP.NET Core «Состояние oauth отсутствует или недействительно» при перенаправлении из GoogleAPI - PullRequest
0 голосов
/ 27 августа 2018

У меня есть ASP.NET Core (v2.1), который должен получить всех пользователей для каждого аутентифицированного пользователя.

Мой FE - Vue.js, и я использую этот пакет, чтобы позволить пользователю проходить аутентификацию через Google (это работает как-то хорошо) Я следовал шаг за шагом в https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/google-logins?view=aspnetcore-2.1&tabs=aspnetcore2x#create-the-app-in-google-api-console и что-то не работает ..

Когда я использую 'postmessage' в качестве своего redirect_uri в своем компоненте Vue, я могу использовать объект googleUser, но redirect_uri неверен, поэтому я не могу обменять код для токенов на своем внутреннем сервере (ASP.NET Core).

Но если я использую настоящий redirect_uri, я настроил его в моей консоли Google API Я получаю сообщение «Состояние oauth отсутствует или недействительно», и URL-адрес соответствует инструкциям, приведенным в документации здесь .

Похоже, что промежуточное программное обеспечение для аутентификации не инициализируется или что-то в этом роде, но я не смог найти никакого решения ..

Мой Startup.cs:

public Startup(IConfiguration configuration)
{
  var builder = new ConfigurationBuilder()        
    .AddJsonFile("appSettings.json",
      optional: false,
      reloadOnChange: true)
    .AddEnvironmentVariables();
    builder.AddUserSecrets<Startup>();     
  Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
  services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

  services.AddAuthentication().AddGoogle(googleOptions =>
  {
    googleOptions.ClientId = Configuration["Authentication:Google:ClientId"];
    googleOptions.ClientSecret = Configuration["Authentication:Google:ClientSecret"];        
  });
  services.AddCors(options =>
  {
    options.AddPolicy("AllowAll", p =>
    {
      p.AllowAnyOrigin()
      .AllowAnyHeader()
      .AllowAnyMethod()
      .AllowCredentials();
    });
  });
  services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }
  else
  {
    app.UseHsts();
  }
  app.UseCors("AllowAll");      
  app.UseHttpsRedirection();
  app.UseAuthentication();
  app.UseMvc();
}

Мой компонент Vue.js, который позволяет пользователям входить в систему:

    <script>
  import Vue from 'vue'
  import { mapMutations, mapState } from 'vuex'

  export default {
    data(router) {
      return {
        section: 'Login',
        loading: '',
        response: ''
      }
    },
    methods: {
      ...mapMutations(['syncUser']),
      signIn: function () {        
        // This lets me get the googleUser object rather than the auth code
        Vue.googleAuth().directAccess()
        Vue.googleAuth().signIn(this.onSignInSuccess, this.onSignInError)
      },
      onSignInSuccess: function (googleUser) {
        this.syncUser({ token: googleUser, provider: 'Google' })
        // This line is redirecting me to this url with the auth code and other things from Google
        googleUser.grantOfflineAccess({ 'redirect_uri': 'http://localhost:1906/signin-google' }).then(function (response) {
          syncUser({ token: response.code, provider: 'Google' })
          //this.toggleLoading()
          //this.resetResponse()
        }, function (error) {
          console.log(error)
        })      
        // this.syncUser({ token: authorizationCode, provider: 'Google' })
      },
      onSignInError: function (error) {
        this.response = 'Failed to sign-in'
        console.log('GOOGLE SERVER - SIGN-IN ERROR', error)
      },
      toggleLoading: function () {
        this.loading = (this.loading === '') ? 'loading' : ''
      },
      resetResponse: function () {
        this.response = ''
      }
    }

  }
</script>

Спасибо:)

1 Ответ

0 голосов
/ 28 января 2019

Кажется, проблема связана с отключением Google+.

Для ASP.NET Core 2.x попробуйте обходной путь, описанный в https://github.com/aspnet/AspNetCore/issues/6486

   services.AddAuthentication().AddGoogle(o => {
            o.ClientId = _configuration["CLIENT_ID"];
            o.ClientSecret = _configuration["CLIENT_SECRET"];
            o.UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo";
            o.ClaimActions.Clear();
            o.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
            o.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
            o.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
            o.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
            o.ClaimActions.MapJsonKey("urn:google:profile", "link");
            o.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
        });
...