【IOS】App中OAuth授权的实现方式

OAuth 授权在 iOS 中的实现方式

在 iOS App 中,需要绑定微博、twitter、flickr 等第三方平台账号时,一般用OAuth 授权的方式。 OAuth 1.0 授权大致分为以下三步:

  1. 客户端向平台申请一个 request token,该 token 是未授权的;
  2. 客户端打开平台提供的登陆页面,引导用户输入用户名密码,对 request token 进行授权。 登陆页面的 url 中会附带一个 redirect_url,当授权成功后会重定向到这个地址,返回客户端。
  3. 客户端拿着已授权的 request token 向平台换取一个 access token,后续就使用 access token 访问平台提供资源。

OAuth 2.0 授权的流程与 1.0 有所变化,但 2、3 两步还是存在的。 关键就是其中的第二步,用户是在平台而不是客户端提供的页面上输入用户名密码, 例如淘宝绑定新浪微博的授权登陆页面,域名是新浪的:

OAuth 保证了客户端始终接触不到用户名密码,这样就保证了用户账号的安全,OAuth 发明的意义就在这里。 一旦发现客户端做坏事,只需禁用相应的 access token 即可,不用担心自己的密码泄漏。

Web App 下第二步的登陆流程,一般会在打开的新窗口中进行。但在 iOS App 里,授权登陆的实现形式就可以有以下三种形式:

内嵌 WebView

这种方法是在 app 内置的 WebView 里打开登陆页面完成授权,例如新版 Instagram 绑定新浪微博 (下图),Path 绑定 twitter 等。

许多平台提供的 sdk 都实现了这个流程,例如 sinaweiboios 使用一个嵌入 WebView 的 modal ViewController, 而人人网 sdk 则可以选择弹出浮出层或者 push NavigationController 来显示登陆窗口。

不用 sdk 的话自己实现也不难,需要在合适的地方放一个 WebView 打开登陆页面。 关键是要设置这个 WebView 的 delegate, 实现 delegate 的webView:shouldStartLoadWithRequest:navigationType: 方法, 在里面检查目标 URL 是否等于 callback redirect_url,若相等则说明授权成功,关闭 WebView 即可。

这种实现方式存在以下两个明显的缺点:

  1. 由于登陆页面是嵌入在 WebView 里的,用户无法判断这个页面是由平台提供的,还是 app 伪造的,丧失了 OAuth 的最大优势,用户的密码安全得不到保障;
  2. 不同的 app 需要向同一个平台授权时,用户需要反复输入用户名密码。跟第一点相比,这点用户体验的损伤真不算什么。

切换到 Safari 进程

这种方法是切换到 Safari 进程,打开登陆页面,完成授权后再切换到 app 进程中。 例如 Instagram 绑定 Flickr,甚至 Flickr app 登陆到自己的账户都是用这种方式实现的。

实现这种方法,能切换成功的关键在于 app 需要注册自己的 url scheme, 并用一个符合此 scheme 的 url 作为授权完毕的回调地址, 这样浏览器打开回调地址时就能返回 app。 例如我们的全国空气污染指数的 url scheme 是 dirtybeijing, 授权完成的回调地址就是 dirtybeijing://sns_authorized/weibo。 在 app delegate 中实现 application:openURL:sourceApplication:annotation: (iOS ≥ 4.2) 或者 application:handleOpenURL: (iOS < 4.2) 即可捕获通过 url scheme 打开 app 的事件,从而完成 OAuth 授权的后续流程。

相比内嵌 WebView,这种方法的优点:

  1. 登陆页面通过操作系统浏览器打开,用户可以通过检查地址栏中的域名,以及是否使用了 https 来确认登陆页面不是第三方 app 伪造的;
  2. 同一个账号多次授权不同的 app 时,可以共享浏览器 cookie,使得后续的授权不需要再输入用户名密码。

当然,这种方法也有其自身的缺点:

  1. 兼容性: 由于依赖 iOS 多任务切换,所以一般只能用于 4.0 以后的操作系统。 iOS 4.0 之前不支持多任务,所以 app 需要在切换到 Safari 之前自行保存现场, 在从 Safari 返回以后再自行恢复现场,实现比较复杂。
  2. 多任务切换,会给用户一种流程中断的感觉。
  3. 会在 Safari 中留下一个未关闭的 tab。

腾讯微博的授权页面上,就指出了必须用这种方法完成授权,禁止使用内嵌的方法。 不过大多数开发者貌似没怎么严格执行,腾讯的审核也不严格。

切换到官方应用进程

跟上一种方法类似,只不过将 Safari 替换成了平台的官方应用,最典型的就是 Facebook。 由于用户一般已经在平台的官方 app 中登陆过,所以授权过程不需要再输入用户名密码,也不会在 Safari 中留下未关闭的 tab, 在保证安全性的前提下体验是最好的。 但限制也很明显:需要官方应用支持、需要用户已安装过官方应用。

