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

分享一下最近的工作成果: EvaOAuth - 可能是目前最好的 PHP OAuth 库

  •  
  •   AlloVince · 2015-05-02 14:34:34 +08:00 · 3242 次点击
    这是一个创建于 3485 天前的主题,其中的信息可能已经有所发展或是发生改变。

    EvaOAuth是我很久之前的作品,也用在生产环境很久了,但是在线上调试及定位问题的时候,旧版的EvaOAuth以及现有的很多PHP库以及不能很好地解决问题,因此从实际出发,对EvaOAuth做了一次大的重构。

    目前EvaOAuth可以看做是一个统一接口设计的PHP OAuth Client库,兼容OAuth1.0与OAuth2.0规范,可以通过10多行代码集成到任意项目中。新版的特性有:

    • 标准接口,无论OAuth1.0或OAuth2.0,同一套代码实现不同工作流,并且获取一致的数据格式,包括用户信息和Token。
    • 充分测试,所有关键代码进行单元测试,同时通过CI保证多版本PHP下的可用性。
    • 容易调试,开启Debug模式后,Log中会记录OAuth流程中所有的URL、Request、Response,帮助定位问题。
    • 开箱即用,项目已经内置了主流的OAuth网址支持,如微博、QQ、Twitter、Facebook等。
    • 方便扩展,可以通过最少3行代码集成新的OAuth服务,工作流程提供事件机制。

    项目代码托管在 https://github.com/AlloVince/EvaOAuth ,欢迎Star及Fork贡献代码。

    中文文档: http://avnpc.com/pages/evaoauth

    第 1 条附言  ·  2015-05-02 15:59:05 +08:00
    8 条回复    2015-05-03 01:01:00 +08:00
    kn007
        1
    kn007  
       2015-05-02 14:35:30 +08:00
    沙发,主楼的github地址貌似多了个奇怪字符
    kn007
        2
    kn007  
       2015-05-02 14:35:59 +08:00
    已星标
    AlloVince
        3
    AlloVince  
    OP
       2015-05-02 14:37:15 +08:00
    貌似已经无法编辑了,稍后append。

    github地址是 https://github.com/AlloVince/EvaOAuth
    kn007
        4
    kn007  
       2015-05-02 14:38:05 +08:00
    嗯嗯,其实挺想说一句:PHP 是最好的语言
    yangmls
        5
    yangmls  
       2015-05-02 21:58:49 +08:00
    AlloVince
        6
    AlloVince  
    OP
       2015-05-02 23:55:34 +08:00
    @yangmls thephpleague的两个库我有考察过,由于两个库的工作流略有不同,如果想要集成,还需要自己写一个上层来统一,这个EvaOAuth已经做掉了。

    另外在生产环境中,如果不支持完整的Log记录几乎是无法排查故障的,这一点上我目前还没有看到其他PHP OAuth库考虑进去,其实也是我自己造轮子的初衷。

    其他不足的地方可以提出来,我还会不断完善
    yangmls
        7
    yangmls  
       2015-05-03 00:18:34 +08:00   ❤️ 1
    @AlloVince 粗略看了一下,不足之处还是挺多的,比如 RefreshToken 好像不支持,没有看到相关的实现代码,比如 Client 里面定义了 password 验证 Eva\EvaOAuth\OAuth2\GrantStrategy\Password,但是并没有这个类。。。这个 unit test 是咋通过的?

    log 这个,因为 OAuth 是标准,各个 OAuth 库只要作好 Exception,然后我们在外层 catch 就可以了,植入代码里面的 log 并没有必要。

    把 OAuth1 和 OAuth2 分开也挺正常,毕竟连不同网站的 OAuth2 实现都有略微不同的地方,我给网站加第三方登录的时候,比较喜欢给每个网站一人一个action,然后在里面调用具体的类,以应付不同网站不太一样的地方,比如有些有refresh token,有些没有,有些fetch user info的流程不一样,有些字段不一样。
    AlloVince
        8
    AlloVince  
    OP
       2015-05-03 01:01:00 +08:00
    @yangmls 偷懒被发现了(・∀・),确实目前OAuth2的Grant暂时只实现了Authorization Code方式,OAuth1的加密也没有实现RSA-SHA1,这些在实际项目中很少用到的部分会在后续版本补进来。

    Refresh Token部分我比较犹豫要不要作为基础功能,因为某些知名服务压根不提供refresh token。

    Log部分我的初衷是想记录完整的Request和Response,比如thephpleague中,Exception仅保存了Response,这对于定位问题来说是不太够的。

    https://github.com/thephpleague/oauth2-client/blob/master/src/Exception/IDPException.php

    OAuth1.0和2.0,在我的项目中一般都会将两个版本的第三方用户信息都存在一个数据表,所以整合流程是必要的,如果数据表设计是分开的那么流程分开也OK,不过感觉分开做的工作量更大。

    谢谢意见
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:11 · PVG 04:11 · LAX 12:11 · JFK 15:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.