V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mune
V2EX  ›  PHP

新来的技术总监计划将之前的 mvc 架构做成 restful api ,小弟不才,然后我发现我登录都不会写了,

  •  
  •   mune · 2017-10-18 22:08:03 +08:00 · 10318 次点击
    这是一个创建于 2593 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教大家一个完全的登录的 restful api 大概是怎样的,www.aaa.com/v1/username/lisi/pwd/123456 类似这样吗,看了网上的 restful 解释都是一个参数的,俩参数我就懵逼了,特此求教大家,
    第 1 条附言  ·  2017-10-19 20:05:26 +08:00
    谢谢大家答疑解惑,祝福大家工作愉快!
    59 条回复    2017-10-20 11:35:16 +08:00
    kindjeff
        1
    kindjeff  
       2017-10-18 22:14:18 +08:00
    登陆要啥 restful
    matsuijurina
        2
    matsuijurina  
       2017-10-18 22:14:59 +08:00 via iPad
    并不是替换的关系,还是 mvc,只是 v 这一层只需要输出 json 了。restful api 具体怎么写参考新浪微博的 api 文档,那个很全面。
    mune
        3
    mune  
    OP
       2017-10-18 22:16:30 +08:00
    @kindjeff 我不大懂,也不知道需要不需要,(苦笑),
    qiukun
        4
    qiukun  
       2017-10-18 22:37:08 +08:00
    对 session 资源的 new create delete
    leeg810312
        5
    leeg810312  
       2017-10-18 22:42:53 +08:00   ❤️ 1
    按 restful 风格,登录是创建 session,所以是 post /session,提交数据 username 和 password,返回 Token,注册是创建 user,所以是 post /user
    mune
        6
    mune  
    OP
       2017-10-18 22:46:31 +08:00
    @leeg810312 您能示范一下 登陆的 url 大概是怎样的吗,
    timothyye
        7
    timothyye  
       2017-10-18 22:49:01 +08:00 via Android
    建议登录最好是 post,不要用 get,并且最好不要把用户名和密码放在 url 里面
    yxzhm
        8
    yxzhm  
       2017-10-18 22:50:53 +08:00
    @mune 用户名和密码不会出现在浏览器 URL 里,可以是前端框架去调用后面的一个 URL.可以参考下面这个源代码中的 Login 方法
    https://github.com/CG542/WebDP/blob/master/dist/js/app.js
    newghost
        9
    newghost  
       2017-10-18 23:30:32 +08:00
    www.aaa.com/api/user/login/lisi/123456

    服务器 /api/user/login/:username/:password
    zapper
        10
    zapper  
       2017-10-18 23:37:53 +08:00
    类似于 oauth 那样吧,post 用户名密码得到 token,以 token 作为登录凭证
    seeker
        11
    seeker  
       2017-10-18 23:49:24 +08:00   ❤️ 4
    恕我直言,这只是形式上的 restful
    不是吧 username=xxx&pwd=yyy 改成 username/xxx/pwd/yyy 就是 restful 的
    k9982874
        12
    k9982874  
       2017-10-19 00:04:24 +08:00
    先抽象出登录时使用的资源:session
    然后按照 restful 语义对 session 进行操作
    登录 POST /api/user/session
    登出 DELETE /api/user/session
    刷新 session PUT /api/user/session
    hheedat
        13
    hheedat  
       2017-10-19 00:08:59 +08:00
    @seeker restful 的内涵思想是啥?
    hicair
        14
    hicair  
       2017-10-19 00:20:39 +08:00   ❤️ 2
    登录密码直接写 url 里大丈夫??
    mlyy
        15
    mlyy  
       2017-10-19 02:13:22 +08:00
    @hicair 如果使用了 https,为什么不行?
    Sapp
        16
    Sapp  
       2017-10-19 02:21:03 +08:00 via Android
    我至今都不是很明白 restful 除了换个请求方式,改一下链接形式以外和正常有啥区别,不都一样开发吗?
    huntzhan
        17
    huntzhan  
       2017-10-19 03:33:10 +08:00
    登录态基本不能用 REST 的思想来做。一般来说,REST 的 API 应该存在于完成 Authentication、拿到 token 之后(不考虑 read-only、非敏感部分的的 API )。
    precisi0nux
        18
    precisi0nux  
       2017-10-19 04:04:19 +08:00 via iPhone
    @mlyy https 不能加密 URL 吧……
    biggun
        19
    biggun  
       2017-10-19 04:52:30 +08:00
    登录过程不适合用 restful,或者说和 restful 是两种不同的概念,restful (具象状态传输)是制定针对系统资源进行操作方法的一种风格。 @huntzhan 说的对啊,就是用登录过程获取一个 session (产生个 jwt 之类的东西),然后在此基础上利用 restful 风格的 api 对系统资源进行操作.
    dangyuluo
        20
    dangyuluo  
       2017-10-19 04:53:37 +08:00
    不适合 Restful 的地方不要强上啊。。
    dangyuluo
        21
    dangyuluo  
       2017-10-19 04:54:07 +08:00
    @precisi0nux https 当然可以加密 url,只是现代浏览器都会发送一个明文的 hosts
    cljnnn
        22
    cljnnn  
       2017-10-19 05:33:07 +08:00 via Android   ❤️ 1
    @precisi0nux 能加密,但是在 Nginx 日志中,这个 URL 是明文的,所以传密码还是用 post 吧。
    lightening
        23
    lightening  
       2017-10-19 05:38:59 +08:00
    @hheedat RESTful 的内涵思想是把所有操作抽象成对于一种对象( resource )的增删查改。

    如登录、登出就是对于虚拟资源 session 的增加 /删除。
    创建、删除用户是对于实体资源 user 的增加 /删除。

    目前见到讲的最好的是 Rails 作者 DHH 的演讲:
    lightening
        24
    lightening  
       2017-10-19 05:39:37 +08:00
    @mlyy 因为站在你后面的人会在地址栏看到你的密码?
    darklowly
        25
    darklowly  
       2017-10-19 05:47:01 +08:00
    print1024
        26
    print1024  
       2017-10-19 07:33:04 +08:00   ❤️ 1
    现在很多人在用 Facebook 的 GraphQL 来写 API,完善了很多 Restful 中的问题,你可以参考下[GraphQL 中文网]( http://graphql.cn/)
    Phariel
        27
    Phariel  
       2017-10-19 07:53:46 +08:00 via Android
    oauth 2.0
    laogui
        28
    laogui  
       2017-10-19 08:10:18 +08:00 via Android
    都 restful 了就不要用 session 了,用 OAuth2.0 或者 jwt 做认证吧。
    nl101531
        29
    nl101531  
       2017-10-19 08:25:12 +08:00 via Android
    这密码都放到链接中啊,肯定不行,就 post 请求 login,密码放到 body 中。
    justfindu
        30
    justfindu  
       2017-10-19 08:36:55 +08:00
    restful 也就是给你一个语义规范 该 post 就 post 该 get 就 get 用户认证#28 楼 其他就是 V 层不返回模板返回数据就可以了. 除了用户认证需要修改 其他都无需动吧 如果是比较标准的 mvc 的情况
    zjsxwc
        31
    zjsxwc  
       2017-10-19 08:45:24 +08:00
    MVC 里的 V 从 html 变成 json, 没有本质变化
    原来的 session 变成 token, 其实仍旧没有本质变化
    googlebot
        32
    googlebot  
       2017-10-19 08:48:25 +08:00 via iPad
    rest 是扩展 http,http 只有 get,post,rest 实现 delete,update,
    rest 的好处,uri 很少更改,数据和界面更加分离,
    yulitian888
        33
    yulitian888  
       2017-10-19 08:55:45 +08:00
    restful 适合做无状态的业务,登录真不合适
    就这个例子而言,且不论 Post 和 Get 的区别,仅仅只是把 API 地址暴露给公网用户就已经属于非常危险的行为了。
    一个黑客只需要知道登录的地址,经过简单的猜测(连猜都不需要吧?)就可以知道 Session 的增删改查(其他资源同理),这么做好吗?
    TimRChen
        34
    TimRChen  
       2017-10-19 09:16:16 +08:00
    试试 JWT?
    wizardoz
        35
    wizardoz  
       2017-10-19 09:37:24 +08:00
    @googlebot HTTP 一直都有 GET POST PUT PATCH DELETE OPTION 等等功能码,但是以前的开发模式通常都只用 GET 和 POST。这其实算是一种滥用,用 GET 来实现 DELETE 功能码该做的事,感觉有点说不过去。REST 只是建议充分使用 HTTP 功能码的定义上的功能,GET 获取、POST 新增、PUT 和 PATCH 修改、DELETE 删除、OPTION 看资源支持哪些操作。
    Kilerd
        36
    Kilerd  
       2017-10-19 09:52:37 +08:00
    楼上那些说把用户名密码放在 URL 里面,而不是 post data 里面的,真的有用过 restful 来写过登陆功能吗?
    xrlin
        37
    xrlin  
       2017-10-19 10:37:52 +08:00 via iPhone
    @Kilerd 估计他们将 https 的作用范围理解错了
    TuringGunner
        38
    TuringGunner  
       2017-10-19 10:42:54 +08:00   ❤️ 1
    POST /api/session 这样写登录,然后把用户名密码放在 body 里

    实际上就是创建一个 session 资源,返回一个 token 给客户端当作登录凭证
    duan602728596
        39
    duan602728596  
       2017-10-19 10:50:45 +08:00 via iPhone
    最后坑的还是前端,哎......
    blacklee
        40
    blacklee  
       2017-10-19 11:07:16 +08:00
    1. MVC 和 RESTFul 两者是风马牛不相及的东西,不要混为一谈:
    - 1.1 MVC 是代码构架上的一种设计模式,用户是看不到这东西的
    - 1.2 RESTFul 是一种对资源的抽象,对用户而言最明显的就是 URL 风格的改变
    2. 不管你是用什么七七八八的鬼框架鬼模式,只要涉及到敏感数据的传输,都应该是用 POST 把敏感数据放在 request body 里
    Kilerd
        42
    Kilerd  
       2017-10-19 11:25:36 +08:00   ❤️ 1
    @mikulch 静态博客 URL 地址是文章标题的拼音。 你是我碰到的第一个。
    skadi
        43
    skadi  
       2017-10-19 11:29:22 +08:00
    ls+1
    prasanta
        44
    prasanta  
       2017-10-19 11:29:30 +08:00 via iPhone
    post /auth/token/
    post /auth/session/
    post /auth/oauth/

    哪里行么?
    solee
        45
    solee  
       2017-10-19 11:30:59 +08:00
    restful 就是一种 api 设计的理念,不过如何使用还是要结合你自己的业务。没有完美的标准,只有最适合的标准。

    http://mp.weixin.qq.com/s/AhiyMnJ70TkOMnmkXG1Lsw 这篇文章讲得很有道理

    我们的 api 设计也一直都是这么做的
    smgui
        46
    smgui  
       2017-10-19 11:58:59 +08:00
    @k9982874 赞同
    smgui
        47
    smgui  
       2017-10-19 11:59:48 +08:00
    @blacklee 是啊,问题问的就很奇怪
    siteshen
        48
    siteshen  
       2017-10-19 13:16:06 +08:00
    登录和其他不一样,不需要死搬硬套,给几个我一直在使用的 API 设计示例:
    {
    "meta:" {"success": true},
    "data": {},
    }

    登录 POST /auth/login {"username": "", "password": ""} -> {"token": ""}

    读取我的信息 GET /me/profile -> {"me": {}}
    读取用户信息 GET /users/1024/profile -> {"user": {}}

    关注用户 POST /users/1024/follow
    用户关注列表 GET /users/1024/following-user -> {"users": []}
    ren2881971
        49
    ren2881971  
       2017-10-19 13:43:34 +08:00
    LZ 想问的是 采用 restful 后 操作不了 session 咋控制登录访问权限吧。。
    mikulch
        50
    mikulch  
       2017-10-19 14:02:57 +08:00
    @Kilerd 用用 gitbook-editor 你就知道为什么了。
    yzmm
        51
    yzmm  
       2017-10-19 14:12:13 +08:00
    然后黑客只需要拿到日志就能拿到用户账号密码了。。。
    sheng9632
        52
    sheng9632  
       2017-10-19 14:29:07 +08:00
    restful 只是一种规范 和用来些什么没关系 至于做登录当然可以
    zysidea
        53
    zysidea  
       2017-10-19 14:37:29 +08:00
    别用 session 了,用 JWT 吧,用户登录的时候给用户返回一个 token,然后用户的每次请求头部都加上这个 token
    sobigfish
        54
    sobigfish  
       2017-10-19 15:21:35 +08:00
    没有文档就说改就改了,确定这技术总监不会搞坏你们现有的业务?-。-
    irrigator
        55
    irrigator  
       2017-10-19 15:32:11 +08:00
    关于 Rest 最好的教程,楼主拿走不谢。[教狗狗用 Rest ]( https://www.slideshare.net/landlessness/teach-a-dog-to-rest)
    Keyes
        56
    Keyes  
       2017-10-19 16:29:16 +08:00
    @irrigator 标题好坑。。。
    jtn007
        57
    jtn007  
       2017-10-19 16:44:49 +08:00
    rest 风格的 url 同样允许 api.service.com/user/1api.service.com/user?id=1 这样的冗余的,不要纠结,先好好理解 rest
    asiufasd
        58
    asiufasd  
       2017-10-20 08:23:27 +08:00 via iPhone
    其实我之前也遇到这个问题,查了好多资料,以及想了为什么要用 restful,restful 的好处就是以后可以更方便的分布和集群,所以需要无状态,如果还是用 session 管理的话,将来分布式之后 session 不方便管理。所以我觉得这里不应该用 session 来管理
    lwyj123
        59
    lwyj123  
       2017-10-20 11:35:16 +08:00
    我推荐楼主了解一下基于 token 的身份认证。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2686 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.