从实现iPhone的OAuth封装看国内互联网和开放平台

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

转自:http://blog.csdn.net/arthurchenjs/article/details/6567563


由于工作需要,我最近接触了现在开放平台基本都会使用的OAuth协议。我相信OAuth是很强大的,但是,终于我还是切身的领教了中国互联网的的强大之处。

我的目的是制作一个iphone平台比较通用的OAuth库封装,通过简单的配置URL和key等参数,就可以快速的支持其开放平台,包括界面也是由我来完成。原先以为都是有开源封库的,只要简单的在做一层wrapper,开放几个接口应该就可以了。可惜的是想法是美好的,现实是残酷,道路也肯定是曲折的。

我看到的OAuth

说实话,我没有比较好的研究过OAuth这个协议,大致上来说,OAuth协议的目的是让第三方在不接触到用户的账号和密码情况下可以访问第一方的资源。这想起来真是太强大了。

OAUTH认证授权就三个步骤,三句话可以概括:

1.         获取未授权的Request Token

2.         获取用户授权的Request Token

3.         用授权的Request Token换取Access Token

   当应用拿到Access Token后,就可以有权访问用户授权的资源了。大家肯能看出来了,这三个步骤不就是对应OAUTH的三个URL服务地址嘛。一点没错,上面的三个步骤中,每个步骤分别请求一个URL,并且收到相关信息,并且拿到上步的相关信息去请求接下来的URL直到拿到Access Token。

开源项目

很幸运,网络上开源项目有Objective-C版本的,我好不客气的checkout了,没有很深入的研究内部的代码,不过看到代码主要还是对数据结构的封装,对URLRequest的封装,还有一些加密的处理。小做修改,就可以将其中桌面版的移植到手机版本的。不过我马上发现新浪的代码也是使用OAuthConsumer这份代码。我毫不犹豫的投入到新浪的怀抱中。

新浪微博

l  新浪的判断机制

新浪微博被认为是行业翘楚,其代码和api应该不会差到哪。例子的程序跑的挺好,可是后来看到其中一段代码和注释,我真的凌乱了。

/*********************************************************************************************************

 I am fully aware that this code is chock full 'o flunk. That said:

 

 - first we check, using standard DOM-diving, for the pin, looking at both the old and new tags for it.

 - if not found, we try a regex for it. This did not work for me (though it did work in test web pages).

 - if STILL not found, we iterate the entire HTML and look for an all-numeric 'word', 7 characters in length

 

 Ugly. I apologize for its inelegance. Bleah.

 *********************************************************************************************************/

- (NSString *) locateAuthPinInWebView: (UIWebView *) webView {

    NSString *pin;

         NSString                   *html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerText"];

         NSLog(@"html:%@", [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"]);

        

         if (html.length == 0) return nil;

        

         const char                *rawHTML = (const char *) [html UTF8String];

         int                             length = strlen(rawHTML), chunkLength = 0;

        

         for (int i = 0; i < length; i++) {

              if (rawHTML[i] < '0' || rawHTML[i] > '9') {

                     if (chunkLength == 6) {

                            char                            *buffer = (char *) malloc(chunkLength + 1);

                           

                            memmove(buffer, &rawHTML[i - chunkLength], chunkLength);

                            buffer[chunkLength] = 0;

                           

                            pin = [NSString stringWithUTF8String: buffer];

                            free(buffer);

                            return pin;

                     }

                     chunkLength = 0;

              } else

                     chunkLength++;

         }

         return nil;

}

 

这段代码我也没细品,但是基本可以看出是在网页的html代码中找到一串数字,找到了就认为是授权pin码,我的天啊,算了,人家也道歉了。可是我真不知道怎么来做这个协议了。

后来才发现,其实只要取到verifier就可以了,这是直接在url里面就有,不用去html里面扣。

 

l  新浪支持的XAuth协议

什么是XAuth呢? 我没有去考据究竟XAuth是谁的创造, 它几乎搬了大部分OAuth的内容, 不过解决了一个什么问题呢? 解决了一个 "OAuth认证必须跳转到第一方去输入密码" 的问题(美其名曰提升用户体验)。我真不知道说什么了, 第三方是可以得到用户密码的, 那它是不是直接把OAuth的第一大feature给咔嚓掉了——那basic auth不能满足你么?

 

l  OAuth提供两种认证方式

在新浪的文档中,我还注意到了这一段话:OAuth提供两种认证方式:query-string和http headers。我们推荐使用http header进行认证。

也许是这段话,腾讯微博做出了选择,让我悲剧了好长一段时间,终于向企鹅大哥妥协了。

腾讯微博

很快,调通了新浪微博后,我就开始腾讯的历程了。可是怎么都是不能授权成功,第一步获取token就失败了。后来我在FAQ中找到一段话:

 

请带上所有OAuth需要的参数,并按照规范传输(暂不支持Header方式传参,请通过GET,POST方式),腾讯微博授权协议在OAuth 【RFC 5849】 标准基础上开发。第一步需带上回调URL(oauth_callback参数),不是在第二步(非同于基他微博OAuth授权)。回调url需根据[RFC3986] 所定义的百分号机制进行URL转义。

 

我真的怀疑腾讯为了和新浪不兼容才不支持header方式传参的。就因为这一条,我最后还是选择了腾讯的封装,而弃用了新浪的封装。

 

另一个问题是:在请求request_token时传递oauth_callback参数, 因为写测试没用到callback, 所以肯定库会帮我填上oob(out-of-bound), 不过让我很崩溃的是, 给我跳转到了一个这样一个地方:

https://open.t.qq.com/oauth_html/oob?oauth_token=xxxxx&oauth_verifier=xxxxxx

结果是NOT FOUND了。

 

然后我又看到了下一条说明:

 

桌面应用,手机应用,因为没有callback_url(oauth_callback参数),所以在第一步传CALLBACK时请用oauth_callback=null代替,不然得不到 PIN码。“null”串不区分大小写。

 

还有腾讯的不同之处还有是拦截url中的oauth_verifier=xxxxxx的部分来继续操作。相比新浪的,也是靠谱一点,可是也就是因为这个,后面豆瓣和网易我都没能都支持。

 

搜狐微博

搜狐微博的支持似乎比较弱,但是中规中规中矩的,除了界面比较丑陋,没有针对手机适配,其他的很容易就走通了流程了。

网易微博

开始我尝试了网易微博的授权,没能成功。

首先我发现的明显的一个不按照标准的地方是authorization步骤, 它提供了两个接口, 一个是/oauth/authorize, 一个是/oauth/authenticate, 首先我先申明这两个单词我一直搞不清, 不过在网易给OAuth的分工中, 它们的工程师是这么定义的: authorize不处理callback, 直接展示verifier的页面; 另一个, authenticate则处理callback. (至于给第二个传oob会怎么样, 有没有返回oauth_callback_confirmed, 我都没有细看了)。

另外小提一下, 它在回调你的callback地址的时候, 传的参数名是oauth_token, 不过相信我, 我觉得那是oauth_verifier。

后来仔细研究了网易的协议后,我才发现,其实并不是每一个都需要verifier。那怎么来确定是否同意授权,只要重定向了,就可以认为用户已经授权,直接去换取accesstoeken就可以了。因为这样豆瓣的问题也同样的解决了。

还有,网易需要把重定向url加到在请求授权url时一起加上,他才不管你在header里已经传了。

最后还需要加上client_type=mobile,真是麻烦。

还有,网易的demo代码真是不知道说什么了。不过算了,毕竟人家也是贡献出来的。整个网易的objective-C代码就是把腾讯的demo改改,然后就拿出来了。不过出现了和我一样的问题,但是可能不知道重定向url的问题,出现了手动输入pin的界面,这是我做库所不能接受的,所以没有采纳。

豆瓣

开始豆瓣我也没有能够成功,他总是不会重定向到我的URL,转而跳转到其授权的界面。这大概是我使用腾讯封装导致的结果。可是我还真没好好的确认这个流程了。

后来才发现,只要在请求网页地址的时候,需要吧重定向地址加到url,这样才会正确重定向,并且和网易一样,没有verifier,直接请求就可以成功了。

豆瓣没有Objective-C的代码,没有参考,很久都没有解决,最后是解决网易的时候也一起解决的。

人人网

人人网使用的OAuth2.0,2.0的协议我没有好好的看过,因为现在只有人人支持2.0所以我偷懒的直接使用了人人的代码,所以,结果是2.0现在只支持人人授权。

人人的代码是直接冲facebooksdk改改就拿来用的,也是有时候看看也觉得真是的,一点都不专业。

一点感触

已经不记得是在什么地方看到一篇文章, 作者一上来第一句话就是 "从OAuth可以看出一个互联网企业的技术力", 虽然稍微有些偏激, 但多多少少有值得认同的地方。

OAuth的应用越来越广泛, 互联网企业拿着互联网开发的新年开发着自己的平台, 这是一件很好的事情.从开发角度来说,不得不承认OAuth并不简单, 我也并不精通OAuth, 偷懒了用了别人的库或多或少出现了些问题.。我依然比较郁闷的是, OAuthConsumer本身自己就支持一大堆国外的OAuth, 并且在我看来代码都是没有什么问题的, 到了国内, 标准就不是标准了,标准只是参考, 各家各户按照自己的理解在做。

国内的互联网环境真的是相当有特色的,对此,面对需求和计划,我只能说,先实现功能吧,代码写成什么样先不说了。

国内的开发环境也是比较混乱,因为基本都是代码抄来抄去,有时候并没有真正的去实现,可以想象,服务端的协议制作应该也是一样的,做协议的总是不能够静下心来做事。

由于时间比较紧,我承认我偷懒使用了很多现有的代码。也因为这样,让这个库的功能还不是那么完整,还有很多不是能够比较好的支持。中间百般折腾,给我造成了很多的困扰,自此,也就是支持新浪,腾讯,搜狐,网易,豆瓣和人人的授权。其他的还需要改进。


企业级iOS设备管理:从MDM核心架构到安全部署实战 移动设备管理(MDM)是企业移动安全的核心技术框架,它通过一套标准化的协议与接口,实现对iOS等移动终端的集中管控。其核心原理在于,MDM服务器与设备之间通过安装一个受信任的描述文件建立安全通道,从而远程下发配置策略、分发应用并执行安全指令。这项技术的核心价值在于,它能在保障员工使用体验的前提下,将企业数据与个人数据进行安全隔离,并确保设备符合统一的安全基线。在金融、医疗等高合规性要求的行业,以及任何涉及敏感数据处理的移动办公场景中,MDM都是构建安全防线的基石。本文聚焦于企业级iOS安全与管理,深入解析如 阅读详情

相关推荐

AI Orchestration实战:MuleSoft+LangChain企业级智能编排

AI Orchestration(AI编排)是企业将大语言模型(LLM)与现有IT系统深度集成的核心范式,其本质是解耦‘数据流动’与‘智能决策’——通过API集成层(如MuleSoft)保障数据主权、协议兼容与安全合规,再由AI框架层(如LangChain)专注语义理解、知识检索与推理生成。该模式突破了单点调用大模型的局限,支撑金融风控、医疗报告、制造运维等强监管、多系统、高确定性场景。本文基于真实交付项目,详解MuleSoft作为‘企业系统神经中枢’与LangChain作为‘AI逻辑引擎’的协同设计、安全

weixin_34268310的博客 411

[转]从实现iPhoneOAuth封装国内互联网开放平台

虽然我开发的是Android平台的分享应用,但是这篇给我的提示都是很重要的,过段时间,我会把我的开发过程完整的整理出来,所以先把一些文章先拷贝上来。 http://blog.csdn.net/arthurchenjs/article/details/6567563 由于工作需要,我最近接触了现在开放平台基本都会使用的OAuth协议。我相信OAuth是很强大的,但是,...

weixin_34113237的博客 88

Kimi Claw:零代码接入的AI智能体基础设施

AI智能体(Agent)正从概念走向落地,其核心在于能否跨越‘能力’与‘动作’之间的最后一厘米断层。传统Agent方案依赖开发者手动配置环境、调试权限、编排技能,学习成本高、运维负担重、安全风险不可控。Kimi Claw通过沙箱即服务、意图驱动的Skills编排、飞书原生事件总线三层架构,将复杂Agent能力封装为开箱即用的业务组件。它不替代人的判断,而是清零重复性操作成本——如OAuth鉴权、API胶水代码、回调调试等,让运营、产品、财务等非技术角色也能在5分钟内启动全自动财经盯盘、政策监控、舆情简报等真

weixin_34279579的博客 458

其他——[转]从实现iPhoneOAuth封装国内互联网开放平台

虽然我开发的是Android平台的分享应用,但是这篇给我的提示都是很重要的,过段时间,我会把我的开发过程完整的整理出来,所以先把一些文章先拷贝上来。 http://blog.csdn.net/arthurchenjs/article/details/6567563 由于工作需要,我最近接触了现在开放平台基本都会使用的OAuth协议。我相信OAuth是很强大的,但是,终于我还是切身的领...

weixin_30809173的博客 109

实现iPhoneOAuth封装国内互联网开放平台(转)

http://blog.csdn.net/arthurchenjs/article/details/6567563 由于工作需要,我最近接触了现在开放平台基本都会使用的OAuth协议。我相信OAuth是很强大的,但是,终于我还是切身的领教了中国互联网的的强大之处。 我的目的是制作一个iphone平台比较通用的OAuth封装,通过简单的配置URLkey等参数,就可以快速的支持其开放平台,...

weixin_34133829的博客 98

移动互联网服务客户端开发技巧(一)

随着微博、LBS 等移动互联网服务的火爆普及,越来越多的苹果开发者希望制作各网络服务的 iPhone 客户端。CocoaChina 会员 “qdvictory” 的《基于网络的客户端开发技巧》系列文章详细介绍了 iPhone 客户端应用的开发思路注意事项,希望对苹果开发者们有所帮助。     一、做一个程序之前,要明确你要做的是什么。这之间道道不少,不仅仅要实现功能,还要考虑到程序功能之间

Leeyehong_self的专栏 740

移动互联网服务客户端开发技巧 ( Webview及正则)

随着微博、LBS 等移动互联网服务的火爆普及,越来越多的苹果开发者希望制作各网络服务的 iPhone 客户端。CocoaChina 会员 “qdvictory” 的《基于网络的客户端开发技巧》系列文章详细介绍了 iPhone 客户端应用的开发思路注意事项,希望对苹果开发者们有所帮助。 一、做一个程序之前,要明确你要做的是什么。这之间道道不少,不仅仅要实现功能,还要考虑到程序功能之间是如...

weixin_34268169的博客 92

转载:移动互联网服务客户端开发技巧 ( Webview及正则)

转载自:http://www.cnblogs.com/pengyingh/articles/2341067.html   随着微博、LBS 等移动互联网服务的火爆普及,越来越多的苹果开发者希望制作各网络服务的 iPhone 客户端。CocoaChina 会员 “qdvictory” 的《基于网络的客户端开发技巧》系列文章详细介绍了 iPhone 客户端应用的开发思路注意事项,希望...

programloverjack的专栏 182

微博开发笔记上(未完待续)

新浪微博开发笔记iPhone 项目目标 项目掌控能力 工具使用能力 开发技巧能力 课程提纲新浪微博接口地址 微博开放平台地址 http://open.weibo.com 微博接口文档地址 http://open.weibo.com/wiki/微博API 项目主题框架走向工作岗位之后,一般会遇到两种工作情况: 新项目开发通常在项目开始之前,公司的产品经理会提供完整的产品原型图,或功能设计文档 通过

jiahao8915的专栏 1809

基于Auth.js实现WebAuthn与Passkeys无密码登录全流程指南

在网络安全领域,身份认证是保障用户数据安全的第一道防线。传统的密码认证依赖于“共享秘密”模型,存在泄露、撞库等固有风险。其核心原理正逐步向基于公钥密码学的“挑战-响应”机制演进,通过非对称加密技术,实现私钥永不离开用户本地设备,从而在根本上提升安全性。这一技术价值在于彻底消除了密码传输服务器端存储带来的攻击面,为用户提供了更安全、更便捷的登录体验。其应用场景广泛,从个人应用到企业级服务,无密码认证正成为提升安全性与用户体验的关键实践。本文聚焦于如何利用Auth.js框架,结合WebAuthn标准Pass

weixin_30642869的博客 428

视觉AI Agent:突破API限制,实现通用网页自动化的工程实践

在AI工程领域,网页自动化是提升效率的关键技术。传统方法主要依赖API调用DOM解析,其原理是通过预定义的接口或解析页面结构来操作网页。然而,这种方法在技术价值上存在明显瓶颈:API覆盖率低、文档复杂且难以应对动态视觉交互。面对电商、社交等复杂网页应用场景,纯API路径常因缺乏状态感知而失效,导致Agent陷入循环或触发如`thinking_budget`参数错误、`context length`超限等常见API错误。为解决这些痛点,结合视觉理解能力的多模态AI Agent成为新的技术方向。它通过视觉模型

weixin_30740581的博客 363

大模型数据库工具调用实战:Gradient平台实现LLM自主查库

大语言模型(LLM)的工具调用(Tool Calling)是一种让模型主动选择并执行外部函数的能力,其核心在于语义理解与结构化决策,而非简单API封装。它依托标准化工具契约(Schema)、参数校验、安全网关与可观测性机制,将模型从‘静态知识生成器’升级为可联动真实业务系统的智能代理。在数据库集成场景中,Tool Calling通过语义层抽象、SQL模板化与连接池治理,实现安全、可控、可审计的数据访问,显著降低LLM应用落地门槛。本文以Gradient™ AI Platform为实践载体,详解如何将Post

weixin_30237719的博客 427

模板驱动型文档自动化:结构化内容与样式继承实战

文档自动化是现代企业提升交付效率与品牌一致性的关键技术,其核心在于将重复性内容生产转化为可复用、可验证、可演进的系统工程。它基于结构化内容建模,依托模板驱动机制实现数据绑定、条件逻辑与循环渲染,并通过样式继承体系保障跨平台、跨人员的视觉统一。相比脚本填充或AI生成,模板驱动在合规性、可控性与业务适配性上具备不可替代优势,广泛应用于SaaS产品文档、金融报告、法律意见书、营销方案等强规范场景。本文深入解析Sqribble风格的四层模板架构(视觉层、结构层、数据层、逻辑层)及样式继承链设计,聚焦模板驱动、文档自

weixin_30432579的博客 548
上一篇: iBooks Author accounts are free, but existing developers must make a new account
下一篇: xcode 4 制作静态库详解
primer_programer
博客等级 码龄20年 283粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值