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第三方登录详解的更多相关文章
- thinkphp5.0 QQ第三方登录详解
一.前期准备工作 到QQ互联官网进行开发资质认证,并创建网站应用.获取到appid和appkey后,下载demo文件. demo文件下载方式:QQ互联>文档资料>SDK及资源下载>p ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
- Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...
- linux ssh使用深度解析(key登录详解)
linux ssh使用深度解析(key登录详解) SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SSH协议是IETF(Internet Engineering Task ...
- SSH免密登录详解
SSH免密登录详解 SSH(Security Shell)安全外壳协议,是较为可靠的,专为远程登录会话和其他网络服务提供安全保证的协议. 对于传统的网络服务程序(例如,FTP,Telnet等)来说 ...
- 前后端分离,简单JWT登录详解
前后端分离,简单JWT登录详解 目录 前后端分离,简单JWT登录详解 JWT登录流程 1. 用户认证处理 2. 前端登录 3. 前端请求处理 4. 后端请求处理 5. 前端页面跳转处理 6. 退出登录 ...
- 关于NopCommerce3.6版用户登录详解
一.登录方式 Nop登录方式有两种(且只能选择一种方式登录):一种是用用户名登录,另一种是用户注册邮箱登录,这个在后台可配置: 第一种:用户名登录 后台配置路径在商城设置à设置管理à客户设置:使用用户 ...
- 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 ...
随机推荐
- 50. Pow(x, n)
题目: Implement pow(x, n). 链接: http://leetcode.com/problems/powx-n/ 题解: 使用二分法求实数幂,假如不建立临时变量halfPow,直接r ...
- Retrofit所有知识场景汇总
https://futurestud.io/blog/retrofit-getting-started-and-android-client Retrofit Series Overview Gett ...
- The type sun.management.ManagementFactory is not visible
Eclipse默认将这些受访问限制的API设成了Error.解决方法:只要将Windows---Preferences---Java--Complicer---Errors/Warings里面的Dep ...
- QTP场景恢复之用例失败自动截图
以下代码是在QC里运行QTP来执行脚本过程,当执行过程中发现用例失败后就会自动截图,然后把用例返回到最初始的状态,模拟了场景恢复的机制 Class QCImageErrorCapture Dim qt ...
- 一些非常有用的html,css,javascript代码片段(持久更新)
1.判断设备是否联网 if (navigator.onLine) { //some code }else{ //others code } 2.获取url的指定参数 function getStrin ...
- AndroidApplication Fundamentals(Android应用基础)
AndroidApplication Fundamentals(Android应用基础) Android应用采用Java编程语言来编写,AndroidSDK工具编译我们的代码,连同任何数据和资源文件一 ...
- Apache httpd + tomcat 简单集群
集群其实很简单,我们就来说一下httpd+tomcat集群都要注意哪些部分: 首先使用的东西有 apache-tomcat-8.0.32 下载地址: http://tomcat.apache ...
- Kafka学习笔记
一.Kafka使用背景 1. Kafka的定义 是一个分布式消息系统,由LinkedIn使用Scala编写,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipel ...
- Android_PendingIntent的使用
PendingIntent介绍 PendingIntent可以看作是对Intent的一个封装,但它不是立刻执行某个行为,而是满足某些条件或触发某些事件后才执行指定的行为. PendingInt ...
- JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)
近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...