跳转至

管理OAuth 2.0客户端

aqueduct auth命令行工具创建OAuth 2.0客户端应用程序标识符,并将其插入到应用程序的数据库中。要使用这个工具,你必须使用ManagedAuthDelegate<T>,而且你的数据库必须包含支持它的表(更多细节请参见本指南)。

用用户名和密码交换授权令牌需要一个注册的客户端标识符。一个令牌同时属于认证用户和客户端应用程序。客户端由aqueduct/managed_auth中的ManagedAuthClient实例表示。当请求访问令牌时,认证客户端必须在授权头中提供他们的客户端ID(和客户端密码,如果适用的话)。

一个OAuth 2.0客户端必须有一个唯一标识客户端的字符串标识符。例如,"com.food_app.mobile "可能是一些 "Food App "的移动应用的客户端标识符。

要创建一个简单的OAuth 2.0客户端,可以运行下面的命令行工具。

aqueduct auth add-client \
  --id com.food_app.mobile \
  --connect postgres://user:password@dbhost:5432/food_app

connect选项标识应用程序的数据库,此工具将连接到该数据库,并将记录插入ManagedAuthClient数据库表中。标识符是通过id选项提供的。

以这种方式创建的OAuth 2.0客户端是公开的客户端;没有客户端密钥。使用资源所有者授予流但无法保护其客户端密钥的OAuth 2.0客户端应使用此类客户端。如果应用程序的源代码可见,则它无法保护其客户端密钥,就像任何JavaScript应用程序一样。建议本机移动应用程序也使用公共客户端,因为它们的源代码可能会被反汇编以显示客户端密钥,但这不是必需的。

向客户端身份验证的端点(受Authorizer.basic保护的端点)发出请求时,授权标头中将省略客户端密钥。 base64编码的字符串是clientID:,其中需要冒号(:)。例如,要在Dart中为公共客户端生成授权头:

var clientID = "com.foobar.xyz";
var clientCredentials = Base64Encoder().convert("$clientID:".codeUnits);
var header = "Basic $clientCredentials";

机密客户

如果一个OAuth 2.0客户端有一个客户端密钥,那么它就是机密的。客户端密钥可以用auth工具提供:

aqueduct auth add-client \
  --id com.food_app.mobile \
  --secret myspecialsecret \
  --connect postgres://user:password@dbhost:5432/food_app

在存储客户端密钥之前,会使用随机生成的盐对客户端密钥进行哈希处理(多次)。 因此,其实际值必须安全地存储在其他位置。 (例如,我们使用LastPass。)

重定向URI

为了允许授权代码流(由AuthCodeController提供),客户端必须有一个重定向URI。这是验证用户的浏览器在输入用户名和密码后会被重定向到的URI。客户端必须是一个保密客户端,才能有一个重定向URI。

aqueduct auth add-client \
  --id com.food_app.mobile \
  --secret myspecialsecret \
  --redirect-uri https://someapp.com/callback \
  --connect postgres://user:password@dbhost:5432/food_app

范围

如果应用程序使用OAuth 2.0范围,则客户端可以具有允许令牌访问的范围。 这允许范围受到与其进行身份验证的客户端的限制。

aqueduct auth add-client \
  --id com.food_app.mobile \
  --secret myspecialsecret \
  --allowed-scopes 'scopeA scopeB scopeC.readonly' \
  --connect postgres://user:password@dbhost:5432/food_app

范围是有空间限制的,必须用引号括起来,这样你的shell会把整个字符串当作一个值。

范围可以在客户端创建后用aqueduct auth set-scope设置。

aqueduct auth set-scope \
  --id com.food_app.mobile \
  --scopes 'scopeA scopeC' \
  --connect postgres://user:password@dbhost:5432/food_app

其他信息

如同所有向数据库发送命令的 aqueduct命令一样,connect选项可以用项目目录下的 "database.yaml "文件代替,其格式如下:

username: "user"
password: "password"
host: "host"
port: 5432
databaseName: "my_app"