api - 如何安全地从我的 Web 应用程序访问我自己的 API?

标签 api security authentication oauth architecture

我有 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 服务。

它的工作方式非常简单:

  • 对于您的用户,生成由 ID 和 Secret 组成的 API key 对。 API key 与用户名/密码同义。只需使用 UUID 库生成随机 ID/Secret 值。
  • 当您针对您的 API 服务进行身份验证时,请在 HTTP 授权 header 中提供这些 API 凭据以识别您自己。这是使用 curl 时的样子:

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

  • Basic Auth 的优点在于:
  • 实现起来非常简单。
  • 这是一个定义明确的标准。
  • 只要您通过 HTTPS 发出请求,并且您不公开您的 API key ,您就应该是安全的。

  • 现在——如果你正在构建一个 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/

    相关文章:

    java - 使用 LDAP 的 Windows 密码身份验证

    javascript - 使用 AngularJS : auth cookie sent for/_session only 登录 CouchDB

    javascript - 如何在 React 中显示来自 vimeo 播放器的视频的 iframe?

    api - 允许按来源和日期搜索的新闻 API

    python - 如何从python脚本读取json文件中的列表

    api - Elasticsearch -- 获取过去 24 小时内日志类型的计数

    reactjs - 使用 HOC 包装时,组件不会从 getStaticProps 接收 Prop

    java - nginx.conf中的 "location/logs"和 "location/logs/"有什么区别

    ios - 安全运送名称

    node.js - 使用 HTTPS 时是否需要额外加密?