Bmob第三方登录详解

Bmob
第三方登录

简介

本文主要介绍新浪微博,QQ,微信的登录接入以及如何配合BmobSDK中的第三方登录功能实现第三方登录。

在使用之前请先按照快速入门创建好可以调用BmobSDK的工程。

新浪微博登录

1.下载新浪SDK,并按照上面给的文档说明,在新浪的后台创建应用并配置好工程。

2.在AppDelegate中实现回调。

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate,WeiboSDKDelegate>

AppDelegate.m

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [WeiboSDK handleOpenURL:url delegate:self];
} - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [WeiboSDK handleOpenURL:url delegate:self];
}

3.请求授权信息,可在点击登录处实现

    //向新浪发送请求
WBAuthorizeRequest *request = [WBAuthorizeRequest request];
request.redirectURI = @"https://api.weibo.com/oauth2/default.html";
request.scope = @"all";
[WeiboSDK sendRequest:request];

4.接收回调信息并与Bmob账号进行绑定,首次登录时Bmob后台会创建一个账号。

    NSString *accessToken = [(WBAuthorizeResponse *)response accessToken];
NSString *uid = [(WBAuthorizeResponse *)response userID];
NSDate *expiresDate = [(WBAuthorizeResponse *)response expirationDate];
NSLog(@"acessToken:%@",accessToken);
NSLog(@"UserId:%@",uid);
NSLog(@"expiresDate:%@",expiresDate);
NSDictionary *dic = @{@"access_token":accessToken,@"uid":uid,@"expirationDate":expiresDate}; //通过授权信息注册登录
[BmobUser loginInBackgroundWithAuthorDictionary:dic platform:BmobSNSPlatformSinaWeibo block:^(BmobUser *user, NSError *error) {
if (error) {
NSLog(@"weibo login error:%@",error);
} else if (user){
NSLog(@"user objectid is :%@",user.objectId);
}
}];

QQ登录

1.进入腾讯开放平台注册用户,创建应用(需要审核);

2.按照开发文档导入SDK,然后把注册成功后获取到的Key加入到Url Schemes中,格式为:tencentXXXX;

3.在AppDelegate.m中实现下面方法

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  {
return [TencentOAuth HandleOpenURL:url];
} - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [TencentOAuth HandleOpenURL:url];
}

4.注册并实现授权

    //注册
_oauth = [[TencentOAuth alloc] initWithAppId:@"1104720526" andDelegate:self];
//授权
NSArray *permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_INFO,nil];
[_oauth authorize:permissions inSafari:NO];
//获取用户信息
[_oauth getUserInfo];

5.获取AccessToken等信息,此处为实现TencentSessionDelegate中的方法,并进行绑定。

- (void)tencentDidLogin{
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]){
// 记录登录用户的OpenID、Token以及过期时间
NSString *accessToken = _tencentOAuth.accessToken;
NSString *uid = _tencentOAuth.openId;
NSDate *expiresDate = _tencentOAuth.expirationDate;
NSLog(@"acessToken:%@",accessToken);
NSLog(@"UserId:%@",uid);
NSLog(@"expiresDate:%@",expiresDate);
NSDictionary *dic = @{@"access_token":accessToken,@"uid":uid,@"expirationDate":expiresDate}; //通过授权信息注册登录
[BmobUser loginInBackgroundWithAuthorDictionary:dic platform:BmobSNSPlatformQQ block:^(BmobUser *user, NSError *error) {
if (error) {
NSLog(@"weibo login error:%@",error);
} else if (user){
NSLog(@"user objectid is :%@",user.objectId);
//跳转
ShowUserMessageViewController *showUser = [[ShowUserMessageViewController alloc] init];
showUser.title = @"用户信息"; [self.navigationController pushViewController:showUser animated:YES];
}
}];
} } - (void)tencentDidNotLogin:(BOOL)cancelled{
} - (void)tencentDidNotNetWork{
}

微信

1.到微信开放平台注册账号并提交应用审核;

2.按照官方文档配置好SDK,导入相应的依赖包,添加URL scheme;

3.在AppDelegate实现下面方法;

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  {
return [TencentOAuth HandleOpenURL:url] ||
[WeiboSDK handleOpenURL:url delegate:self] ||
[WXApi handleOpenURL:url delegate:self];;
} - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [TencentOAuth HandleOpenURL:url] ||
[WeiboSDK handleOpenURL:url delegate:self] ||
[WXApi handleOpenURL:url delegate:self];;
}

4.实现点击发送授权请求

- (IBAction)weixinLogin:(id)sender {
SendAuthReq* req =[[SendAuthReq alloc ] init];
req.scope = @"snsapi_userinfo,snsapi_base";
req.state = @"0744" ;
[WXApi sendReq:req];
}

5.发送授权后到完成绑定需要经过两步。
1)获取code
2)利用code获取token,openId和expiresDate

代码在AppDelegate.m中实现。如下:

