【问题标题】:Dart Aqueduct server basic authorizationDart Aqueduct 服务器基本授权
【发布时间】:2019-04-25 19:48:03
【问题描述】:

我正在学习如何使用 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;
  }
}

谁能给我看一个基本授权验证器的基本工作示例?

【问题讨论】:

    标签: dart authorization aqueduct


    【解决方案1】:

    authorizationData 在使用 Authorizer.basic 时是 AuthBasicCredentials 的一个实例。这种类型的对象具有usernamepassword 字段,这些字段源自从请求中解析“授权”标头。

    Authorizationobject 是与授权资源所有者(例如他们的用户 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;
      }
    

    【讨论】:

    • 如果我还没有使用 OpenAPI 文档,nulldocumentRequirementsForAuthorizer 最安全的默认返回值吗?
    • 此外,文档示例显示了一个 hash() 函数。这是在某个库中还是我需要自己实现?
    • 关于我的第二个问题,我看到有一个AuthUtility.generatePasswordHash() 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多