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

我有API。其中一些仅限OAuth通过第三方应用程序进行访问。

我也有一个Web应用程序。用户可以登录并查看其私人信息。

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

1. Third party applications -> OAuth

2. My own web application -> ???

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

例如...

$ curl -X PUT \
       -H "X-Sample-Application-Id: "My own web application's ID" \
       -H "X-Sample-Session-Token: yeoql2dvn7whpm4tbe61viscv" \

如果API收到此请求,请使用会话进行身份验证而不是oauth并标识用户...。

任何帮助将不胜感激。

谢谢,

..我发现了类似的问题

关于使用OAuth消费自己的API的问题


更新1

有人说JWT(Json Web令牌)很好。

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和密钥组成的API密钥对。API密钥与用户名/密码同义。只需使用UUID库生成随机ID /秘密值。
  • 当您通过API服务进行身份验证时,请在HTTP授权标头中提供这些API凭据以标识自己。使用以下内容的样子curl

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

基本身份验证的优点在于:

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

现在-如果您要构建一个API服务,并希望从各种环境(而不仅仅是服务器端应用程序)对用户进行身份验证,则确实需要使用OAuth2协议。

这就是它的设计目的。

OAuth2协议可以通过多种方式对用户进行身份验证-但结果非常复杂。即使您使用的是流行的库等,将OAuth添加到您的网站也可能是一个挑战。

这是OAuth的工作方式(快速细分):

密码授予

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

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

客户证书授予

客户端凭据流是您为访问令牌交换API密钥(就像基本身份验证一样)的地方。然后,您可以使用HTTP授权标头中的访问令牌来使用API​​服务标识自己。

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

内隐补助

当您登录到Facebook之类的地方时,会看到此流程。您单击一个按钮,将其重定向到其他站点以进行身份​​验证/接受权限,最后,您将返回带有用于识别自己身份的访问令牌的主站点。这不是API服务的理想选择。

授权码授予

此流程与隐式流程完全相同,除了您获取授权码,然后将其交换以用于标识自己的访问令牌外,该流程与隐式流程完全相同。这不是API服务的理想选择。它稍微安全些。

如果由于您的用例而打算使用OAuth,我强烈建议您签出一个身份验证提供程序,例如Stormpath他们使很多这类东西自动化,并解决了OAuth周围的许多复杂问题。

否则,请试用基本身份验证!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以使用WebAssembly在我的Web应用程序中安全地执行不受信任的用户代码吗?

如何在我的Web应用程序上安全地接受和运行用户代码?

如何在我的Web应用程序上安全地接受和运行用户代码?

如何访问我的Spring Boot应用程序中Jar文件的Controller类中提到的Rest API

如何获取访问我的应用程序内容提供商的应用程序包名称?

如何创建使VBA可以访问我自己正在运行的应用程序的组件?

Node.js Azure Web应用程序无法访问我的路线

如何授权多个客户端应用程序访问我的Azure存储资源?

如何使用Web应用程序安全地验证AWS API Gateway中的请求

如何使我的用户访问我的应用程序中自己的存储桶

我可以安全地禁用哪些启动应用程序?

如何允许另一个应用程序访问我的应用程序的数据目录?

如何在URL末尾使用/不使用/访问我的Web应用程序

如何从多线程C ++ Linux应用程序安全地运行Shell脚本?

如何在AppHarbor上安全地存储应用程序的AWS密钥?

我的C#应用程序应如何安全地连接到我的AWS EC2数据库?

Silex-如何访问我的Web根目录和应用程序根目录

如何在ASP.Net Web窗体应用程序中从Jquery安全地调用用于内部目的的Web服务(.asmx)?

如何在C#应用程序中安全地存储FTP凭据?

应用程序数据安全性-不想让用户访问我的Android应用程序文件

如何在WPF C#应用程序中安全地部署PPK文件?

添加MS身份后无法访问我的MVC 5 Web应用程序

无法使用iPhone访问我的Web应用程序

如何访问我的应用程序中的机器人框架?

在本地访问我的 dockerized Laravel 应用程序

我能否安全地访问特定的电子 API?

在 UWP 应用程序中安全地存储访问令牌的位置?

在我的 React 和 Nodejs Web 应用程序中,我可以在哪里以及如何安全地存储私人资料图片?

OAuth2 PKCE 流程 - 从单页应用程序安全地使用访问令牌