2015-10-13 93 views
9

我有API。其中一些仅限于通过OAuth从第三方应用程序访问。如何安全地从我的web应用程序访问我自己的API?

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

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

1. Third party applications -> OAuth 

2. My own web application -> ??? 

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

对于〔实施例...

$ 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网络令牌)是不错的。

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

或者......“客户端克雷德补助金“看起来好多了。

回答

9

我要对此进行详细阐述,因为这是一个很好的问题,周围有很多困惑 - 在我这里一无所知。

如果您试图保护的API将被个人专门用于服务器端应用程序,而不是第三方开发人员,那么我强烈建议您使用HTTP基本认证来保护您的API服务。

这种工作方式是超直截了当:

  • 对于你的用户(一个或多个),生成API密钥对(s)表示,由一个ID和秘密。 API密钥与用户名/密码同义。只需使用UUID库生成随机ID/Secret值。
  • 当您针对您的API服务进行身份验证时,请在HTTP授权标头中提供这些API凭据以标识您自己。下面是它的外观采用curl

    $卷曲--user我-API-keyid的:我的API密钥秘密https://api.myservice.com/blah

什么是伟大的关于基本验证是:

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

现在 - 如果你正在构建,你想从各种环境中(不仅仅是服务器端应用程序)验证用户的API服务,您真正需要使用的OAuth2协议。

这是它的设计目的。

OAuth2协议可以以各种方式对用户进行身份验证 - 但结果相当复杂。添加的OAuth到您的网站是一个挑战,即使你使用流行的库/等

这里的OAuth的工作原理(快速击穿):

密码格兰特

密码在OAuth中流动是您交换访问令牌(通常是JWT)的用户名/密码的地方。然后,您使用HTTP授权标头中的访问令牌标识您的API服务。

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

客户证书授予

凭证流客户是你交换访问令牌的API密钥(就像基本身份验证)。然后,您使用HTTP授权标头中的访问令牌标识您的API服务。

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

的隐格兰特

这种流动是你所看到的,当你登录到Facebook这样的一些地方。您点击一个按钮,重定向到其他网站以验证/接受权限,最后您将返回到主站点,并使用Acccess Token来标识您自己。这不适用于API服务。

授权码格兰特

这种流动是完全一样的隐性流动,除非你回一个授权代码,你再换回你用自己的身份访问令牌。这不适用于API服务。它稍微安全一些。

如果您打算使用OAuth,因为您的用例,我强烈建议您查看Stormpath之类的身份验证提供程序。他们将这些东西自动化,并解决了OAuth周围的诸多复杂问题。

否则,给基本认证一个去吧!

+1

我很抱歉我迟到的回应。你的建议很棒,我从来没有想过这么好的主意。最终我选择了密码授权类型,因为我必须实施我们自己的移动应用程序。 (我们将为第三方移动应用程序开发人员提供我们的API)而且,即使OAuth也非常复杂,但我可以找到一些库。这对我也有好处。使用基本身份验证可能需要自定义实现,不确定,但像创建表保存生成的密钥和秘密。 – zono

+0

感谢您的解释,我有一些关于密码授权的问题。我已经构建了一个授权服务器,该服务器使用需要client_id和client_secret的基本认证来保护oauth /令牌,以便接受请求。但我怎样才能保护client_secret?客户端是一个Angular 2应用程序。有必要使用基本身份验证来保护oauth/token uri? – Paolo

相关问题