Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart渡槽服务器基本授权_Dart_Authorization_Aqueduct - Fatal编程技术网

Dart渡槽服务器基本授权

Dart渡槽服务器基本授权,dart,authorization,aqueduct,Dart,Authorization,Aqueduct,我正在学习如何使用渡槽框架进行身份验证 在我的channel.dart文件中,我有一条路径: router .route('/protected') .link(() => Authorizer.basic(validator)) .link(() => ProtectedController()); 但是我不知道如何创建验证程序。在中,我可以在不使用AuthServer的情况下创建自定义授权程序。代码示例如下所示: class BasicValidator imp

我正在学习如何使用渡槽框架进行身份验证

在我的channel.dart文件中,我有一条路径:

router
  .route('/protected') 
  .link(() => Authorizer.basic(validator))
  .link(() => ProtectedController()); 
但是我不知道如何创建
验证程序。在中,我可以在不使用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;
  }
}
类BasicValidator实现AuthValidator{
@凌驾
未来或验证(AuthorizationParser解析器,T authorizationData,{List requiredScope}){
var user=await userForName(usernameAndPassword.username);
if(user.password==hash(usernameAndPassword.password,user.salt)){
返回授权(…);
}
返回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;
  }
}
类BasicValidator实现AuthValidator{
@凌驾
未来或验证(AuthorizationParser解析器,T authorizationData,{List requiredScope}){
最终有效性名称='bob';
最终有效密码='password123';
//如何获取解析后的用户名?
//如何获取解析后的密码?
if(parsedUsername==validUsername&&parsedPassword==validPassword){
//如何创建授权?
返回授权(…);
}
返回null;
}
//这是什么?
@凌驾
List documentRequirementsForAuthorizer(APIDocumentContext上下文,授权者授权者,{List scopes}){
返回null;
}
}

有人能给我看一下基本授权验证器的基本工作示例吗?

authorizationData
是使用
Authorizer.basic
时的
authorizationcredentials
的一个实例。此类型的对象具有通过解析请求中的“授权”头而派生的
username
password
字段

授权
对象是与授权资源所有者(如其用户ID)相关的数据的容器。后续控制器使用它来控制授权,而无需再次查找授权用户;您应该使用可用的任何授权信息填充它

documentRequirementsForAuthorizer
在OpenAPI文档生成过程中使用。使用验证器的
授权者
将返回的安全要求编码到被保护的OpenAPI操作中

另见

@覆盖
未来或验证(AuthorizationParser解析器,T authorizationData,{List requiredScope}){
最终有效性名称='bob';
最终有效密码='password123';
最终凭证=作为AuthBasicCredentials的授权数据;
如果(credentials.username==validUsername
&&credentials.password==有效密码){
退货授权(
null,//没有基本身份验证的客户端ID
等待getUserIDFromUsername(validUsername),//这是您要解决的问题
这个,//总是这个
凭据:凭据//如果要传递此信息
);
}
返回null;
}

如果我还没有使用OpenAPI文档,
null
是否是
documentRequirementsForAuthorizer
最安全的默认返回值?此外,文档示例显示了一个
hash()
函数。这是在某个库中还是我需要自己实现它?关于我的第二个问题,我看到有一个
AuthUtility.generatePasswordHash()
函数。
@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;
  }