如何从我的 Web 应用程序安全地访问我自己的 API?
How to access to my own API from my web application securely?
我有 API。其中一些被 OAuth 限制为从第三方应用程序访问。
我还有一个网络应用程序。用户可以登录并查看他们的私人信息。
API 也是从 Web 应用程序调用的。我的问题是使用安全措施访问 API 的好方法是什么。
1. Third party applications -> OAuth
2. My own web application -> ???
我的网络应用程序使用 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 的 "Resource Owner Password Credentials"
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/709.html
或者... "Client Credentials grant" 看起来好多了。
我将对此进行详细说明,因为这是一个很好的问题,并且围绕它存在很多混淆 - 所以请耐心等待。
如果您要保护的 API 将专门供个人用于 server-side 应用程序,而不是 third-party 开发人员,我强烈推荐您使用 HTTP 基本身份验证来保护您的 API 服务。
它的工作方式非常简单:
- 为您的用户生成 API 个由 ID 和 Secret 组成的密钥对。 API 键与 username/passwords 同义。只需使用 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 密钥,您应该是安全的。
现在 -- 如果您正在构建一个 API 服务,您希望在其中对来自各种环境(不仅仅是服务器端应用程序)的用户进行身份验证,那么您确实需要使用 OAuth2 协议。
这就是它的设计目的。
OAuth2 协议可以通过多种方式对用户进行身份验证——但因此非常复杂。将 OAuth 添加到您的站点可能是一个挑战,即使您使用的是流行的库等。
以下是 OAuth 的工作原理(快速分解):
密码授予
OAuth 中的密码流程是您用 username/password 交换访问令牌(通常是 JWT)的地方。然后,您使用 HTTP 授权中的访问令牌 header 来使用您的 API 服务来标识您自己。
这是大多数人在使用 Angular / React 以及移动应用程序构建 SPA 时所做的。
客户端凭据授予
客户端凭证流程是您用 API 密钥(就像基本身份验证)交换访问令牌的地方。然后,您使用 HTTP 授权中的访问令牌 header 来使用您的 API 服务来标识您自己。
这就是人们在使用 OAuth 构建服务器端应用程序时所做的事情。
隐式授予
此流程是您登录 Facebook 等地方时看到的内容。您单击一个按钮,将被重定向到其他站点以进行身份验证/接受权限,最后您将返回到主站点,并带有用于识别您自己的访问令牌。这不适合 API 服务。
授权码授予
此流程与隐式流程完全相同,不同之处在于您取回授权码,然后用该授权码交换您用来识别自己身份的访问令牌。这对于 API 服务来说并不理想。稍微安全一些。
如果您因为您的用例而计划使用 OAuth,我强烈建议您查看像 Stormpath 这样的身份验证提供程序。他们自动化了很多这样的东西,并解决了 OAuth 的很多复杂问题。
否则,试试基本身份验证吧!
我有 API。其中一些被 OAuth 限制为从第三方应用程序访问。
我还有一个网络应用程序。用户可以登录并查看他们的私人信息。
API 也是从 Web 应用程序调用的。我的问题是使用安全措施访问 API 的好方法是什么。
1. Third party applications -> OAuth
2. My own web application -> ???
我的网络应用程序使用 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 的 "Resource Owner Password Credentials"
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/709.html
或者... "Client Credentials grant" 看起来好多了。
我将对此进行详细说明,因为这是一个很好的问题,并且围绕它存在很多混淆 - 所以请耐心等待。
如果您要保护的 API 将专门供个人用于 server-side 应用程序,而不是 third-party 开发人员,我强烈推荐您使用 HTTP 基本身份验证来保护您的 API 服务。
它的工作方式非常简单:
- 为您的用户生成 API 个由 ID 和 Secret 组成的密钥对。 API 键与 username/passwords 同义。只需使用 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 密钥,您应该是安全的。
现在 -- 如果您正在构建一个 API 服务,您希望在其中对来自各种环境(不仅仅是服务器端应用程序)的用户进行身份验证,那么您确实需要使用 OAuth2 协议。
这就是它的设计目的。
OAuth2 协议可以通过多种方式对用户进行身份验证——但因此非常复杂。将 OAuth 添加到您的站点可能是一个挑战,即使您使用的是流行的库等。
以下是 OAuth 的工作原理(快速分解):
密码授予
OAuth 中的密码流程是您用 username/password 交换访问令牌(通常是 JWT)的地方。然后,您使用 HTTP 授权中的访问令牌 header 来使用您的 API 服务来标识您自己。
这是大多数人在使用 Angular / React 以及移动应用程序构建 SPA 时所做的。
客户端凭据授予
客户端凭证流程是您用 API 密钥(就像基本身份验证)交换访问令牌的地方。然后,您使用 HTTP 授权中的访问令牌 header 来使用您的 API 服务来标识您自己。
这就是人们在使用 OAuth 构建服务器端应用程序时所做的事情。
隐式授予
此流程是您登录 Facebook 等地方时看到的内容。您单击一个按钮,将被重定向到其他站点以进行身份验证/接受权限,最后您将返回到主站点,并带有用于识别您自己的访问令牌。这不适合 API 服务。
授权码授予
此流程与隐式流程完全相同,不同之处在于您取回授权码,然后用该授权码交换您用来识别自己身份的访问令牌。这对于 API 服务来说并不理想。稍微安全一些。
如果您因为您的用例而计划使用 OAuth,我强烈建议您查看像 Stormpath 这样的身份验证提供程序。他们自动化了很多这样的东西,并解决了 OAuth 的很多复杂问题。
否则,试试基本身份验证吧!