api - 如何验证用户从 Web 应用程序到 API 的身份?

标签 api authentication rest openid

这似乎是一个被广泛提出的问题,在阅读了大量关于该主题的文档后,我仍然不确定是否正确理解了所有内容(我认为愚蠢是一个可能的答案;))。

我正在尝试构建一个为用户提供服务的 API。用户将通过 Facebook 或任何 OpenId 提供商进行连接(我将 Facebook 分开,因为他们实现了自己的连接系统)。

(我认为这是一个好方法,因为我不会存储用户的密码,最终在出现类似 Gawker 问题的情况下问题会更少。)

当客户端(Web 应用程序、移动应用程序等)向 API 发出请求时,必须随请求发送一个指示符,以识别哪个用户正在使用该应用程序。这通常通过 使用 token ,在身份验证期间定义。

但是关于认证,我不能找到任何有值(value)的例子、教程、关于如何正确实现它的解释。

我会(尝试)解释:

在我的(快乐护理熊的美妙世界)中,我将我的项目分为多个部分:

  • RESTful API
  • 将使用 api 的网络应用程序。理想情况下,我正在考虑制作一个完整的 html/css/js 项目,没有任何服务器端工作(php/python/java 或其他)
  • 一款手机应用
  • 一个 windows/mac/linux 应用程序

  • 据我所知,每次有人问如何实现 RESTful API 身份验证时,都会弹出三个主要答案:
  • HTTP 基本(+ 最好是 SSL)/摘要方式
  • OAuth
  • OpenId

  • 由于我不会存储用户的密码,第一个是我的,但另外两个让我感到困惑。

    但是 OAuth 和 OpenId 是 不是 同样,一个 (OpenId) 代表 认证 (问题的基础)其中第二个 (OAuth) 代表 授权 !

    当 Twitter 为其 API 实现 OAuth 时,他们并没有实现身份验证系统,而是设置了一种方法来指示其用户应用程序 X 想要访问用户帐户(在不同级别的访问权限)。如果用户当前未登录 Twitter,他将 第一 必须验证自己,然后 授权当前应用程序访问他的数据。

    所以,为了解决问题, OAuth 不是一种身份验证机制 , 它是 :

    An open protocol to allow secure API authorization (source: http://oauth.net/)



    然后,对用户进行身份验证的唯一方法是使用 OpenId。然后, hell 成真。

    如果我以一个完全由 html/css/js 组成的 Web 应用程序为例,没有服务器端组件,则与 API 进行通信。

    Web 应用程序必须向 API 表明当前使用 API 的用户是 X 先生。

    为此,Web 应用程序会显示一个包含 OpenId 提供程序列表的弹出窗口,要求用户对自己进行身份验证。用户点击其中一个,被重定向(或打开一个新的弹出窗口)到 OpenId 提供者,表明他的登录/通行证,通过 OpenId 提供者进行身份验证,用 token 返回成功(我简化了通信)。

    太好了,Web 应用程序现在知道用户确实是 X 先生。但是 API 仍然有任何线索!

    最后,我的问题很简单:如何通过 Web 应用程序通过 OpenId 向 API 验证 x 先生的身份,然后,Web 应用程序和 api 如何保留当前正在使用 Web 应用程序的 X 先生的信息当然还有 API。

    非常感谢您的帮助 !

    - 编辑格式

    最佳答案

    您真的不想使用 OpenID 登录 API。正如您所说,OpenID 用于身份验证,即谁,而 OAuth 用于授权,即我是否允许?但是您的结构表明您将使用 API 作为后端,使用 Web 应用程序作为前端。

    最好的方法是在 Web 应用程序上使用 OpenID 对用户进行身份验证,然后 Web 应用程序连接到 API 并存储 OpenID 凭据。然后网络应用程序知道用户是谁,并且可以提供服务。该 API 与用户无关,只是存储其数据。

    OpenID 和 OAuth 之间的根本区别在于它的使用。在你的情况下,你可能有这样的事情:

    --------          ---------            -------
    | User | <------> |  App  | <--------> | API |
    --------  OpenID  ---------   (OAuth)  -------
    

    用户从不直接与 API 交互:谁会想要手动发送 HTTP 请求? (lol) 相反,该服务是通过应用程序提供的,可以选择使用 OAuth 进行授权。但是,在单个应用程序访问 API 的情况下,您可以将应用程序 <=> API 连接设置为内部并且永远不要公开它。

    关于api - 如何验证用户从 Web 应用程序到 API 的身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475002/

    相关文章:

    Android Graphs——这些人是怎么做到的?

    go - 如何处理基于时间的一次性密码的 26 字节 secret ?

    ruby - Sinatra 的 API 身份验证

    python - CSV 中的 URL 未传递给函数

    authentication - JitBit 帮助台 API

    java - 用于 Java RESTful Web 服务应用程序的 Angular 5 客户端(在 Netbeans IDE 中)

    angularjs - 请求的资源不支持 http 方法 'OPTIONS' .?

    java.lang.NoClassDefFoundError : com/twilio/sdk/TwilioRestClient

    django - 我的基于 Web 的应用程序应该成为我的 API 的使用者吗?

    mysql - php登录系统警告