-(void)onResp:(BaseReq *)resp
{
/*
ErrCode ERR_OK = 0(用户同意)
ERR_AUTH_DENIED = -4(用户拒绝授权)
ERR_USER_CANCEL = -2(用户取消)
code 用户换取access_token的code,仅在ErrCode为0时有效
state 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
lang 微信客户端当前语言
country 微信用户当前国家信息
*/
SendAuthResp *aresp = (SendAuthResp *)resp;
if (aresp.errCode== 0) {
NSString *code = aresp.code;
[self getAccessToken:code];
}
} -(void)getAccessToken:(NSString*)code{
//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code #warning 在此处需要填写你自身的appid和secretkey
NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",@"填入你的appid",@"填入你的secretkey",code]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *zoneUrl = [NSURL URLWithString:url];
NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data) {
NSDictionary *dicFromWeixin = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
/*
{
"access_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWiusJMZwzQU8kXcnT1hNs_ykAFDfDEuNp6waj-bDdepEzooL_k1vb7EQzhP8plTbD0AgR8zCRi1It3eNS7yRyd5A";
"expires_in" = 7200;
openid = oyAaTjsDx7pl4Q42O3sDzDtA7gZs;
"refresh_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWi2ZzH_XfVVxZbmha9oSFnKAhFsS0iyARkXCa7zPu4MqVRdwyb8J16V8cWw7oNIff0l-5F-4-GJwD8MopmjHXKiA";
scope = "snsapi_userinfo,snsapi_base";
}
*/
// 记录登录用户的OpenID、Token以及过期时间
NSString *accessToken = [dicFromWeixin objectForKey:@"access_token"];
NSString *uid = [dicFromWeixin objectForKey:@"openid"];
NSNumber *expires_in = [dicFromWeixin objectForKey:@"expires_in"];
NSDate *expiresDate = [NSDate dateWithTimeIntervalSinceNow:[expires_in doubleValue]];
NSLog(@"acessToken:%@",accessToken);
NSLog(@"UserId:%@",uid);
NSLog(@"expiresDate:%@",expiresDate);
NSDictionary *dic = @{@"access_token":accessToken,@"uid":uid,@"expirationDate":expiresDate}; //通过授权信息注册登录
[BmobUser loginInBackgroundWithAuthorDictionary:dic platform:BmobSNSPlatformWeiXin block:^(BmobUser *user, NSError *error) {
if (error) {
NSLog(@"weibo login error:%@",error);
} else if (user){
NSLog(@"user objectid is :%@",user.objectId);
}
}];
}
});
});
}

Bmob第三方登录详解的更多相关文章

  1. thinkphp5.0 QQ第三方登录详解

    一.前期准备工作 到QQ互联官网进行开发资质认证,并创建网站应用.获取到appid和appkey后,下载demo文件. demo文件下载方式:QQ互联>文档资料>SDK及资源下载>p ...

  2. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  3. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  4. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  5. linux ssh使用深度解析(key登录详解)

    linux ssh使用深度解析(key登录详解) SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SSH协议是IETF(Internet Engineering Task ...

  6. SSH免密登录详解

    SSH免密登录详解 SSH(Security Shell)安全外壳协议,是较为可靠的,专为远程登录会话和其他网络服务提供安全保证的协议. ​ 对于传统的网络服务程序(例如,FTP,Telnet等)来说 ...

  7. 前后端分离,简单JWT登录详解

    前后端分离,简单JWT登录详解 目录 前后端分离,简单JWT登录详解 JWT登录流程 1. 用户认证处理 2. 前端登录 3. 前端请求处理 4. 后端请求处理 5. 前端页面跳转处理 6. 退出登录 ...

  8. 关于NopCommerce3.6版用户登录详解

    一.登录方式 Nop登录方式有两种(且只能选择一种方式登录):一种是用用户名登录,另一种是用户注册邮箱登录,这个在后台可配置: 第一种:用户名登录 后台配置路径在商城设置à设置管理à客户设置:使用用户 ...

  9. Python标准库与第三方库详解(转载)

    转载地址: http://www.codeweblog.com/python%e6%a0%87%e5%87%86%e5%ba%93%e4%b8%8e%e7%ac%ac%e4%b8%89%e6%96%b ...

随机推荐

  1. swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)

    swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...

  2. C/C++技巧

    C中如何调用C++函数 将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用).例如: // C ...

  3. 关于imx6核心板qt系统U盘挂载

    在使用imx6核心板开发的时候,程序写到U盘,想通过U盘在板子上运行程序,U盘插到板子上后在minicom中有信息显示,但是无法找到挂载文件,/dev和/mnt下都没有找到相应的文件.后来百度后发现U ...

  4. Vim的可视模式

    可视模式可以看到选中的字符串, 并对其进行操作 v:进入字符选择模式 V:进入行选择模式 ctrl-v(Window是ctrl-q):进入block选择模式 o:移动光标到选择的另一端 O:移动光标到 ...

  5. SQL server函数大全

    函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一种 ...

  6. sendmessage()模拟鼠标点击

    {鼠标软模拟:好处就是不会真的移动鼠标 开始按钮 坐标 x=386y=387 }sendmessage(hookHwnd,messages.WM_LBUTTONDOWN ,0,$0180017A); ...

  7. [ASP.NET 技术点滴] Jquery 前端验证

    先上HTML代码: <form id="login" name="login" action="~/f_login/Login" me ...

  8. 用C/C++开发基于VLC SDK的视频播放器

    在windows系统如果开发万能播放器,一般都是基本DirectShow来开发,开发也很简单,但缺点也很多,一个文件格式是否能够播放完全取决于你 是否安装了正确的解析器和解码器,即使现在有了万能解器安 ...

  9. solr4.2 solrconfig.xml配置文件简单介绍

    对于solr4.x的每个core有两个很重要的配置文件:solrconfig.xml和schema.xml,下面我们来了解solrconfig.xml配置文件. 具体很详细的内容请细读solrcofi ...

  10. Storm入门教程 第五章 一致性事务【转】

    Storm是一个分布式的流处理系统,利用anchor和ack机制保证所有tuple都被成功处理.如果tuple出错,则可以被重传,但是如何保证出错的tuple只被处理一次呢?Storm提供了一套事务性 ...