跨域API认证

Posted

技术标签:

【中文标题】跨域API认证【英文标题】:Cross Domain API authentication 【发布时间】:2017-01-14 09:13:55 【问题描述】:

我需要向公司的另一个分支机构公开 JSON 网络服务,他们将在公共网络应用程序中管理自己的用户表,而我的应用程序只有在我们办公室的 LAN 内有一组不同的用户时才能访问。到目前为止的计划是他们将使用 AJAX 请求使用 Web 服务,我应该返回 JSON,但我不知道如何在不暴露 html 源代码中的凭据的情况下进行身份验证。基本的工作流程是:

    用户 X 登录其他分支机构的 Web 应用(我无法控制此过程) 用户 X 点击按钮,其他分支机构的服务器向我的服务器发出请求 我的服务器获取数据并返回 JSON 其他服务器填充下拉菜单(或类似的东西)

我已经阅读了一些关于 API 的教程,但他们都谈到在 users 表中添加一个令牌字段,这不是我的情况。什么是安全的方法?即使它在我们的公司局域网内,我也不想在没有身份验证的情况下公开 Web 服务

【问题讨论】:

【参考方案1】:

听起来其他分支机构的网络应用程序是您网络应用程序的客户端。授权他们的 web 应用向你的 web 应用发出请求的最标准化和公认的方法是通过OAuth 集成这两个应用。

使用 OAuth 服务器,希望与您的服务集成的 Web 应用程序被称为“客户端”。每个客户端都发出client_idclient_secret。您可以遵循几个不同的流程,每个流程都有自己的先决条件和期望。我不会在这里重复它们,但this article 看起来它有一个很好的总结,可以很好地为您提供入门指南。

我会说我认为最容易实现的流程是密码授予,但需要您完全信任集成应用程序,因为它会知道您用户的登录凭据。从您对问题的描述来看,这似乎不是问题。

注意 - 链接的 DigitalOcean 文章将密码授予流程称为“密码凭证流程”

集成后,会请求授权令牌并将其保存在客户端应用程序中。如何请求和检索它取决于您遵循的授权流程。对您的 API 的每个请求都在 Authorization 标头中包含此“承载”令牌,然后在您的资源服务器上对其进行检查和验证。只有包含有效令牌的请求才会真正使用来自您的应用程序的数据。

我已经使用lucadegasperi/oauth2-server-laravel 包在 Laravel 中实现了一个 OAuth2 服务器,没有太多的头疼,但看起来自 Laravel 5.3 以来它已被弃用。你可以试试laravel/passport,我没有经验。

【讨论】:

以上是关于跨域API认证的主要内容,如果未能解决你的问题,请参考以下文章

PHP驱动的API如何认证真正的客户端(referer)跨域(知道标头可以被欺骗)?

以短链服务为例,探讨免AppKey免认证Ajax跨域调用新浪微博API

Office 365 OAuth2登录认证如何实现跨域请求?

跨域访问场景无法发送认证头

angularjs+webapi2 跨域Basic 认证授权

Flask+Vue Api认证