如何安全地从我的网络应用程序访问我自己的API?

时间:2015-10-13 07:33:24

标签: api security authentication oauth architecture

我有API。其中一些仅限于OAuth从第三方应用程序访问。

我还有一个Web应用程序。用户可以登录并查看他们的私人信息。

也从Web应用程序调用API。我的问题是通过安全措施访问API的好方法是什么。

1. Third party applications -> OAuth

2. My own web application -> ???

我的网络应用程序使用会话ID进行身份验证。我想用HTTP标头传输会话ID可能是好方法,但我没有信心。

对于exmaple ......

$ curl -X PUT \
       -H "X-Sample-Application-Id: "My own web application's ID" \
       -H "X-Sample-Session-Token: yeoql2dvn7whpm4tbe61viscv" \

如果API收到此请求,请使用会话进行身份验证而不是oauth,并识别用户....

任何帮助将不胜感激。

谢谢,

..我发现了类似的问题

Questions About Consuming Your Own API with OAuth

UPDATE1

有人说JWT(Json Web Token)很好。

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

http://blog.mitsuruog.info/2014/08/jwtjson-web-tokenwebapicredential.html

UPDATE2

我或许可以使用OAuth的“资源所有者密码凭据”

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/709.html

或者......“Client Credentials grant”看起来好多了。

1 个答案:

答案 0 :(得分:10)

我将对此进行详细阐述,因为这是一个很好的问题,并且围绕它存在很多混淆 - 所以请耐心等待。

如果您尝试保护的API将专门用于服务器端应用程序,而非第三方开发人员,我非常高兴,强烈建议您使用HTTP基本身份验证来保护您的API服务。

这种方式非常直接:

  • 对于您的用户,生成由ID和Secret组成的API密钥对。 API密钥与用户名/密码同义。只需使用UUID库生成随机ID /机密值。
  • 对API服务进行身份验证时,请在HTTP Authorization标头中提供这些API凭据以表明您自己的身份。以下是curl

    的外观

    $ curl --user my-api-keyid:my-api-key-secret https://api.myservice.com/blah

Basic Auth的优点在于:

  • 实施起来非常简单。
  • 这是一个定义明确的标准。
  • 只要您通过HTTPS提出请求,并且不公开您的API密钥,就应该是安全的。

现在 - 如果您要构建一个API服务,您希望在其中对来自各种环境(不仅仅是服务器端应用程序)的用户进行身份验证,那么您确实需要使用OAuth2协议。

这就是它的设计目标。

OAuth2协议可以通过各种方式对用户进行身份验证 - 但结果却非常复杂。即使您正在使用常用库等,向您的网站添加OAuth也是一项挑战。

以下是OAuth的工作原理(快速细分):

密码授予

OAuth中的密码流是您为访问令牌(通常是JWT)交换用户名/密码的地方。然后,您可以使用HTTP Authorization标头中的Access Token来标识您的API服务。

这是大多数人在使用Angular / React以及移动应用程序构建SPA时所做的事情。

客户端凭据授权

客户端凭据流是您为访问令牌交换API密钥(就像基本身份验证一样)的地方。然后,您可以使用HTTP Authorization标头中的Access Token来标识您的API服务。

这是人们在使用OAuth构建服务器端应用时所做的事情。

隐含拨款

当您登录Facebook等某个地方时,您会看到此流程。您单击一个按钮,将被重定向到其他站点以验证/接受权限,最后您将使用用于标识自己的Acccess令牌返回主站点。这不是API服务的理想选择。

授权码授权

此流程与隐式流程完全相同,只是您返回授权代码,然后您使用EXCHANGE来交换用于标识自己的访问令牌。这不是API服务的理想选择。它稍微安全一点。

如果您计划因使用案例而使用OAuth,我强烈建议您查看Stormpath等身份验证提供程序。他们自动化了很多这样的东西,并解决了围绕OAuth的许多复杂问题。

否则,请给Basic Auth一个去!