2017-11-20 16 views
2

これは私の最初の投稿です。AuthorizationヘッダーをAngular httpリクエストに追加するにはどうすればよいですか?

私はちょうどGoとAngularを学び始めました。私は、アングルアプリをgo apiに接続しようとしています。私は両方を書いており、問題の根本を特定している。 CORSの問題だと思っていましたが、Angular httpリクエストにヘッダー行を含めないと正常に動作します。この時点で、私はヘッダを追加しようとしています。承認コードはまだ実装されていません。

両方のアプリケーションがポート5000上で囲碁アプリでローカルに実行し、動作しない4200

角度のHTTPリクエストに応じて角度いる:作品

this.http.get<ProjectedBalance>(requestUrl, {headers: new HttpHeaders().set('Authorization', 'my-auth-token')}) 
    .subscribe(data => { 
    this.projBalance = data.projBalance; 
    } 

角度httpリクエスト:

this.http.get<ProjectedBalance>(requestUrl) 
    .subscribe(data => { 
    this.projBalance = data.projBalance; 
    } 

このエラーが発生します:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:4200 ' is therefore not allowed access. The response had HTTP status code 403

私はここではクローム開発ツールから、私の行くのコード内のハンドラ

router := mux.NewRouter() 
router.HandleFunc("/home/{endDate}", GetProjBalance).Methods("GET", "OPTIONS") 
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With, Content-Type, Authorization"}) 
originsOk := handlers.AllowedOrigins([]string{"*"}) 
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) 
//start server on port 
log.Fatal(http.ListenAndServe(":5000", handlers.CORS(originsOk, headersOk, methodsOk)(router))) 

ヘッダ

Request URL:http://localhost:5000/home/2020-12-21 
Request Method:OPTIONS 
Status Code:403 Forbidden 
Remote Address:[::1]:5000 
Referrer Policy:no-referrer-when-downgrade 

Response Headers 
view source 
Content-Length:0 
Content-Type:text/plain; charset=utf-8 
Date:Mon, 20 Nov 2017 21:39:43 GMT 

Request Headers 
view source 
Accept:*/* 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.9,uz;q=0.8 
Access-Control-Request-Headers:authorization 
Access-Control-Request-Method:GET 
Connection:keep-alive 
Host:localhost:5000 
Origin:http://localhost:4200 
+0

あなたの投稿を質問の形で言い換えることを検討してください... – maerics

+0

私は 'handlers.CORS'がなぜ機能していないのか分かりませんが、CORSを使用しないと、開発リクエストをプロキシする必要があります本番環境では、ポート80で実行されますので、競合はありませんが、Angleのdevサーバーを使用してサーバーをローカルに実行しているので、 'localhost:4200'と' localhost:5000'は異なる起点です。私は、これを行うための "角度のある5つの方法"が何であるか分かりませんが、 'webpack-dev-server'は' package.json'に非常に単純な 'proxy'フィールドを持ち、基本的にそれを複製したいと思っています。 – Brian

+0

こんにちはgobuckeyesは、あなたのクライアントがAPIのリクエストで送るヘッダのリストを私に提供してもいいですか?_(dev-toolsのネットワークタブから)_。 3 ** CORS **を '{" * '} 'に設定しても問題は残りますか? – Mihailo

答えて

4

角で>の認証ヘッダーを処理する最良の方法については、
を使用するのが最善ですHttp Interceptorsをリクエストごとに追加し、その後は経路を保護するために
Guardsを使用してください。

ここで私は私のアプリで使用しているAuthInterceptorの完全な例です:

auth.interceptor.ts

import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; 
import { Injectable } from '@angular/core'; 

import { Observable } from 'rxjs/Observable'; 

import { AuthService } from './auth.service'; 

@Injectable() 
export class AuthInterceptor implements HttpInterceptor { 
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    req = req.clone({ 
     setHeaders: { 
     'Content-Type' : 'application/json; charset=utf-8', 
     'Accept'  : 'application/json', 
     'Authorization': `Bearer ${AuthService.getToken()}`, 
     }, 
    }); 

    return next.handle(req); 
    } 
} 

あなたがプロバイダとしてapp.moduleであなたのインターセプタを登録する必要があります:

app.module.ts

import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; 
import { AuthInterceptor } from '../auth/auth.interceptor'; 

... 

imports: [ 
    HttpClientModule, 
    ... 
], 
providers: [ 
    { 
     provide : HTTP_INTERCEPTORS, 
     useClass: AuthInterceptor, 
     multi : true, 
    }, 
    ... 
], 

... 

この方法については、postでさらに読むことができます。


物事のゴーの側面に関しては、これが最も可能性の高いあなたが送っていると、ヘッダーCORSができるよう
リクエストヘッダの間のミスマッチの場合です。あなたは試してみてください
まず最初は、それらのすべてが可能されています

headersOk := handlers.AllowedHeaders([]string{"*"}) 
originsOk := handlers.AllowedOrigins([]string{"*"}) 
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) 

、問題が消えている場合は、あなたのクライアントが送信しているものに、あなたのCORS一つ一つを構成丁寧にしてみてください。

+1

これは、Angularアプリ内でヘッダーを追加するために機能しました。ありがとう! Goの作品では、私はこのアプローチを使用することができました。 https://stackoverflow.com/questions/22452804/angularjs-http-get-request-failed-with-custom-header-alllowed-in-cors/22457910#22457910 – gobuckeyes2

+0

Neat!私はいくつかの助けになることができてうれしい:)幸運! – Mihailo

1

/ゴリラ/マルチプレクサとゴリラを使用しています例です。

this.http 
     .get(url, return new RequestOptions({ 
      headers: new Headers({ 
      Authorization: `Bearer ${authtoken}` 
      }), 
     })) 
     .map(res => res.json());