如何保护JavaScript/Ajax客户端[apigee]中使用的API?

如何保护JavaScript/Ajax客户端[apigee]中使用的API?,javascript,ajax,oauth-2.0,apigee,Javascript,Ajax,Oauth 2.0,Apigee,我使用Apigee作为私有RESTAPI的代理,它允许对我的数据库进行基本CRUD操作。前端开发人员希望直接从JavaScript/Ajax调用我的API,因此我不能使用基本的API密钥身份验证,因为任何人都可以查看JS的源代码,并在我的API上调用潜在的破坏性方法(我是浏览器中的异地策略,但这不会阻止有人在浏览器之外执行curl和调用我的API) 最好的方法是什么?一旦用户通过身份验证并在其Ajax调用中使用OAUTH,UI开发人员能否以某种方式使用OAUTH为每个会话获取访问令牌?但即使如此

我使用Apigee作为私有RESTAPI的代理,它允许对我的数据库进行基本CRUD操作。前端开发人员希望直接从JavaScript/Ajax调用我的API,因此我不能使用基本的API密钥身份验证,因为任何人都可以查看JS的源代码,并在我的API上调用潜在的破坏性方法(我是浏览器中的异地策略,但这不会阻止有人在浏览器之外执行curl和调用我的API)

最好的方法是什么?一旦用户通过身份验证并在其Ajax调用中使用OAUTH,UI开发人员能否以某种方式使用OAUTH为每个会话获取访问令牌?但即使如此,该用户不能查看JS源代码并通过curl做些令人讨厌的事情吗


提前感谢!

那么你想授权第三方网站的访问者,并确保他们不会做任何虐待行为

这没有安全模型。一旦你授权用户/会话/浏览器,这就是免费游戏,他可以做任何他想做的事


退一步,你想防止什么样的滥用?也许你想阻止未知的第三方使用你的服务。在这种情况下,你可以在水下设置API密钥身份验证,它会给你一个临时会话密钥

共有三方。用户(u)、使用API的第三方(3)和您(y)

  • u
    3
  • 3
    使用API密钥向
    y
    发出水下请求
  • y
    验证API密钥并将会话密钥发送回
    3
  • 3
    将会话密钥交给
    u
  • u
    服务是否向
    y

如果
3
永远无法获得会话密钥,您的服务对未知的第三方是安全的。

那么您想授权访问您的第三方网站,并确保他们不会做任何滥用的事情吗

这没有安全模型。一旦你授权用户/会话/浏览器,这就是免费游戏,他可以做任何他想做的事


退一步,你想防止什么样的滥用?也许你想阻止未知的第三方使用你的服务。在这种情况下,你可以在水下设置API密钥身份验证,它会给你一个临时会话密钥

共有三方。用户(u)、使用API的第三方(3)和您(y)

  • u
    3
  • 3
    使用API密钥向
    y
    发出水下请求
  • y
    验证API密钥并将会话密钥发送回
    3
  • 3
    将会话密钥交给
    u
  • u
    服务是否向
    y

如果
3
永远无法获得会话密钥,则您的服务对未知的第三方是安全的。

OAuth v2应该可以解决您的问题。Apigee网站上有多篇文章和资源,讨论何时最好使用OAuth v1和OAuth v2。
,一个三条腿的OAuth策略可能最适合您:。Apigee网站上有一个这样的例子。

OAuth v2应该可以解决您的问题。Apigee网站上有多篇文章和资源,讨论什么时候最好使用OAuth v1和OAuth v2。
,一个三条腿的OAuth策略可能最适合您:。Apigee网站上有一个这样的例子。

浏览器可以做的任何事情,用户也可以做。浏览器可以做的任何事情,用户也可以做。我的API不像Facebook那样代表最终用户请求资源。它更像是一个远程后端dat在我的产品模型和客户模型中都有CRUD操作的访问层。一个操作可能是从数据库中获取一些与客户无关的参考数据。鉴于此,是否仍有可能通过Ajax代码确保对这些服务的访问,或者我是否应该要求开发人员在jax和我的API,因此无法从页面源获取API密钥?我的API不像Facebook那样代表最终用户请求资源。它更像是一个远程后端数据访问层,在我的产品模型和客户模型中都有CRUD操作。一个操作可能是获取一些参考数据om是与客户无关的数据库。考虑到这一点,是否仍然可以通过Ajax代码确保对这些服务的访问,或者我是否应该要求开发人员在Ajax和我的API之间创建一个层,以便无法从页面源中获取API密钥?