mune
V2EX  ›  PHP

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

  •  
  •   mune · Oct 18, 2017 · 11655 views
    This topic created in 3315 days ago, the information mentioned may be changed or developed.
    请教大家一个完全的登录的 restful api 大概是怎样的,www.aaa.com/v1/username/lisi/pwd/123456 类似这样吗,看了网上的 restful 解释都是一个参数的,俩参数我就懵逼了,特此求教大家,
    Supplement 1  ·  Oct 19, 2017
    谢谢大家答疑解惑,祝福大家工作愉快!
    59 replies  •  2017-10-20 11:35:16 +08:00
    kindjeff
    kindjeff
    Oct 18, 2017
    1
    登陆要啥 restful
    matsuijurina
    matsuijurina
    Oct 18, 2017 via iPad
    2
    并不是替换的关系,还是 mvc,只是 v 这一层只需要输出 json 了。restful api 具体怎么写参考新浪微博的 api 文档,那个很全面。
    mune
    mune
    OP
    Oct 18, 2017
    3
    @kindjeff 我不大懂,也不知道需要不需要,(苦笑),
    qiukun
    qiukun
    Oct 18, 2017
    4
    对 session 资源的 new create delete
    leeg810312
    leeg810312
    Oct 18, 2017❤️1
    5
    按 restful 风格,登录是创建 session,所以是 post /session,提交数据 username 和 password,返回 Token,注册是创建 user,所以是 post /user
    mune
    mune
    OP
    Oct 18, 2017
    6
    @leeg810312 您能示范一下 登陆的 url 大概是怎样的吗,
    timothyye
    timothyye
    Oct 18, 2017 via Android
    7
    建议登录最好是 post,不要用 get,并且最好不要把用户名和密码放在 url 里面
    yxzhm
    yxzhm
    Oct 18, 2017
    8
    @mune 用户名和密码不会出现在浏览器 URL 里,可以是前端框架去调用后面的一个 URL.可以参考下面这个源代码中的 Login 方法
    https://github.com/CG542/WebDP/blob/master/dist/js/app.js
    newghost
    newghost
    Oct 18, 2017
    9
    www.aaa.com/api/user/login/lisi/123456

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

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

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

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

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

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

    我们的 api 设计也一直都是这么做的
    smgui
    smgui
    Oct 19, 2017
    46
    @k9982874 赞同
    smgui
    smgui
    Oct 19, 2017
    47
    @blacklee 是啊,问题问的就很奇怪
    siteshen
    siteshen
    Oct 19, 2017
    48
    登录和其他不一样,不需要死搬硬套,给几个我一直在使用的 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
    ren2881971
    Oct 19, 2017
    49
    LZ 想问的是 采用 restful 后 操作不了 session 咋控制登录访问权限吧。。
    mikulch
    mikulch
    Oct 19, 2017
    50
    @Kilerd 用用 gitbook-editor 你就知道为什么了。
    yzmm
    yzmm
    Oct 19, 2017
    51
    然后黑客只需要拿到日志就能拿到用户账号密码了。。。
    sheng9632
    sheng9632
    Oct 19, 2017
    52
    restful 只是一种规范 和用来些什么没关系 至于做登录当然可以
    zysidea
    zysidea
    Oct 19, 2017
    53
    别用 session 了,用 JWT 吧,用户登录的时候给用户返回一个 token,然后用户的每次请求头部都加上这个 token
    run2
    run2
    Oct 19, 2017
    54
    没有文档就说改就改了,确定这技术总监不会搞坏你们现有的业务?-。-
    irrigator
    irrigator
    Oct 19, 2017
    55
    关于 Rest 最好的教程,楼主拿走不谢。[教狗狗用 Rest ]( https://www.slideshare.net/landlessness/teach-a-dog-to-rest)
    Keyes
    Keyes
    Oct 19, 2017
    56
    @irrigator 标题好坑。。。
    jtn007
    jtn007
    Oct 19, 2017
    57
    rest 风格的 url 同样允许 api.service.com/user/1 和 api.service.com/user?id=1 这样的冗余的,不要纠结,先好好理解 rest
    asiufasd
    asiufasd
    Oct 20, 2017 via iPhone
    58
    其实我之前也遇到这个问题,查了好多资料,以及想了为什么要用 restful,restful 的好处就是以后可以更方便的分布和集群,所以需要无状态,如果还是用 session 管理的话,将来分布式之后 session 不方便管理。所以我觉得这里不应该用 session 来管理
    lwyj123
    lwyj123
    Oct 20, 2017
    59
    我推荐楼主了解一下基于 token 的身份认证。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2085 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 110ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    ♥ Do have faith in what you're doing.