Dart Aqueduct 服务器基本授权
Dart Aqueduct server basic authorization
我正在了解如何使用 Aqueduct 框架进行身份验证。
在我的 channel.dart 文件中我有一条路线:
router
.route('/protected')
.link(() => Authorizer.basic(validator))
.link(() => ProtectedController());
但我不知道如何创建validator
。在 docs 中,我看到我可以在不使用 AuthServer 的情况下创建自定义授权方。代码示例是这样的:
class BasicValidator implements AuthValidator {
@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {}
var user = await userForName(usernameAndPassword.username);
if (user.password == hash(usernameAndPassword.password, user.salt)) {
return Authorization(...);
}
return null;
}
}
我想做一个基本的工作示例,但这是我能得到的最接近的示例:
class BasicValidator implements AuthValidator {
@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {
final validUsername = 'bob';
final validPassword = 'password123';
// How do I get the parsed username?
// How do I get the parsed password?
if (parsedUsername == validUsername && parsedPassword == validPassword) {
// How do I create an Authorization?
return Authorization(...);
}
return null;
}
// What is this?
@override
List<APISecurityRequirement> documentRequirementsForAuthorizer(APIDocumentContext context, Authorizer authorizer, {List<AuthScope> scopes}) {
return null;
}
}
谁能告诉我基本授权验证器的基本工作示例?
当使用 Authorizer.basic
时,authorizationData
是 AuthBasicCredentials
的实例。此类型的 object 具有 username
和 password
字段,这些字段源自解析请求中的 'Authorization' header。
Authorization
object 是与授权资源所有者相关的数据(例如他们的用户 ID)的容器。后续控制器使用它来控制授权,而无需再次查找授权用户;您应该使用可用的任何授权信息填充它。
documentRequirementsForAuthorizer
在 OpenAPI 文档生成期间使用。使用您的验证器的 Authorizer
会将返回的安全要求编码到受保护的 OpenAPI 操作中。
另见 http://aqueduct.io/docs/auth/authorizer/#using-authorizers-without-authserver。
@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {
final validUsername = 'bob';
final validPassword = 'password123';
final credentials = authorizationData as AuthBasicCredentials;
if (credentials.username == validUsername
&& credentials.password == validPassword) {
return Authorization(
null, // no client ID for basic auth
await getUserIDFromUsername(validUsername), // This is your problem to solve
this, // always this
credentials: credentials // if you want to pass this info along
);
}
return null;
}
我正在了解如何使用 Aqueduct 框架进行身份验证。
在我的 channel.dart 文件中我有一条路线:
router
.route('/protected')
.link(() => Authorizer.basic(validator))
.link(() => ProtectedController());
但我不知道如何创建validator
。在 docs 中,我看到我可以在不使用 AuthServer 的情况下创建自定义授权方。代码示例是这样的:
class BasicValidator implements AuthValidator {
@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {}
var user = await userForName(usernameAndPassword.username);
if (user.password == hash(usernameAndPassword.password, user.salt)) {
return Authorization(...);
}
return null;
}
}
我想做一个基本的工作示例,但这是我能得到的最接近的示例:
class BasicValidator implements AuthValidator {
@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {
final validUsername = 'bob';
final validPassword = 'password123';
// How do I get the parsed username?
// How do I get the parsed password?
if (parsedUsername == validUsername && parsedPassword == validPassword) {
// How do I create an Authorization?
return Authorization(...);
}
return null;
}
// What is this?
@override
List<APISecurityRequirement> documentRequirementsForAuthorizer(APIDocumentContext context, Authorizer authorizer, {List<AuthScope> scopes}) {
return null;
}
}
谁能告诉我基本授权验证器的基本工作示例?
Authorizer.basic
时,authorizationData
是 AuthBasicCredentials
的实例。此类型的 object 具有 username
和 password
字段,这些字段源自解析请求中的 'Authorization' header。
Authorization
object 是与授权资源所有者相关的数据(例如他们的用户 ID)的容器。后续控制器使用它来控制授权,而无需再次查找授权用户;您应该使用可用的任何授权信息填充它。
documentRequirementsForAuthorizer
在 OpenAPI 文档生成期间使用。使用您的验证器的 Authorizer
会将返回的安全要求编码到受保护的 OpenAPI 操作中。
另见 http://aqueduct.io/docs/auth/authorizer/#using-authorizers-without-authserver。
@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {
final validUsername = 'bob';
final validPassword = 'password123';
final credentials = authorizationData as AuthBasicCredentials;
if (credentials.username == validUsername
&& credentials.password == validPassword) {
return Authorization(
null, // no client ID for basic auth
await getUserIDFromUsername(validUsername), // This is your problem to solve
this, // always this
credentials: credentials // if you want to pass this info along
);
}
return null;
}