Symfony3 JWT with LexikJWTAuthenticationBundle 在 Preflight O



>描述:

我正在使用LexikJWTAuthenticationBundle,并尝试使用从我的Ionic2应用程序发送的凭据生成JWT令牌。

生成令牌适用于 Curl 和 Postman。

curl -X POST http://localhost:8000/api/login_check -d _username=root -d _password=root

但是,Ionic2 在实际发送带有凭据的 POST 请求之前会发送预检选项请求。这被Symfony3误解并发回404。

来自 Ionic2 的控制台错误:

选项 http://localhost:8000/api/login_check 404(未找到) XMLHttpRequest 无法加载 http://localhost:8000/api/login_check。

对预检请求的响应未通过访问控制检查:否 "访问控制允许源"标头存在于请求的上 资源。因此不允许使用原产地"http://localhost:8100" 访问。响应具有 HTTP 状态代码 404。

0 - {"isTrusted":true}

异常:0 - {"isTrusted":true}

问题:

我必须在我的Symfony3应用程序中更改什么(也许是我的routeting.yml或security.yml中的某些内容)才能不发回404?

法典:

Ionic2 HttpService:

@Injectable()
export class HttpService {
private baseUrl: string = "http://localhost:8000";
constructor(private http: Http){
}
public create<T>(url: string, extractData, data: any = null): Observable<Array<T>>{
let headers = new Headers({ 'Content-Type': 'application/json'});
let options = new RequestOptions({ headers: headers });
return this.http
.post(this.baseUrl + url, data, options)
.map(extractData)
.catch(this.handleError)
}
//More methods here...
}

Symfony routeting.yml:

api_login_check:
path: /api/login_check
# This line is something I added to see if OPTIONS would work
# However, it did not work.
methods:  [POST, OPTIONS]

类似问题:

Symfony2 JWT 身份验证在预检时返回 404

查看 https://github.com/nelmio/NelmioCorsBundle 到适当的标头。服务器需要使用适当的访问控制允许源响应标头进行响应,例如:

访问控制允许来源:http://localhost:8100

以允许请求成功。

有关 CORS 行为的详细信息:https://www.moesif.com/blog/technical/cors/Authoritative-Guide-to-CORS-Cross-Origin-Resource-Sharing-for-REST-APIs/

解释:

因此,在对这个问题进行了一整天的解开之后,我找到了解决方案。虽然可以合并NelmioCorsBundle(不确定它是否支持Symfony3),但我发现绕过Cors问题有点过分了。

在实际的电话应用程序中,不会发送 OPTIONS 预检请求。这只发生在ionic serve(据我所知)。

这个想法是为Ionic2建立一个代理服务器......说起来容易做起来难。关于它似乎有很多问题。不过,我已经能够让它工作了。

溶液:

在 Ionic2 项目的根目录中应该有一个ionic.config.json。您只需要添加几行:

{
"name": "websurgapp",
"app_id": "",
"v2": true,
"typescript": true,
//This is what I added.
"proxies": [{
"path": "*/api", //<- NOTICE THE */ !
"proxyUrl": "http://localhost:8000/api"
}]
}

然后只需像这样发送请求:

HttpService:

@Injectable()
export class HttpService {http://localhost:8000;
constructor(private http: Http){
}
public create<T>(url: string, data: any = null, contentType: string = 'application/json'): Observable<Array<T>>{
let headers = new Headers({ 'Content-Type': contentType});
let options = new RequestOptions({ headers: headers });
console.log(data);
return this.http
.post(url, data, options)
.map((res:Response)=>res.json())
.catch(this.handleError)
}
}

身份验证服务:

@Injectable()
export class AuthService {
constructor(public httpService: HttpService) {
console.log('Hello AuthService Provider');
}
private currentUser: User;
public login(credentials): any {
console.log("Login called.");
//TODO: Upgrade symfony to 3.3 to be able to use JSON.
let body = new URLSearchParams();
body.append('_username', credentials._username);
body.append('_password', credentials._password);
let result = this.httpService.create("/api/login_check", body, 'application/x-www-form-urlencoded');
return result;
}
}

请注意,我不在请求中发送 JSON。捆绑包当前不支持它。但是,symfony 版本 3.3。(我在 3.1 上。) 确实支持它。

分解一下:

  1. 我的symfony应用程序运行在http://localhost:8000
  2. 我的 Ionic 2 应用程序运行在http://localhost:8100

"path": "*/api" 

简单地说,我们发送的任何请求碰巧有"/api/",都将转换为代理URL。

例如,要生成令牌,我需要将我的凭据发送到"/api/login_check"

我之前尝试过的:

我之前一直在向http://localhost:8000/api/login_check发送请求,这当然会发送一个预检选项请求,导致一大堆错误。

然后我尝试简单地指定"/api/login_check",但 http 请求会添加"http://localhost:8100"infront.. 我的应用程序向自己发送请求......这当然不起作用。

解决方案解释:

代理服务器启动后,我只需向"/api/login_check"发送一个请求,没有任何正面,它就会作为POST request发送到我的symfony3应用程序,没有任何preflight OPTIONS request.

相关内容

  • 没有找到相关文章