我有 API。其中一些仅限于通过 OAuth 从第三方应用程序访问。
我也有一个网络应用程序。用户可以登录并查看他们的私有(private)信息。
该 API 也是从 Web 应用程序调用的。我的问题是通过安全措施访问 API 的好方法是什么。
1. Third party applications -> OAuth
2. My own web application -> ???
我的 Web 应用程序使用 session ID 进行身份验证。我想用 HTTP header 传输 session id 可能是个好方法,但我没有信心。
例如...
$ curl -X PUT \
-H "X-Sample-Application-Id: "My own web application's ID" \
-H "X-Sample-Session-Token: yeoql2dvn7whpm4tbe61viscv" \
如果 API 收到此请求,请使用 session 进行身份验证而不是 oauth 并识别用户....
任何帮助将不胜感激。
谢谢,
..我发现了类似的问题
Questions About Consuming Your Own API with OAuth
更新1
有人说 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
更新2
我也许可以使用 OAuth 的“资源所有者密码凭据”
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/709.html
或者......“客户凭证授予”看起来好多了。
最佳答案
我将对此进行详细说明,因为这是一个很好的问题,并且围绕它有很多困惑——所以请耐心等待。
如果您尝试保护的 API 仅供个人用于服务器端应用程序,而不是第三方开发人员,我强烈建议您使用 HTTP 基本身份验证来保护您的 API 服务。
它的工作方式非常简单:
curl
时的样子:$ curl --user my-api-keyid:my-api-key-secret https://api.myservice.com/blah
Basic Auth 的优点在于:
现在——如果你正在构建一个 API 服务,你想对来自各种环境(不仅仅是服务器端应用程序)的用户进行身份验证,你真的需要使用 OAuth2 协议(protocol)。
这就是它的设计目的。
OAuth2 协议(protocol)可以通过多种方式对用户进行身份验证——但结果是相当复杂。将 OAuth 添加到您的站点可能是一个挑战,即使您使用的是流行的库等。
以下是 OAuth 的工作原理(快速分割):
密码授予
OAuth 中的密码流程是您将用户名/密码交换为访问 token (通常是 JWT)的地方。然后,您可以使用 HTTP 授权 header 中的访问 token 来向您的 API 服务标识您自己。
这是大多数人在使用 Angular/React 以及移动应用程序构建 SPA 时所做的。
客户凭证授予
客户端凭据流程是您将 API key (就像基本身份验证一样)交换为访问 token 的地方。然后,您可以使用 HTTP 授权 header 中的访问 token 来向您的 API 服务标识您自己。
这就是人们在使用 OAuth 构建服务器端应用程序时所做的事情。
隐式赠款
当您登录 Facebook 等某个地方时,您会看到此流程。您单击一个按钮,被重定向到其他站点以进行身份验证/接受权限,最后您将返回主站点,并带有用于标识您自己的访问 token 。这对于 API 服务来说并不理想。
授权码授予
此流程与隐式流程完全相同,不同之处在于您返回一个授权代码,然后您将其交换为用于标识您自己的访问 token 。这对于 API 服务来说并不理想。它稍微安全一些。
如果您因为您的用例而计划使用 OAuth,我强烈建议您查看像 Stormpath 这样的身份验证提供程序。 .他们自动化了很多这些东西,并解决了围绕 OAuth 的很多复杂性。
否则,请尝试基本身份验证!
关于api - 如何安全地从我的 Web 应用程序访问我自己的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33096701/