新来的技术总监计划将之前的 mvc 架构做成 restful api ,小弟不才,然后我发现我登录都不会写了, - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mune
V2EX    PHP

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

  •  
  •   mune 2017-10-18 22:08:03 +08:00 10902 次点击
    这是一个创建于 2990 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教大家一个完全的登录的 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 +0800 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 的作用范围理解错了
    TuringGooner
        38
    TuringGooner  
       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
    run2
        54
    run2  
       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     Solana     4586 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 03:57 PVG 11:57 LAX 19:57 JFK 22:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86