我有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”看起来好多了。
答案 0 :(得分:10)
我将对此进行详细阐述,因为这是一个很好的问题,并且围绕它存在很多混淆 - 所以请耐心等待。
如果您尝试保护的API将专门用于服务器端应用程序,而非第三方开发人员,我非常高兴,强烈建议您使用HTTP基本身份验证来保护您的API服务。
这种方式非常直接:
对API服务进行身份验证时,请在HTTP Authorization标头中提供这些API凭据以表明您自己的身份。以下是curl
:
$ curl --user my-api-keyid:my-api-key-secret https://api.myservice.com/blah
Basic Auth的优点在于:
现在 - 如果您要构建一个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一个去!