博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 端第三方联合登陆分析, 非SDK版本
阅读量:4114 次
发布时间:2019-05-25

本文共 2757 字,大约阅读时间需要 9 分钟。

之前我们在自己的程序中使用新浪微博进行分享时,在没有服务器的情况下,(单机版应用通常都没有服务器), 需要在加入新浪微博SDK才能进行, 虽然各个分享SDK已经做得比较完善,但是使用起来门槛还是挺高的。 使用SDK的好处就在于支持SSO。 

如果你的应用不需要使用SSO的情况下,且有服务器的支持情况下, 则可以使用webview的方式登陆, 这样来说对客户端的工作量会大大减少。

下面主要描述两种方式来进行webview的方式登陆

方式一:

客户端先发送一个request 向自己的服务器,去请求uiwebview即将加载的url地址,发起的请求类似:

http://xxx.com/staging/client/connect/loginrequest?name=sina&app=movie&client=iphone&apiver=2.0.0&version=3.0.1&udid=8e7c7936e4b066d7d49b7e7e785a77ac&userid=-1&channel=com_dot_apple&loc=MTE2LjQ3MDc0MSwzOS45NjA4MDg=&width=640&height=960&openudid=69eb80bdc32e35f919557712449ac11298347eef&systemversion=6.0&gzip=0

服务器返回一个供uiwebview加载的地址如下,并进行加载

https://api.weibo.com/oauth2/authorize?client_id=4087175723&redirect_uri=http://xxx.com/staging/client/connect/loginconfirm/sina?udid=8e7c7936e4b066d7d49b7e7e785a77ac&apiver=2.0.0&client=iphone&channel=com_dot_apple&width=640&height=960&systemversion=6.0&loc=MTE2LjQ3MDc0MSwzOS45NjA4MDg=&version=3.0.1&response_type=code&display=mobile

然后在这个登陆的UIViewController中实现UIWebView的回调方法,

- (void)webViewDidFinishLoad:(UIWebView *)webView{},

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {}

当然,这里客户端的这个webview就会显示出新浪微博的登陆界面,让用户输入用户名和密码,用户输入完成后,

UIWebView会自动进行跳转, 先转向https://api.weibo.com/oauth2/authorize,

然后再 向:

http://xxx.com/staging/client/connect/loginconfirm/sina?udid=8e7c7936e4b066d7d49b7e7e785a77ac&code=5b0d59aa2d90c17d58bda3287333a4e0

然后在我们实现的

webView: shouldStartLoadWithRequest方法中,可以对上面这个url进行解析,当其中出现了code,即是我们所要的东东,客户端把这个code拿到后,通过同步或者异步上传到自己的服务器上, (因为当前的位置是在webview的回调方法中,所以使用同步调用更好一点),通常我们可以直接把上面的这个url直接用httprequest到自己的服务器上。 

然后服务器会去向新浪微博服务器进行确认,确认完成后, 会有回复的数据显示用户登陆成功还是失败。

用户就完成了登陆的过程。

方式二:上面这种使得客户端还是需要做一些编程,并且因为使用了一些同步的调用,使得客户端服务器都在等着,为解决上面的情况,所以有下面这种更加方便的方式。

客户端启动一个uiwebview来向服务器发起请求,这个url是事先和自己服务器商量好的一下url,如

http://xxx.com/staging/client/connect/loginrequest?name=sina&app=movie&client=iphone&apiver=2.0.0&version=3.0.1&udid=8e7c7936e4b066d7d49b7e7e785a77ac&userid=-1&channel=com_dot_apple&loc=MTE2LjQ3MDc0MSwzOS45NjA4MDg=&width=640&height=960&openudid=69eb80bdc32e35f919557712449ac11298347eef&systemversion=6.0&gzip=0

这个url到服务器后, 服务器直接使这个url进行重定向到新浪微博服务器, 这时webview会因为重定向到api.weibo.com/xxxx, 而显示给用户一个登陆界面, 用户在这个界面中输入用户名和密码, 新浪收到这个用户的数据后,会看用户是否是微博用户,如果是, 则新浪微博继续使用这个webview进行转向,转到自己的服务器,并带上用户的tokenid, 自己的服务器收到这个后,再通过webview的重定向带上用户在自己服务器上的信息进行转向, 而这个时候的转向其实已经没有意义,只是想通过这个重定向把数据让客户端获取。 

客户端由于实现了方法

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {}

所以客户端能收到服务器回来的数据,然后判定出自己登陆成功,判断成功后,在shouldStartLoadWithRequest中返回NO,使这个webview不再继续加载,然后提示给用户。

分析上面两种情况的区别,实际上是在于服务器,如果服务器做的事情较多,就像第二种情况一样,客户端就可以减少逻辑复杂度。 若服务器做的事情少,则需要像第一种方式那样,客户端做的事情就多。

转载地址:http://ttwpi.baihongyu.com/

你可能感兴趣的文章
Struts2技术内幕图书 转载
查看>>
Java异常分类
查看>>
项目中的jackson与json-lib使用比较
查看>>
Jackson Tree Model Example
查看>>
j2ee-验证码
查看>>
日志框架logj的使用
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>