如何将内部和外部REST API请求区分?

问题描述 投票:1回答:1

在服务器上,是否有任何方式的内部和外部的REST API请求之间进行区分?

为什么?

我想区分两个来源,究其原因是因为我可以,根据该意见,受访者给出的,想返回不同的数据集,这取决于谁是试图发出请求。

摘要

我的内部定义可能不正确。在这种情况下,“内部”是指从来自同一域的页面处理请求的请求XHTTP做出的请求。

外部呼叫可能创造另一个域上卷翘请求的用户。

例如:

http.service.ts

内部ANGULAR 6 REQUEST


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)
    );
  }

template.cfm

外部COLDFUSION REQUEST


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

<cfhttp url="#httpUrl#" method="post" result="result" timeout="30">
  <cfhttpparam type="header" name="email" value="[email protected]" />
  <cfhttpparam type="header" name="password" value="foo" />
</cfhttp>

请您理解,我已经简化这两个代码片段让事情变得清晰。

当请求到达服务器,我怎么能知道哪些请求通过XHTTP来,已通过CFHTTP [卷曲]已发送?

我使用Taffy.io REST API框架,所以这里是一个简单的方法,一个“资源” CFC里面,我可能会用它来处理请求:

资源/ oauthMember.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 Lucee 4.5 IIS7 +

angular api http coldfusion taffy
1个回答
3
投票

总之,你不能进来公共REST API数据请求相信任何东西了。在请求内容的任何/标头可通过卷曲或定制程序来constucted。你,或许,可能有插座的源IP地址一定程度的信任,如果你的Web服务器相应的配置,并且具有从插座本身到源极连接地址直接访问。这是罕见的情况下,如今,作为一般的Web服务器现在位于负载平衡器后面,NAT防火墙隧道等,但即使在这种情况下,源IP地址可能只可用于某种白名单。此外,今天有这种访问的服务器,可能会失去它的明天,当你的应用程序可能需要负载均衡规模。还要注意的是,用户可以有一个源路径上的HTTP代理。因此,使用的源IP作为API的标准看起来不好的做法。

良好的做法是创建公共API,它是不变的调用者。 API调用应集中在REST请求主体和提供检查他们的有效性,可接受性和安全性头。 > sessionToken - - >“API与sessionToken称之为” - 事实上,许多API调用应该像“登陆”顺序进行>“注销与sessionToken”(令牌无效)。在这种情况下,重要的数据存储在连接到sessionToken莫名其妙服务器(用户ID,角色,安全上下文等)。注:很多API建筑师不建议存放在sessionToken饼干,因为它可以简化CSRF攻击(如果没有其他措施提供)。

你和可能很多人要的是有“私人” API来实现你的网站功能本身和“公共”的API给客户。这是一个有点不同的故事。

公共API您记录,发布(至少对客户),承诺在较长时间内保持不变。

私人API,你可以在任何时刻发生变化,你可能的方式,是舒适的你设计的。但是,如果你的网站是活的,任何人都可以仍然扫描自己的流量和构建具有卷曲(或东西一样)类似的请求。你可以,但是,做一些技巧来取得施虐者的日子越来越难过,像发行某种JavaScript的计算网页的令牌,用短暂的请求链等,但是这并没有完全消除威胁。所以API不能中继上,“没有人可以构建这样的要求”如果要求所有的数据可以从页面和流量由合法用户来获得。

简历:最好有客户和私人API,以网站本身的公共API和不混合。

© www.soinside.com 2019 - 2024. All rights reserved.