Я использую Angular для создания интерфейсного приложения с графическим интерфейсом для взаимодействия с моим API-сервером, написанным на Go.
Я попытался добавить заголовок на обоих концах, на клиенте и на сервере, но безуспешно. Я попытался отключить перехватчик http, поэтому он не добавляет токен JWT, и в этом случае я получаю ошибку неавторизованного доступа, которая ожидается. Но везде, где я добавляю токен к запросу (с помощью перехватчика или вручную перед выполнением запроса get), ошибка несанкционированного доступа исчезает (пока все хорошо), но затем появляется ошибка отсутствующего заголовка. Сервер должен возвращать данные JSON о сохраненных статьях, и он работает с Postman и другим моим внешним интерфейсом JS.
Go код:
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./index.html")
})
allowedHeaders := handlers.AllowedHeaders([]string{"X-Requested-With"})
allowedOrigins := handlers.AllowedOrigins([]string{"*"})
allowedMethods := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"})
r.HandleFunc("/login", GetTokenHandler).Methods("POST")
apiRouter := r.PathPrefix("/api").Subrouter()
apiRouter.Use(jwtMiddleware.Handler)
apiRouter.HandleFunc("/articles", getArticles).Methods("GET")
apiRouter.HandleFunc("/articles/{id}", getArticle).Methods("GET")
apiRouter.HandleFunc("/articles", createArticle).Methods("POST")
apiRouter.HandleFunc("/articles/{id}", updateArticle).Methods("PUT")
apiRouter.HandleFunc("/articles/{id}", deleteArticle).Methods("DELETE")
fmt.Println("Server running on port", port)
log.Fatal(http.ListenAndServe(port, handlers.CORS(allowedHeaders, allowedOrigins, allowedMethods)(r)))
Угловой запрос на получение:
this.http.get('http://localhost:8000/api/articles')
.subscribe(res => {
console.log(res);
},
err => console.log(err));
Угловой HttpInterceptor:
export class AuthInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.getItem("token");
if (token) {
const cloned = req.clone({
headers: req.headers.append("Authorization", "Bearer " + token)
});
return next.handle(cloned);
}
else {
return next.handle(req);
}
}
}
Я получаю эту ошибку:
... запрос .. был заблокирован политикой CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
Редактировать: Go import:
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
"strings"
"time"
jwtmiddleware "github.com/auth0/go-jwt-middleware"
"github.com/dgrijalva/jwt-go"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
)