您的位置:首页 > 移动开发 > IOS开发

(0013)iOS 开发之集成友盟第三方登录

2016-12-30 11:33 495 查看
第三方登录的原理和流程

用户采用第三方登录的时候,用户会发送哪些信息到我的后台,后台会进行哪些比对操作?首次使用第三方登录和再次使用第三方登录时验证有哪些不同,后台如何保存用户的登录信息尼?

对于用户资源的授权来讲, 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

QQ

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个月有效期,过期后提示用户重新登录授权。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: