[PHP] 实现oauth下的单点登陆
整体流程是 ,参照腾讯企业邮的对外开放API , 传递client_id + client_secret就可以获取到access_token , 拿着access_token+ 用户的标识 , 去请求一个登陆地址 , 获取到登陆地址直接跳转过去就能登陆成功
1. 首先在管理后台 , 申请生成自己的client_id + client_secret
重置秘钥 , 停用秘钥都会使当前企业的旧秘钥和access_token失效
2. 通过自定义规则生成签名串
获取所有get传递的参数值 , 使用字典序排序 , 拼接在一起 ,拼接上自己的秘钥进行sha1加密 , 作为GET参数signature
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php //从企管后台获取到以下参数 $client_secret = "af0c7c2ac7b5687d6c4ed5e6a2a7e058780c1aac" ; $client_id = "appdev.sinanet.com" ; //生成签名 $_GET [ 'grant_type' ]= 'client_credentials' ; $_GET [ 'client_id' ]= $client_id ; $_GET [ 'ts' ]=time(); //秒数时间戳 $args = array_values ( $_GET ); sort( $args , SORT_STRING); $args = implode( $args ); $sign = sha1( $args . $client_secret ); $_GET [ 'signature' ]= $sign ; //最终传递的GET参数 var_dump( $_GET ); |
3. 获取access_token接口
重新获取token会使旧的token失效
GET /openapi/token?
grant_type=client_credentials&
client_id=appdev.sinanet.com&
ts=1587628159&
signature=ad90ca4f8395c679243c4264bd2159dd59a0f82b
1 2 3 4 5 6 7 8 9 | { "result" : true, "errno" : 0, "msg" : "" , "data" : { "access_token" : "e3ea1a05893f5906893a37c51e4458bdb7361794" , "expire_in" : 7200 } } |
4. 通过access_token + 用户标识 获取本企业内的员工登陆地址 , 登陆地址是一次性的 , 过期时间300秒
GET /openapi/get_login_url?
access_token=e3ea1a05893f5906893a37c51e4458bdb7361794&
email=shihan2@xxxxx.com
1 2 3 4 5 6 7 8 9 | { "result" : true, "errno" : 0, "msg" : "" , "data" : { "login_url" : "http://xxx/cgi/openapi_login.php?ts=1587628586&authKey=7883171fa07d5a149ef5f8e4fd401c925286c2cf&email=shihan2@xxx.com" , "expire_in" : 300 } } |
5.直接往登陆地址上跳 , 记录cookie session等身份信息 , 再跳到真正的系统
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-04-23 [TCP/IP] TCP的传输连接管理
2018-04-23 [日常] Linux下的docker实践
2016-04-23 [android] 手机卫士输入框抖动和手机震动
2016-04-23 [android] 手机卫士号码归属地查询完成