angular2,带有凭据的http。无法添加 cookie

Posted

技术标签:

【中文标题】angular2,带有凭据的http。无法添加 cookie【英文标题】:angular2, http with credentials. Can't add cookies 【发布时间】:2017-01-19 03:53:03 【问题描述】:

我已经尝试了一段时间来解决这个问题。我需要使用我的凭据连接到远程服务器,我可以毫无问题地做到这一点。接下来,我需要在服务器上执行获取某些资源的操作,根据我在 Angular 1 中的经验,我需要使用从登录阶段获得的凭据,但我似乎无法获得正确的方法来完成它..

这是我执行登录的方式:

import  Injectable  from 'angular2/core';
import  IjobCard  from '../jobCard/jobCard';
import  Http, Response  from 'angular2/http';
import  Observable  from 'rxjs/Observable';
import  Icredentials  from './credentials';

@Injectable()
export class LoginService 
    private _loginUrl = 'MyUrl/Login';
    loginCred: Icredentials = 
        "filed1": "dummy1",
        "filed2": "dummy2", 
        "filed3": "dummy3"
    ;

    constructor(private _http: Http)

    

    login(): Observable<any>[] 
        return this._http.post(this._loginUrl, JSON.stringify(this.loginCred))
            .map((response: Response) => <any[]>response.json())
            .catch(this.handleError);

    

    private handleError(error: Response)
        console.error(error);
        return Observable.throw(error.json().error || 'Server error');
    

这就是我尝试执行下一次获取的方式:

import  Injectable  from 'angular2/core';
import  IjobCard  from './jobCard';
import  Http, Response, Headers  from 'angular2/http';
import  Observable  from 'rxjs/Observable';

@Injectable()
export class JobCardService 
    private _jobCardUrl = 'MyUrl/SomeGet';
    constructor(private _http: Http) 
    

    getJobCard(): Observable<any>[] 
        var myHeders = new Headers();
        myHeders.append('Content-Type', 'application/json');
        return this._http.get(this._jobCardUrl,  headers: myHeders, withCredentials: true )
        .map((response: Response) => <any[]>response.json())
        .catch(this.handleError);

    

    private handleError(error: Response)
        console.error(error);
        return Observable.throw(error.json().error || 'Server error');
    

可悲的是,我得到的是未经授权的 401,我已经根据 Google 提供的搜索结果尝试了许多其他方法......没有运气。

我能够从 Angular 1 应用程序并使用邮递员连接到相同的服务...

********更新********

好的,我尝试按照 John Baird 回答我的问题,但无法成功。但我得到了一些新的线索来说明问题可能出在哪里:

服务器响应具有以下标头:

Access-Control-Allow-Credentials: true access-control-allow-headers: content-type, accept access-control-allow-methods: GET, POST, PUT, PATCH, DELETE, OPTIONS access-control-allow-origin: http://localhost:3000

我还发现,在我的 angular 1 项目中,请求包含一个像这样的 cookie 标头:

Cookie: B1SESSION=GLWzfesg-sscK-yAH9-PH4m-99r5hCrOdddh; ROUTEID=.node0

但我的 angular2 项目没有,即使使用 withCredentials 标志也是如此。

我尝试通过以下一些想法来解决它: https://github.com/angular/angular/issues/4231 通过将其添加到我的主要内容:

class MyBaseRequestOptions extends BaseRequestOptions 
    headers: Headers = new Headers(
        'X-Requested-With': 'XMLHttpRequest'
    );
    withCredentials: boolean = true;


bootstrap(AppComponent, [
    provide(RequestOptions, useClass: MyBaseRequestOptions) ]);

但我的请求仍然没有发送任何 cookie。

这是正确的道路吗?还有什么想法可以尝试吗?

【问题讨论】:

是否包含授权标头? 既然我不知道你是什么意思,我想我不是。可以举个例子吗? 好的,我相信我理解您的意思并成功实施它,现在我得到:CORS 标头“Access-Control-Allow-Headers”中缺少令牌“授权” 我也有同样的问题...你解决了吗?如果您愿意,您愿意分享您的解决方案吗? 【参考方案1】:

你可以试试这个解决方案,它对我有用

private getHeaders()
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    headers.append('Accept', 'application/json');
    return headers;


public getAll = (): Observable<Account[]> => 
    return this._http.get(this.actionUrl, headers: this.headers, withCredentials: true )
        .map((response: Response) => <Account[]>response.json())
        .catch(this.handleError);

【讨论】:

【参考方案2】:

根据要求,我提供了适合我的解决方案。 这就是我执行登录的方式:

import  Injectable  from 'angular2/core';
import  IjobCard  from '../jobCard/jobCard';
import  Http, Response  from 'angular2/http';
import  Observable  from 'rxjs/Observable';
import  Icredentials  from './credentials';

@Injectable()
export class LoginService 
    private _loginUrl = 'MyUrl/Login';
    loginCred: Icredentials = 
        "filed1": "dummy1",
        "filed2": "dummy2", 
        "filed3": "dummy3"
    ;

    private headers = new Headers( 'Content-Type': 'application/json' );

    constructor(private _http: Http)

    

    login(): Observable<any>[] 
        return this._http.post(this._loginUrl, JSON.stringify(this.loginCred), 
             headers: this.headers, withCredentials: true )
            .map((response: Response) => <any[]>response.json())
            .catch(this.handleError);

    

更改是将 withCredentials 和标头添加到 POST。我没有对我的问题进行任何其他更改,甚至没有对问题进行 ****UPDATE**** 部分。

【讨论】:

【参考方案3】:

好的,这是我在登录后获取用户设置的电话。当您登录时,webapi2 会返回一个令牌,用于授权该用户进行任何后续操作。您需要将该令牌作为授权标头发送...

getSettingsData(userId: number): Observable<User> 
    var headers = new Headers();
    headers.append('Content-Type', this.constants.jsonContentType);
    var t = localStorage.getItem("accessToken");
    headers.append("Authorization", "Bearer " + t);


    return this.http.get(this.constants.userUrl + userId,  headers: headers )
      .map((response: Response) => <User>response.json())
      .catch(this.handleError);
  

但是你的 CORS 错误是它变得棘手的地方。我正在使用 WebApi 2,并且有许多帖子涉及在 IIS 上启用 CORS ......例如这个: Enable CORS in Web API 2

【讨论】:

感谢您的回答,我试过了,但没有成功,我将编辑我的帖子以反映这种尝试以及我到目前为止所学到的一切,如果您有什么要补充的,请发表更多评论!

以上是关于angular2,带有凭据的http。无法添加 cookie的主要内容,如果未能解决你的问题,请参考以下文章

带有 Angular2 和 VS 2015 的 Webpack

Http 发布并获取 json -C#

带有 Spring Boot 和 Spring Security 的 Angular2

如何使用带有表单数据主体而不是 json 主体的 http 'POST'? (Angular2/打字稿)

带有凭据的 AFNetworking 上传任务(HTTP 基本身份验证)

Angular2、NodeJS 和护照问题