CORS 标头“Access-Control-Allow-Origin”丢失)。状态代码:react js 中的 401

问题描述 投票:0回答:3
在标头 axios 中发送访问令牌时遇到问题。它返回以下错误:

从源“http://localhost:3000”访问“http://192.168.0.254:3333/api/DOTMobileApi/test”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我在react js中编写了以下代码:

localStorage.setItem("access_token","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmYW1pbHlfbmFtZSI6Itin2YbYtdin2LHZiiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiLYp9mG2LXYp9ix2YoiLCJuYmYiOjE2NzY0NTMzNTUsImV4cCI6MTY3NjUzOTc1NSwiaXNzIjoibG9jYWxob3N0OjQ0MzQ2IiwiYXVkIjoibG9jYWxob3N0OjQ0MzQ2In0.4w2THPCrSvADow65fEm02H4NWUhGlFblaC6nB6uTgZ8") let response= axios.get('http://192.168.0.254:3333/api/DOTMobileApi/test',{ headers:{ 'Authorization': Bearer ${localStorage.getItem("access_token")} } }) console.log(response)
    
reactjs
3个回答
0
投票
您必须在后端启用 CORS 并将 localhost:3000 添加为受信任域才能正常工作


0
投票
了解 CORS。 您需要将您的主机添加到允许的来源。

在没有库的情况下,你必须做的事情:

// CORS Middleware // ./middlewares/cors.js const allowedCors = [ 'http://localhost:3000', ]; module.exports = (req, res, next) => { const { origin } = req.headers; if (allowedCors.includes(origin)) { res.header('Access-Control-Allow-Origin', origin); res.header('Access-Control-Allow-Credentials', 'true'); const { method } = req; const DEFAULT_ALLOWED_METHODS = 'GET,HEAD,PUT,PATCH,POST,DELETE'; const requestHeaders = req.headers['access-control-request-headers']; if (method === 'OPTIONS') { res.header('Access-Control-Allow-Methods', DEFAULT_ALLOWED_METHODS); res.header('Access-Control-Allow-Headers', requestHeaders); return res.end(); } } return next(); };
在 app.js 中:

const cors = require('./middlewares/cors'); //... app.use(cors);
问你的问题:

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头

但是如果它不是您的API,您需要代理您的请求。在您的服务器上获取数据并将其发送到您的前端


0
投票
我找到了解决方案。我在后端有问题。事实上,app.UseCors("CorsPolicy") 应该写在 app.UseAuthentication(); 之前app.UseAuthorization()

public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Tokens:Issuer"], ValidAudience = Configuration["Tokens:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])), ClockSkew = TimeSpan.Zero, }; }); services.AddHttpClient(); services.AddMemoryCache(); services.AddSession(); services.AddResponseCaching(); services.AddRazorPages(); services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => builder.WithOrigins("http://localhost:3000", "http://apirequest.io" ) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials()); }); services.AddMvc(); services.AddDirectoryBrowser(); services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseDeveloperExceptionPage(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseResponseCaching(); app.Use(async (context, next) => { context.Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue() { Public = true, MaxAge = TimeSpan.FromSeconds(100) }; context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = new string[] { "Accept-Encoding" }; await next(); }); app.UseRouting(); app.UseCors("CorsPolicy"); app.UseAuthentication(); app.UseAuthorization(); app.UseSession(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute("default", "{controller=DOTMobileApi}/{action=Login}/{id?}"); }); }
    
© www.soinside.com 2019 - 2024. All rights reserved.