在榆树成语认证

问题描述 投票:2回答:1

我试图总结我的周围榆树头。我在哈斯克尔的经验,有点二郎神。

我想完成下面的练习:

  1. 用户显示一个登录表单
  2. 在提交,前端发出请求到localhost/auth尝试和接受的身份验证令牌。
  3. 如果成功,该网页显示,其获取的一些数据。
  4. 如果失败,则登录屏幕显示错误。

这是很基本的,但希望够复杂的Web应用程序真正的行为进行建模。

我的第一个问题是与Model。如果客户端进行身份验证,我只需要的数据。我应该以一种类似于Maybe单子包裹的东西呢?

type Model
    = NoAuth String String
    | AuthFetching
    | AuthFailed err
    | AuthSuccess String

然后登录屏幕可以显示微调和错误,或重定向到一个新的一页。

这感觉就像它关系的应用程序状态的其余部分的认证状态。虽然是“正确的”,感觉错把整个模型是只有一个记录一个(变量类型?)。

“感觉”更正确的有模型,如下所示:

type FetchStatus
    = Loading
    | Success val
    | Err err

type Model =
    { token : RequestStatus String
    , data  : List number
    }

但每当你更新模型,现在需要检查是否token仍然存在 - 在记录中,即模式匹配。在第一个例子,你只需要模式匹配的整体模式,这是一个有点简单。

并责成登录表单状态,我需要添加额外的字段:

type Model =
    { token : RequestStatus String
    , data  : List number
    , username : String
    , password : String
    }

这感觉不正确,因为password应该不会在内存中的登录后举行。我在记录持有这些,但我不能在自定义type申报记录。

总而言之,我有点糊涂了。可有人请一些线索最“正确”的,惯用的方式做到这一点?

authentication elm idiomatic
1个回答
3
投票

所有授权相关的东西应该在后端侧进行处理。榆木的工作只是要显示的内容服务器发送给它的。在我看来,你提出的第一个选项是最好的这样一个小例子,但在更多的实际生活中的应用类型系统会更复杂:

type LoginForm =
  { username : String
  , password : String
  }

type Activity
  = Login LoginForm
  | LoginSuccess
  | LoginFailure String  

type Model =
  { loggedUser : Maybe String
  , activity : Activity
  , ...
  }

你不需要(也不应该)保持密码的前端。你也应该不会在客户端进行任何授权,因为客户端可以很容易地在他的浏览器更换任何脚本。后端将跟踪用户是否被如登录。会话cookie。在即使loggedUser值设置为Just "someguy"和“someguy”这种情况下没有被标记为记录在服务器的数据库,需要授权不得违反任何行动。

总之,处理登录,并给予权限访问任何内容对后端的工作。榆树是前端的语言,所以它的唯一目的是在这里显示的东西。

© www.soinside.com 2019 - 2024. All rights reserved.