V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
mune
V2EX  ›  PHP

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

  •  
  •   mune · Oct 18, 2017 · 11144 views
    This topic created in 3125 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
        1
    kindjeff  
       Oct 18, 2017
    登陆要啥 restful
    matsuijurina
        2
    matsuijurina  
       Oct 18, 2017 via iPad
    并不是替换的关系,还是 mvc,只是 v 这一层只需要输出 json 了。restful api 具体怎么写参考新浪微博的 api 文档,那个很全面。
    mune
        3
    mune  
    OP
       Oct 18, 2017
    @kindjeff 我不大懂,也不知道需要不需要,(苦笑),
    qiukun
        4
    qiukun  
       Oct 18, 2017
    对 session 资源的 new create delete
    leeg810312
        5
    leeg810312  
       Oct 18, 2017   ❤️ 1
    按 restful 风格,登录是创建 session,所以是 post /session,提交数据 username 和 password,返回 Token,注册是创建 user,所以是 post /user
    mune
        6
    mune  
    OP
       Oct 18, 2017
    @leeg810312 您能示范一下 登陆的 url 大概是怎样的吗,
    timothyye
        7
    timothyye  
       Oct 18, 2017 via Android
    建议登录最好是 post,不要用 get,并且最好不要把用户名和密码放在 url 里面
    yxzhm
        8
    yxzhm  
       Oct 18, 2017
    @mune 用户名和密码不会出现在浏览器 URL 里,可以是前端框架去调用后面的一个 URL.可以参考下面这个源代码中的 Login 方法
    https://github.com/CG542/WebDP/blob/master/dist/js/app.js
    newghost
        9
    newghost  
       Oct 18, 2017
    www.aaa.com/api/user/login/lisi/123456

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

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

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

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

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

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

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