第三方登录的原理和流程
用户采用第三方登录的时候,用户会发送哪些信息到我的后台,后台会进行哪些比对操作?首次使用第三方登录和再次使用第三方登录时验证有哪些不同,后台如何保存用户的登录信息尼?
对于用户资源的授权来讲, OAuth并不是唯一的,但是目前OAuth2.0应该已经是各种平台的事实标准了,对于OAuth2.0协议,有一系列RFC阐述了OAuth2.0。不过OAuth2.0虽然已经是一个标准,但是各个平台对它的实现并不完全相同,但是最基本的流程是一样,所以你要先了解这个协议。
我直接拿QQ做例子,简单说一下流程:
当用户点击QQ登陆,引导用户跳转到第三方客户端,当用户成功登录以后会自动跳转回来,控制器会收到友盟的回调,拿到用的一些数据,uid/openid/accessToken/name/nickname/iconurl等。
第三方平台和本地用户系统结合应该分为三种情况:
- 本地未登录,第一次登录第三方:此时相当于注册,直接把第三方信息拉取来并注册成本地用户就可以了,并建立本地用户与第三方用户(openid)的绑定关系
- 本地未登录,再次登录第三方:此时用户已注册,获取到openid后直接找出对应的本地用户即可
- 本地登录,并绑定第三方:这个只要将获取到的openid绑定到本地用户就可以了
iOS 应用QQ互联授权登录和分享的审核填写?
这里的URL schema应该怎么设置?
在你的工程设置项,targets 一栏下,选中自己的 target,在 Info->URL Types 中添加 URL Schemes,设置Xcode的url scheme格式为“QQ”+腾讯QQ互联应用appId转换成十六进制(不足8位前面补0),例如“QQ05FC5B14”。并在QQ互联后台的URL schema中填入此字符串保持一致。
额外设置 url schemes 的格式为"tencent"+腾讯QQ互联应用appId,例如“tencent100424468”
集成友盟的 微信/QQ授权登录
1. profile 中添加,后pod update
# 友盟第三方登录
pod 'UMengUShare/Social/QQ' # 集成QQ
pod 'UMengUShare/Social/WeChat' # 集成微信
2.添加依赖库
微信
SystemConfiguration.framework
CoreTelephony.framework
libsqlite3.tbd
libc++.tbd
libz.tbd
SystemConfiguration.framework
libc++.tbd
3. 配置各平台URL Scheme
URL Scheme是通过系统找到并跳转对应app的一类设置,通过向项目中的info.plist文件中加入URL types可使用第三方平台所注册的appkey信息向系统注册你的app,当跳转到第三方应用授权或分享后,可直接跳转回你的app。不过QQ的比较特殊,QQ的是要把appid转换成16进制然后再补齐够八位再添加进去。QQ注册时:tencent19919910和QQ4A6aHN01 (16进制),两者都要加上。不然跳不到qq。
4.iOS9/10设置白名单
如果你的应用使用了如SSO授权登录或跳转到第三方分享功能,在iOS9/10下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes,否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开(具体设置在Build Setting -> Packaging -> Info.plist File可获取plist路径)
5.然后就可以在AppDelegate.m 的启动方法中设置 配置UMengUShare/Social appkey之类
使用的地方
- (IBAction)goAuthLogin:(id)sender
{
UIButton *portBtn = sender;
if (portBtn.tag==1000) {
[selfgetUserInfoForPlatform:UMSocialPlatformType_WechatSession];
}else {
[selfgetUserInfoForPlatform:UMSocialPlatformType_QQ];
}
}
- (void)getUserInfoForPlatform:(UMSocialPlatformType)platformType
{
// 判断是否安装QQ 微信
// [QQApiInterface isQQInstalled];
// [WXApi isWXAppInstalled];
[[UMSocialManagerdefaultManager]getUserInfoWithPlatform:platformTypecurrentViewController:selfcompletion:^(id result,NSError *error) {
UMSocialUserInfoResponse *resp = result;
// 第三方登录数据(为空表示平台未提供)
// 授权数据
NSLog(@" uid: %@", resp.uid);
NSLog(@" openid: %@", resp.openid);
NSLog(@" accessToken: %@", resp.accessToken);
NSLog(@" refreshToken: %@", resp.refreshToken);
NSLog(@" expiration: %@", resp.expiration);
// 用户数据
NSLog(@" name: %@", resp.name);
NSLog(@" iconurl: %@", resp.iconurl);
NSLog(@" gender: %@", resp.gender);
// 第三方平台SDK原始数据
NSLog(@" originalResponse: %@", resp.originalResponse);
}];
}
遇到问题:
问题1:文档说这个方法也可以用,结果没调用
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
BOOL result = [[UMSocialManagerdefaultManager]handleOpenURL:url];
if (!result) {
// 其他如支付等SDK的回调
}
return result;
}
使用:- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation{
BOOL result = [[UMSocialManagerdefaultManager]handleOpenURL:url];
if (!result) {
// 其他如支付等SDK的回调
}
return result;
}
就可以了!微信得到了授权成功的回调的用户信息!
拿到的参数概述 通过进行sso,获得授权能获得诸如头像,昵称之类的数据,最重要的Token可UID这两个东西,token类似于签名之类的东西,不是唯一的,普通账号7天就过期了,测试账号好像是一年过期,所以我们不能拿这个进行保存用户,UID是唯一的,唯一对应一个三方的用户,所以,服务端可以拿这个判断一个用户
问题2:腾讯QQ授权登录时,登录授权失败110406。
解决办法:
在腾讯开放平台中,应用接入——应用管理——iOS应用——选择对应的应用——选择QQ登录——切换到应用调试者,添加调试用的QQ号
注意:添加的调试用的QQ号必须是开通开放平台的QQ账号的好友,否则无法添加调试的QQ号。
OK 了;
第三方登录:(需求)
1.是否有取消授权
2.是否定期刷新授权 考虑手机丢失安全
3.获取到的access token具有3个月有效期,过期后提示用户重新登录授权。