2017-05-31 66 views
0

我在使用AuthHttp时遇到错误,但authenticate返回一个好的标记。我在https://jwt.io/上验证它,这很好。Angular angular2-jwt:使用AuthHttp获取错误:JWT必须有3个部分

我采用了棱角分明4. 我的代码如下:

登入码

signIn(login: string, password: string) { 
    this.UserLogin.name = login; 
    this.UserLogin.password = password; 

    this.http.post(this.baselink + '.json', this.UserLogin, { headers: contentHeaders }) 
     .subscribe(
     response => { 
     localStorage.setItem('id_toke', response.json().token); 
     this.jwt = localStorage.getItem('id_toke'); 
     this.decodedJwt = this.jwtHelper.decodeToken(this.jwt); 
     this.userRole = this.decodedJwt.roles; 
     console.log(this.userRole); 
     this.useJwtHelper(); 
     this.router.navigate(['/']); 
     }, 
     error => { 
     console.log('Http Error ' + error.text()); 
     this.router.navigate(['http-error']); 
     } 
    ); 
    } 

token ![enter image description here]1:"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInJvbGVzIjpbInJlYWQtb25seSIsInJlYWQtd3JpdGUiXSwiaWF0IjoxNDk2MTkxNDg4LCJleHAiOjE0OTYyMDAwODh9.qPCQY3yHujuCLb9g-F5b0MUQO3tyTr_Y5YRoMOQ0DBA"

enter image description here

没有从中得到的数据是抛出错误

getPayments() { 
     return this.authHttp.get(this.baselink + '/getPayments', { headers: contentHeaders }) 
      .map(
      (response: Response) => { 
       const data = response.json(); 
       return data; 
      } 
      ) 
      .catch(
      (error: Response) => { 
       console.log('Error getPayments: ' + error); 
       return Observable.throw('Something went wrong: ' + error.text); 
      } 
      ); 
    } 

并获得

Error getPayments: Error: JWT must have 3 parts

话说回来,如果我用return this.http.get(this.baselink + '/getPayments'),而不是它的工作原理。 AuthHttp的连接没有到达服务器。这种特定的控制器并不局限于作为服务器的时间,但其目的是保护它 可能令牌不AuthHttp头包括

@NgModule({ 
    providers: [ 
     { 
      provide: AuthHttp, 
      useFactory: authHttpServiceFactory, 
      deps: [Http, RequestOptions] 
     } 
    ] 
}) 
export class AuthorizationModule { } 


export function authHttpServiceFactory(http: Http, options: RequestOptions) { 
    return new AuthHttp(new AuthConfig({ 
     headerName: 'Authorization', 
     headerPrefix: 'bearer', 
     tokenName: 'token', 
     tokenGetter: (() => localStorage.getItem('id_token')), 
     globalHeaders: [{ 'Content-Type': 'application/json' }], 
     noJwtError: true 
    }), http, options); 
} 

和全局头部

export const contentHeaders = new Headers(); 
contentHeaders.append('Accept', 'application/json'); 
contentHeaders.append('Content-Type', 'application/json'); 
+0

**更新** 这是一个服务器端交叉问题。显然,浏览器会发送2个呼叫,要求服务器允许该标头和服务器批准它。 在我的情况下,在服务器端,我需要将我的url添加到FilterRegistraionBean。我添加了它,但不正确 – Rami

回答

0

我改变了我功能下面

getPayments(): Observable<Payment[]> { 
    // add authorization header with jwt token - mine is saved in authService service in jwt variable 
    let headers = new Headers({ 'Authorization': 'Bearer ' + this.authService.jwt }); 
    let options = new RequestOptions({ headers: headers }); 


    return this.http.get(this.baselink + '/getPayments', options) 
     .map((response: Response) => response.json()) 
     .catch(
     (error: Response) => { 
      console.log(error); 
      return Observable.throw('Something went wrong: ' + error.text); 
     }); 
} 

现在收到此错误

function (encodingHint) { 
     if (encodingHint === void 0) { encodingHint = 'legacy'; } 
     if (this._body instanceof URLSearchParams) { 
      return this._body.toString(); 
     } 
     if (this._body instanceof ArrayBuffer) { 
      switch (encodingHint) { 
       case 'legacy': 
        return String.fromCharCode.apply(null, new Uint16Array(/** @type {?} */ (this._body))); 
       case 'iso-8859': 
        return String.fromCharCode.apply(null, new Uint8Array(/** @type {?} */ (this._body))); 
       default: 
        throw new Error("Invalid value for encodingHint: " + encodingHint); 
      } 
     } 
     if (this._body == null) { 
      return ''; 
     } 
     if (typeof this._body === 'object') { 
      return JSON.stringify(this._body, null, 2); 
     } 
     return this._body.toString(); 
    } 

检查服务器端,授权是否丢失!

更新 这是一个服务器端交叉问题。显然,浏览器会发送2个呼叫,要求服务器允许该标头和服务器批准它。 在我的情况下,在服务器端,我需要将我的url添加到FilterRegistraionBean。我有它添加但不正确

相关问题