2016-11-28 62 views
2

我正在使用Angularjs 2作为前端&后端在CakePHP 3.我正在尝试登录时获得401未授权状态。我已经在cakephp 3中配置了JWT,并且在POSTMAN中工作正常。但不能与angularjs 2.获取401未经授权的Post方法[前端 - Angularjs 2和后端 - CakePHP 3]

在这里工作是我的angularjs 2码

loginToken(uname: string, pwd: string): Observable<boolean>{ 
     let json = JSON.stringify({ username: uname , password: pwd}); 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/json'); 
     headers.append('Accept', 'application/json'); 
     let options = new RequestOptions({ headers: headers }); 

     return this.http.post('http://localhost/crm/crm/api/users/token', json, options) 
     .map((response: Response) => { 
       let token = response.json() && response.json().token; 
       if (token) { 
        this.token = token; 
        localStorage.setItem('currentUser' 
         , JSON.stringify({ username: uname, token: token })); 
        return true; 
       } else { 
        return false; 
       } 
     }); 
    } 

CakePHP的3码 - 服务器端

public function token() 
    { 
     $user = $this->Auth->identify(); 
     if (!$user) { 
      throw new UnauthorizedException('Invalid username or password'); 
     } 

     $this->set([ 
      'success' => true, 
      'data' => [ 
       'token' => JWT::encode([ 
        'sub' => $user['id'], 
        'exp' => time() + 604800 
       ], 
       Security::salt()) 
      ], 
      '_serialize' => ['success', 'data'] 
     ]); 

    } 

这里有一些截图 enter image description here

enter image description here

enter image description here 请帮我解决这个问题。

移除选项之后 -

loginToken(uname: string, pwd: string): Observable<boolean>{ 
     let json = JSON.stringify({ username: uname , password: pwd}); 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/x-www-form-urlencoded'); 
     let options = new RequestOptions({ headers: headers }); 

     return this.http.post('http://localhost/crm/crm/api/users/token', json, {headers: headers }) 
     .map((response: Response) => { 
       let token = response.json() && response.json().token; 
       if (token) { 
        this.token = token; 
        localStorage.setItem('currentUser' 
         , JSON.stringify({ username: uname, token: token })); 
        return true; 
       } else { 
        return false; 
       } 
     }); 
    } 

和响应我

enter image description here

enter image description here

+1

貌似CORS的问题,是你要么需要在这是不完全正确的报头中的服务器或东西上配置。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS – Magrangs

+0

是的,我确实感觉一样,但没有得到解决方案,任何建议? –

+0

@NeerajRathod,你有没有修复它,并正常工作?我正在解决同样的问题。我正尝试使用cakephp 3.4.0和Angular 2创建登录和注册功能。您能帮我解决吗? – mageDev0688

回答

1

您的问题是丢失或错误的内容类型头。

对于登录不发送OPTIONS请求内容的类型应该是标准格式类型之一: 应用程序/ x-WWW的形式,进行了urlencoded或多/ form-data的

我认为,文本/疼痛可能也可以工作,但我自己并没有使用它。

编辑:其实有一个SO一下:How to disable OPTIONS request?

+0

您好Vladimir M,我尝试过“内容类型:应用程序/ x-www-form-urlencoded”,但它不起作用,还有其他建议吗? –

+0

它还会发送选项请求吗?如果仍然发送选项,您可能还想从请求中删除“接受”标头。 –

+0

不,我已经删除了选项,并通过'Content-Type','application/x-www-form-urlencoded'传递标头对象。 –

相关问题