У меня есть 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>
Спасибо:)