Angular 如何区分内部和外部;外部RESTAPI请求?

Angular 如何区分内部和外部;外部RESTAPI请求?,angular,api,http,coldfusion,taffy,Angular,Api,Http,Coldfusion,Taffy,在服务器上,有没有办法区分内部和外部RESTAPI请求 为什么? 我之所以要区分这两个来源,是因为根据受访者给出的建议,我可能希望返回不同的数据集,这取决于试图提出请求的人 摘要 我对内部的定义可能不正确。在本例中,“internal”是指从处理请求的页面所在域的XHTTP请求发出的请求 外部调用可能是用户从另一个域创建Curl请求 例如: http.service.ts 内部角度6请求 fetchLogin(formData: any): Observable<any> {

在服务器上,有没有办法区分内部和外部RESTAPI请求

为什么?

我之所以要区分这两个来源,是因为根据受访者给出的建议,我可能希望返回不同的数据集,这取决于试图提出请求的人

摘要

我对内部的定义可能不正确。在本例中,“internal”是指从处理请求的页面所在域的XHTTP请求发出的请求

外部调用可能是用户从另一个域创建Curl请求

例如:

http.service.ts

内部角度6请求


fetchLogin(formData: any): Observable<any> {
    let req = null;
    let headers = null;
    headers = {
      reportProgress: false,
      headers: new HttpHeaders({
        'email': formData['email'],
        'password': formData['password']
      })
    };
    req = new HttpRequest('POST', this.restApiUrl + this.restApiUrlEndpoint + '/oauth/', '', headers);
    return this.http.request(req)
    .map( (data) => {
      return 'body' in data ? data['body'] : null;
    })
    .pipe(
      catchError(this.handleError)
    );
  }


fetchLogin(formData:any):可观察{
设req=null;
让headers=null;
标题={
报告进度:错误,
标题:新的HttpHeaders({
“电子邮件”:formData[“电子邮件”],
“密码”:formData[“密码”]
})
};
req=new-HttpRequest('POST',this.restApiUrl+this.restapiurlenpoint+'/oauth/','',headers);
返回此.http.request(req)
.map((数据)=>{
返回数据中的“body”?数据['body']:空;
})
.烟斗(
catchError(this.handleError)
);
}
模板.cfm

外部冷融合请求


<cfset httpUrl = request.restApiUrl & request.restApiUrlEndpoint & "/oauth/">

<cfhttp url="#httpUrl#" method="post" result="result" timeout="30">
  <cfhttpparam type="header" name="email" value="foo@bar.com" />
  <cfhttpparam type="header" name="password" value="foo" />
</cfhttp>


请理解,我简化了这两个代码片段以保持清晰

当请求到达服务器时,我如何判断哪个请求是通过XHTTP发送的,哪个是通过CFHTTP[Curl]发送的

我使用的是Taffy.io REST API框架,因此在“资源”CFC中有一个简化的方法,我可以使用它来处理请求:

资源/oauthmber.cfc

<cfcomponent extends="taffy.core.resource" taffy_uri="/oauth">

<cffunction name="post">
  <cfset var local = StructNew()>
  <cfset local.data['email'] = "">
  <cfset local.data['password'] = "">
  <cfset local.requestBody = getHttpRequestData().headers>
  <cftry>
    <cfset local.data['email'] = Trim(local.requestBody['email'])>
    <cfset local.data['password'] = Trim(local.requestBody['password'])>
    <cfcatch>
    </cfcatch>
  </cftry>
  ...processing code
  <cfreturn representationOf(local.data) />
</cffunction>

</cfcomponent>


…处理代码
向其中一个调用添加额外的头是不可行的,因为这很容易被欺骗

有什么想法吗

环境

Windows 2008R2 Lucee4.5
IIS7+

简而言之,在公共RESTAPI数据中,您不能信任任何即将到来的请求。请求内容/头中的任何内容都可以由curl或自定义程序构造。若您的web服务器进行了相应的配置,并且可以从套接字本身直接访问源连接地址,那个么您可能对套接字源IP地址有一定的信任。现在这种情况很少见,因为通常web服务器现在位于负载平衡器、带有NAT隧道的防火墙等后面。但即使在这种情况下,源IP地址也可能仅用于某种白名单。此外,今天具有这种访问权限的服务器明天可能会丢失它,此时您的应用程序可能需要负载平衡器来扩展。还要注意,用户可能在源路径上有HTTP代理。因此,使用源IP作为API标准看起来是不好的做法

良好的实践是创建对调用方不变的公共API。API调用应该集中在REST请求主体和提供的头上,以检查它们的有效性、可接受性和安全性。实际上,许多API调用都应该按顺序进行,比如“login”->sessionToken->“使用sessionToken进行API调用”->“使用sessionToken进行注销”(令牌无效)。在这种情况下,重要数据(用户Id、角色、安全上下文等)存储在连接到sessionToken的服务器上。注意:许多API架构师不建议将sessionToken存储在cookie中,因为它可能会简化CSRF攻击(如果没有提供其他对策)

您和许多其他人想要的是使用“私有”API来实现您的网站功能本身,并向您的客户提供“公共”API。这是一个有点不同的故事

您记录、发布(至少向客户发布)的公共API,承诺长期保持不变

您可以随时更改私有API,并且可以以一种让您感到舒适的方式进行设计。但是,如果您的站点是实时的,任何人都可以扫描自己的流量,并使用curl(或类似的东西)构造类似的请求。然而,您可能会使用一些技巧让施虐者的生活更加艰难,比如发布某种JavaScript计算的页面标记,使用短期请求链等,但这并没有完全消除威胁。所以,如果合法用户可以从页面和流量中获取请求的所有数据,API就不能依赖“没有人可以构造这样的请求”

简历:
最好让客户使用公共API,而站点本身使用私有API,不要混用它们。

你能提供一点背景信息吗?你为什么需要区分这一点?@jonrsharpe我已经为这个问题添加了我的理由。如果这个理由有道理,请你取消否决票。谢谢…“我可以”-嗯,你呢?如果没有,雅格尼。如果你这样做了,会有什么不同?这实际上应该取决于请求是否是“内部”的,而不是你可以区别对待的其他任何东西吗?@jornsharpe“我可能”取决于我从受访者那里得到的建议是否可行。这也是我首先提出这个问题的部分原因……不,端点永远不应该返回基于消费者的不同响应。如果有两个不同的响应,则使用两个单独的端点并要求不同的身份验证。无论发送到客户端还是服务器端,请求都可能是伪造的。感谢Serge提供的深入信息。这正是我需要的知识。这当然比乔恩·夏普(Jon Sharpe)的否定回答要好,他在我发布这个问题仅仅10分钟后就否决了这个问题。我对RESTAPI还比较陌生,希望能对最佳实践等有所了解。再次感谢。我正在对答案进行投票,在接受答案之前,我会等着看是否有其他回应。不客气,如果你认为答案有帮助,请随意接受。