kielabokkie/oauth-proxy

单页应用(SPA)的OAuth代理

安装: 16

依赖项: 0

建议者: 0

安全: 0

星标: 5

关注者: 2

分支: 0

开放问题: 0

类型:项目

0.1.2 2016-11-20 12:05 UTC

This package is auto-updated.

Last update: 2024-09-10 14:20:31 UTC


README

使用 Lumen 构建的单页应用(SPA)OAuth代理。

简介

我们都知道,在SPAs中保护秘密很困难,尤其是在OAuth方面。OAuth 2.0规范规定,你永远不应该泄露你的客户端ID或密钥,以及你的访问令牌和刷新令牌。如果你必须使用OAuth,你将需要某种形式的权衡,因为你不能将所有这些都保密。有很多不同的技术,每种都有自己的优缺点。

OAuth Proxy位于你的SPA和你的API之间,并提供两个端点,这些端点将OAuth请求转发到你的API,并自动添加所需的客户端ID和客户端密钥。除此之外,它还可以使用refresh_token授权处理访问令牌的刷新。因为所有这些都在服务器端发生,所以你将大部分秘密保留给自己。唯一的权衡是客户端需要访问令牌。如果你使用短期有效的访问令牌并且始终使用SSL(我希望你这么做!)那么风险就会最小化。

先决条件

由于本项目是用 Lumen 构建的,因此需要PHP版本为 5.6.4 或更高版本。如果你以前没有使用过Lumen或Laravel,我建议你首先查阅文档。

目前,它还依赖于 Redis,因为它使得以过期时间存储键值对变得快速且简单,但我打算添加其他提供者。

安装

您可以通过在终端中运行 composer create-project 命令来安装OAuth Proxy。

composer create-project --prefer-dist kielabokkie/oauth-proxy

配置

OAuth Proxy提供两个端点。第一个端点是使用 password 授权获取访问令牌的 /oauth/token。第二个端点是允许您刷新访问令牌的 /oauth/token/refresh。如果您更喜欢为代理使用不同的端点(可能为了匹配您的API风格),您可以在 .env 文件中覆盖端点,关于这一点稍后会有更多介绍。

环境文件

如果您熟悉Lumen(或Laravel),您将知道 .env 文件包含各种配置设置。在您尝试使用代理之前,您需要输入一些参数。

以下是示例 .env 文件

APP_ENV=local
APP_DEBUG=true
APP_KEY=tdXF17HfY1yWpPtIV4DGxrivKEpN4yDh

ROUTE_ACCESS_TOKEN='/oauth/token'
ROUTE_REFRESH_TOKEN='/oauth/token/refresh'

API_URL='http://api.myapp.dev'
API_ACCESS_TOKEN_ENDPOINT='/v1/oauth/token'
API_REFRESH_TOKEN_ENDPOINT='/v1/oauth/token'

OAUTH_CLIENT_ID=my-spa-client
OAUTH_CLIENT_SECRET=s3cr3tk3y
OAUTH_REFRESH_TOKEN_TTL=2592000 # 30 days

CORS_ALLOW_ORIGIN='*'
CORS_ALLOW_METHODS='OPTIONS, GET, POST, PUT, PATCH, DELETE'
CORS_ALLOW_HEADERS='Authorization, Content-Type'

REDIS_URI='tcp://127.0.0.1:6379'

前三个参数是标准的Lumen参数,您需要根据您的环境进行更改(例如,在生产环境中不要将 APP_DEBUG 设置为 true)。可以通过运行 php artisan key:generate 命令来自动设置 APP_KEY

ROUTE_ACCESS_TOKENROUTE_REFRESH_TOKEN 用于自定义代理的端点(如前所述)。

接下来的一组参数都与您的实际API有关,API_URL 是您API的完整URL。《API_ACCESS_TOKEN_ENDPOINT》和《API_REFRESH_TOKEN_ENDPOINT》允许您指定用于获取访问令牌和刷新访问令牌的API上的端点。

接下来是OAuth相关参数。在这里,您指定客户端ID和客户端密钥以及刷新令牌的TTL。对于最后一个参数,您必须确保它与您在OAuth服务器上设置的刷新令牌的TTL相匹配。这些必须相同,因为TTL用于在它们过期后自动从数据存储中删除它们。

接下来有三个参数都是用于处理CORS头部的。

最后,我们还有可选的 REDIS_URI 变量。如果您没有将此变量添加到您的 .env 文件中,应用程序将使用以下 URI 进行 Redis 连接 tcp://127.0.0.1:6379REDIS_URI 变量允许您自定义 URI,以便您可以使用自定义 IP 地址或端口号。

Web服务器配置

由于此代理与您的 API 和前端是分开的,您需要设置您的 Web 服务器以提供此应用程序。您可以选择设置一个子域名(例如 proxy.myapp.com),或者让您的 Web 服务器根据端点的 URI 切换到您的代理。

用法

现在您已经设置好了一切,您的代理已准备好使用!

密码授权

/oauth/token 端点需要一个带有 usernamepassword 参数的 POST 请求。下面是一个示例 CURL 命令,它将用户名和密码作为 x-www-form-urlencoded 数据发送(根据 OAuth 2.0 规范)

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'username=wouter@myapp.com&password=password' "http://proxy.myapp.com/oauth/token"

如果您更喜欢发送 JSON 编码的数据,您也可以这样做

curl -X POST -H "Content-Type: application/json" -d '{"username": "wouter@myapp.com", "password": "password"}' "http://proxy.myapp.com/oauth/token"

刷新令牌授权

/oauth/token/refresh 端点需要一个包含带有有效令牌的 Authorization 标头的 GET 请求(例如,已过期的访问令牌)。下面是一个此类请求的示例

curl -X GET -H "Authorization: Bearer F9kqePKN424Ci3hRDqk5vzsGjP3qnXrnqGUxxiE9" "http://proxy.myapp.com/oauth/token/refresh"

就是这样,享受代理的乐趣吧!