管理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"