Facebook SDK 中的授权过程,首先尝试使用官方 app,若未安装 Facebook app 或者操作系统不支持多任务, 则会打开 Safari 完成授权;若 Safari 仍然打开失败,则会在嵌入的 WebView 打开登陆页面。 完整实现可参考 Facebook.m 中的authorizeWithFBAppAuth:safariAuth: 方法。

总之,建议 app 开发者需要实现 OAuth 授权时,为保证安全性,尽量使用切换到 Safari 或者官方应用的方式进行。 用户在使用 app 时,若第三方账号的登陆界面是 app 内嵌的,一定要小心。 类似下图这种绑定形式太吓人了,直接向一个 app 透露微博的用户名密码,谁敢用啊。

时间: 2024-08-16 09:07:12

【IOS】App中OAuth授权的实现方式的相关文章

iOS App中 使用 OpenSSL 库

转自:http://blog.csdn.net/kmyhy/article/details/6534067 在你的 iOS App中 使用 OpenSSL 库 ——译自x2on的“Tutorial: iPhone App with compiled OpenSSL 1.0.0a Library” 原文地址:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/,本文有少许地方做

在你的 iOS App中 使用 OpenSSL 库

在你的 iOS App中 使用 OpenSSL 库 ——译自x2on的“Tutorial: iPhone App with compiled OpenSSL 1.0.0a Library” 原文地址:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/ ,本文有少许地方做了调整. 1.下载OpenSSL源代码库: http://www.openssl.org/source/

在iOS App 中添加启动画面

你可以认为你需要为启动画面编写代码,然而Apple 让你可以非常简单地在Xcode中完成.不需要编写代码,你仅需要在Xcode中进行一些配置. 1.什么是启动画面(Splash Screen)? 启动画面是你在启动App的时候看到的第一个界面,通常,启动画面是覆盖整个屏幕的一张图片,在主屏幕装在完后隐藏. 启动画面的主要目的是让用户知道你的App正在装载,并且对用户介绍你的品牌.启动画面对哪些需要较长时间启动的Apps尤其重要.一般而言,启动画面是为了给用户更好的体验. 2.在你的App中添加启

如何在 iOS App 中整合 Facebook 廣告

原文:Displaying Facebook Ads in Your iOS Apps 作者:GABRIEL THEODOROPOULOS 译者:kmyhy 不久前有人問我如何在項目中集成 Facebook 的廣告.因為之前沒用過,以為一定很難,所以事先查閱了大量文檔.在通讀完文檔之後,發現其實並不是很難,僅僅幾分鐘我就能夠搞定我的第一個 Facebook 廣告 App! Facebook 廣告是一種將廣告集成到你的 app 中的方法,使你可以通過廣告的點擊量來獲得收入.這個方法(集成廣告)并不

关于iOS APP中网络层的设计

在iOS开发中,请求网络数据,处理获得的数据是很常见的功能,但是很少有资料会讨论关于网络的处理应该放在MVC中得哪个层中. 我在网上Google了一番,记下了几个觉得比较不错的链接.现记录如下: http://stackoverflow.com/questions/4810289/best-architecture-for-an-ios-application-that-makes-many-network-requests?lq=1 这个答案提供了一个实际的设计 http://akosma.c

iOS APP中数据加载的6种方式

我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以轻松自在的享受等待,对加载后的内容有明确的预期呢? 设计师在进行APP设计的设计时,往往会更加专注于界面长什么样,界面和界面之间怎么跳转,给予用户什么样的操作反馈,却偏偏特别容易忽略掉一个比较重要的环节,就是APP数据加载中的设计,所以会导致我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数

[iOS微博项目 - 2.2] - 在app中获取授权

github: https://github.com/hellovoidworld/HVWWeibo   A.发送授权请求 1.使用UIWebView加载请求页面 自定义一个继承UIViewController的HVWOAuthViewController 1 // 2 // HVWOAuthViewController.m 3 // HVWWeibo 4 // 5 // Created by hellovoidworld on 15/2/4. 6 // Copyright (c) 2015年

五分钟,运用cocoaui库,搭建主流iOS app中我的界面

本项目基于天天团购项目,在上一篇中有说到! 首先介绍一些cocoaui,是国内的一名程序员做的开源的开源系统,目的是为了简化ios布局!官网地址:www.cocoaui.com,github地址:https://github.com/ideawu/cocoaui 我们这里使用xml定义布局界面,其实就是传统的html + css定义界面,大部分人都有网页布局的经验,搞ios布局还是很容易入手并且快捷的!我们首先看下我们要做的界面: 我们按照html+css的格式来定义这个界面: <div> &

iOS APP中第三方APP调用自己的APP,打开文件

根据需求需要在项目中要打开word.pdf.excel等文件,在info.plist文件中添加 <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string></string> <key>LSItemContentTypes</key> <array> <strin