facebook第三方应用开发
应用后台配置
说明
1.应用域名必须使用https 域名,
2.应用发布前,需要将访问用户添加到应用后台配置中,否则用户无法访问网站
3.应用发布前,应用可以获取所有添加的用户的部分数据
4.很多数据必须要向facebook后台提交审核权限,并且审核通过了,才可以使用相关权限,详情见官方文档
应用后台配置截图
1.可根据自己的情况选择 2.配置相关信息,因为公司内部使用,我选择的是个人,公司账号权限会更多,业务后期可拓展性强,可根据实际情况自行调整; 3.最初也填写了ip白名单,但是涉及nginx反向代理,以及内网ip,后续出现了一些问题,故取消了白名单设置,可根据实际情况自行测试,并调整 4.允许跨域,因为我的网站涉及内网和多个域名,可根据实际情况自行调整 5.填入网站涉及的所有的跳转url 6.我的是web网站,故选的是"www"类型,可根据实际情况自行修改 7.概括各部分作用和涉及内容
graphapi的使用(php-sdk)
1.注意
1) 截止到2019-06-16为止,php-sdk已经升级到了v3.3版本,注意在graphapi调用时,版本与下载的sdk版本号一致
2 poser安装
composer require facebook/graph-sdk # 前提是本机安装了composer,并设置了环境变量,若没有,百度自行安装就行了
3.demo案例
/* **************** 入口文件 ****************** */
# 获取回调地址
$helper = $fb->getredirectloginhelper();
$permissions = ['email','public_profile']; //获取的信息权限列表
$loginurl = $helper->getlogin;
header('location: '.$loginurl); // 重定向到回调url
/*echo '
'; */?>
/* **************** 回调文件 ****************** */
fbtotalconfig = [
'app_id' => '应用id',
'app_secret' => '应用secret',
'app_version' => 'v3.2',// 跟安装的sdk版本一致,截止到20190616,已升级到v3.3
'header_url' => ' test /list.html',//跳转到指定页面
];
# 调用facebook-sdk
require_once './vendor/autoload.php'; // change path as needed
$fb = new facebook\facebook([
'app_id' => $fbtotalconfig['app_id'], // 应用id
'app_secret' => $fbtotalconfig['app_secret'], //应用secret
'default_graph_version' => fbtotalconfig['app_version'], // 跟安装的sdk版本一致,截止到20190616,已升级到v3.3
]);
// 在fb-callback.php页顶部加入session
if (!session_id()) {
session_start();
}
// 然后强制传值
$helper = $fb->getredirectloginhelper();
if (isset($_get['state'])) {
$helper->getpersistentdatahandler()->set('state', $_get['state']);
}
# 获取fb_access_token
try {
# 方案1:拼接https的重定向url
// $redirecturl = ' '.$_server['server_name'].$_server['request_uri'];
// $accesstoken = $helper->getaccesstoken($redirecturl);
# 方案2: 直接使用sdk内部获取的$_server数据(需做部分修改) [推荐使用]
$accesstoken = $helper->getaccesstoken();
} catch(facebook\exceptions\facebookresponseexception $e) {
// when graph returns an error
echo 'graph returned an error: ' . $e->getmessage();
exit;
} catch(facebook\exceptions\facebooksdkexception $e) {
// when validation fails or other local issues
echo 'facebook sdk returned an error: ' . $e->getmessage();
exit;
}
# 验证fb_access_token
if (! isset($accesstoken)) {
if ($helper->geterror()) {
header('http/1.0 401 unauthorized');
echo "error: " . $helper->geterror() . "\n";
echo "error code: " . $helper->geterrorcode() . "\n";
echo "error reason: " . $helper->geterrorreason() . "\n";
echo "error description: " . $helper->geterrordescription() . "\n";
} else {
header('http/1.0 400 bad request');
echo 'bad request';
}
exit;
}
// the oauth 2.0 client handler helps us manage access tokens
$oauth2client = $fb->getoauth2client();
// get the access token metadata from /debug_token
$tokenmetadata = $oauth2client->debugtoken($accesstoken);
// validation (these will throw facebooksdkexception's when they fail)
$tokenmetadata->validateappid($fbtotalconfig['app_id']); // 验证应用id,
// if you know the user id this access token belongs to, you can validate it here
//$tokenmetadata->validateuserid('123');
$tokenmetadata->validateexpiration();
if (! $accesstoken->islonglived()) {
// exchanges a short-lived access token for a long-lived one
try {
$accesstoken = $oauth2client->getlonglivedaccesstoken($accesstoken);
} catch (facebook\exceptions\facebooksdkexception $e) {
echo "
error getting long-lived access token: " . $e->getmessage() . "
\n\n";exit;
}
echo '
long-lived
';var_dump($accesstoken->getvalue());
}
$_session['fb_access_token'] = (string) $accesstoken;
# 设置自定义cookie
//setcookie('fb_access_token',(string) $accesstoken,0,'/','test ');
//setcookie('fb_access_token',(string) $accesstoken,0,'/','test2 ');
try {
# 获取退出登录的url
$logouturl = $helper->getlogout);
} catch(facebook\exceptions\facebookresponseexception $e) {
echo 'graph returned an error: ' . $e->getmessage();
exit;
} catch(facebook\exceptions\facebooksdkexception $e) {
echo 'facebook sdk returned an error: ' . $e->getmessage();
exit;
}
// 获取响应数据
try {
# 获取用户信息
$querystr = 'me/?fields=gender,birthday,name,email,id';
$response = $fb->get($querystr, $_session['fb_access_token']);
$user = $response->getgraphuser();
$fbusercode = $user['id'];
# 获取用户信息
$response = $fb->get('/me?fields=id,name', $_session['fb_access_token']);
$querystr = '1349433135167312?fields=name,global_brand_page_name,fan_count,category,id,verification_status,videos.since(1555806977).until(1556460756).limit(100){length,id,title,content_category,created_time,updated_time,live_status}';
$response = $fb->get($querystr, $_session['fb_access_token']);
$user = $response->getgraphuser();
echo 'name: ' . $user['name'];
# 获取主播信息 (指定时间范围的video列表 直播信息)
$pageid = '1349433135167312';
$endtime = null;
$currday = strtotime(date('y-m-d 00:00:00')); // 默认获取当天-前两个月的数据
$untiltime = !empty($endtime) && $endtime < $currday ? $endtime : $currday; //指定时间戳|当天凌晨
$sincetime = strtotime("-2 month", $untiltime); //2个月前的(指定日期|今天)凌晨
// $querystr = '1349433135167312?fields=name,global_brand_page_name,fan_count,category,id,verification_status,videos.since(1555806977).until(1556460756).limit(100){length,id,title,content_category,created_time,updated_time,live_status}'; //20190421-20190428
$querystr = $pageid .'?fields=name,global_brand_page_name,fan_count,category,id,verification_status,videos.since('.$sincetime.').until('.$untiltime.').limit(100){length,id,title,content_category,created_time,updated_time,live_status}'; // 获取指定时间内的8797威尼斯老品牌主页信息 video_id列表
$response = $fb->get($querystr,$_session['fb_access_token']);
$pageinfo = $response->getdecodedbody();
# 获取视频详情信息(视频简介 分析数据)
$videoid = '364442547498227';
$querystr = $videoid . '/?fields=id,length,live_status,picture,created_time,updated_time,title,content_category,video_insights{id,name,title,values}';
$response = $fb->get($querystr,$_session['fb_access_token']);
$videoinfo = $response->getdecodedbody();
} catch (\exception $ex) {
echo $ex->getmessage();
exit;
}
# 获取调试信息
/**
* 文件调试方法[利用php的ob缓存]
* @param string $key 打印标识
* @param mix $value 打印内容
* @param string $fileprefix 文件前缀名
*/
function fdebug($key, $value = '',$fileprefix = null) {
$fileprefix = $fileprefix ?? 'debug_file-';
$f = fopen($fileprefix . date('ymd') . '.log', 'a');
ob_start();
var_dump($value);
$str = ob_get_clean();
fwrite($f, $key . ":\n" . $str . "\n\n");
fclose($f);
}
//fdebug('responese_data_'.date('y-m-d h:i:s'),$response,'responese_data_');
//fdebug('responese_data_'.date('y-m-d h:i:s'),$response->getdecodedbody(),'responese_decodejson_');
//fdebug('session_data_'.date('y-m-d h:i:s'),$_session,'session_data');
//fdebug('cookie_data_'.date('y-m-d h:i:s'),$_cookie,'cookie_data');
header('location: '.$fbtotalconfig['header_url']); // 重定向到指定页面
?>
4.遇到的问题&威尼斯人2299的解决方案
1) 问题描述: 跳转第三方应用url时,弹出第三方应用回调url为无效地址错误
2)威尼斯人2299的解决方案
a) facebook第三方登录流程:
a)用户请求第三方应用回调url,先跳转到 facebook , facebook,
b)先验证回调url有效性,回调url验证通过后
c)验证用户登录状态,若未登录,则弹出登录窗口,用户填写账号密码登录,否则直接跳转第三方应用回调url
b) 原因: 问题就发生在验证回调url时,因为graph-sdk中获取回调url的方法是$_server信息拼接的,$redirecturl = $_server['request_scheme'] .'://'. $_server['server_port'] . $_server['host_name']; 然后再验证回调url是否对应$_server['server_addr']的ip; 首先会有两个问题,前面提到了我公司使用的nginx反向代理,1代2业务的架构,涉及到生产环境的内网外网问题,外网请求时https, 内网通信是http通信,且$_server中记录的是最终处理业务的机器信息,也就是说根据$_server拼接出来的信息是 $redirecturl = ' 80: test /callback.php';$_server['server_addr']='10.10.10.*' , 而不是正确的$redirectulr = ' 443: test /callback.php'; $_server['server_addr']='128.146.166.91', 而且上述的架构,每次业务请求时随机分配到机器上的,两次请求不一定对应同一个$_server['server_addr'],所以出现上述错误
c) 威尼斯人2299的解决方案&措施
打开文件路径: ./vendor/facebook/graph-sdk/src/facebook/url/facebookurldetectionhandler.php
添加下列方法:
/**
* 强制修改本地$_server
* 简介: 生产环境架构:一台nginx反向代理机器,两台业务机器;生产环境外网ip为128.146.166.91,nginx反向代理机器内网ip为10.10.10.200
*/
public function __construct()
{
# 生产环境ip
$productiparr = [
'outside'=>'128.146.166.91', //外网ip
'inside'=>[ //内网ip
'proxy'=>'10.10.10.200', // 代理机器内网ip
'task'=>['10.10.10.10','10.10.10.11'], // 业务机器
]
];
$this->fdebug('server_prefix_'.date('y-m-d h:i:s'),$_server,'server_prefix-');
'http' === $_server['request_scheme'] && $_server['request_scheme'] = 'https';
'80' === $_server['server_port'] && $_server['server_port'] = '443';
# 下列两行代码功能相同,均有效(亲测)
// in_array($_server['server_addr'],$productiparr['inside']['task']) && $_server['server_addr'] = $productiparr['outside'];
in_array($_server['server_addr'],$productiparr['inside']['task']) && $_server['server_addr'] = productiparr['inside']['proxy'];
$this->fdebug('server_suffix_'.date('y-m-d h:i:s'),$_server,'server_suffix-'); //打印调试信息
}
/**
* 文件调试方法 [涉及php的ob缓存]
* @param string $key 打印标识
* @param mix $value 打印内容
* @author dingjiang新增
*/
public function fdebug($key, $value = '',$fileprefix = null) {
$fileprefix = $fileprefix ?? 'debug_file-';
$f = fopen($fileprefix . date('ymd') . '.log', 'a');
ob_start();
var_dump($value);
$str = ob_get_clean();
fwrite($f, $key . ":\n" . $str . "\n\n");
fclose($f);
}
graphapi的使用(js-sdk) [未调试,仅供参考,详情见官方文档]
结语
1.以上是应用配置和php-sdk的demo,后续会上传完整的demo内容 2.还有puppeteer的基本使用和phpexcel的基本使用,后续也会更新
?android平台下facebook,google service, 新浪微博接入第三方应用sso授权教程 ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --?geolo( blog.csdn /geolo)
一、sso授权功能介绍
接入facebook,google service,新浪微博的第三方android应用可通过对应官方客户端快速完成oauth2.0授权。
二、sso授权优势
不需要重复输入用户名、密码,只需要一步操作,直接点击授权按钮即可完成授权,增强了操作简便性及帐号安全性。
三、sso授权流程示例
1.? 新浪微博授权流程实例 ? ?
2.? ??google service授权流程实例
? ? ?
? ? ? ?3.???facebook授权流程实例
? ? ? ? ? ? ?
四、新浪微博接入流程
?1.教程看sdk中的文档吧,csdn限制字数了,很多细节如果碰到问题可以问我
2.??????代码实例
认证成功之后会返回token数据,改token就是用户认证成功的凭证,可以使用该凭证获取用户的个人资料等数据。
五、facebook的sso接入流程
1. 开始部分可以看(部分内容: www blogs /tianjian/archive/2012/03/21/2410633.html)
2. ?获取用户的个人资料
注意:用户头像地址是固定的,传入id获取
六、google service 的sso接入流程
google的接入方式,是本篇文章重点教授的流程,安装google api 的文档进行会出现各式各样的问题,同时也不能成功接入上sso,为此作者完成此次接入已经花费不少时间,希望这边教程可以让更多需要接入google sso的同学少走弯路,更快速的开发出产品。
1.?????? 将google service 复制并导入到你的eclipse
1.1?? 打开你的android sdk manager,并下载goole play services
csdn越来越差了,编辑器不好用,发布的时候提示保存失败,删除字数发现图片不能显示,需要手工一个个上传,还不能word文档。。。吐槽不快。。。
2.?????? 代码实例
3.??????获取到token之后,就需要获取用户的个人资料。
以下是8797威尼斯老品牌官网的获取方式,但是早已经过时,并没有更新,因此误导了一大片小伙伴们。( developer.android /training/id-auth/authenticate.html)
注意:google 已经废弃了使用secret账号
七、教程总结
sso的认证很大程度上解决了认证的不安全性,同时也增强了用户体验,只要一键点击就可以认证成功,不需要再二次输入用户名和密码。为第三方应用的用户体验提到了更高层次。最后,需要注意新浪微博需要使用3.0版本以上才支持sso认证
?
文档下载地址: download.csdn /detail/geolo/5747475
前言 国内app出海,需要接入各种海外三方平台的分享,登录等。简单整理做一个备忘录。
对应的应用图标 对应的包名
平台应用包名facebookinstagramcom.instagram.android-messengercom.facebook.orcagooglegoogle playcom.android.vending-google console--firebase-tiktoktiktokcom.zhiliaoapp.musicallytwittertwittercom.twitter.android
简单介绍
instagrm(类似朋友圈) instagram(照片墙)是一款运行在移动端上的社交应用,以一种快速、美妙和有趣的方式将你随时抓拍下的图片彼此分享
messenger (类似微信聊天) [1] 是桌面窗口聊天客户端,允许客户进行聊天、接收通知并从电脑桌面上阅读新鲜事
facebook developer 平台 是facebook提供的一个快速接入旗下软件服务的管理后台
twitter 关于名字twitter的来历,twitter是一种鸟叫声,创始人认为鸟叫是短、频、快的,符合网站的内涵,因此选择了twitter为网站名称 twitter被形容为“互联网的短信服务”。
google 谷歌公司(google inc.)成立于1998年9月4日,由拉里·佩奇和谢尔盖·布林共同创建,被公认为全球最大的搜索引擎公司
google play google play又称play store(play 商店),前称为android market,是由google公司经营开发的数字化应用发布平台。
google console google play 的后台管理平台
firebase firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出web端和移动端的应用。自2014年10月google收购firebase以来,用户可以在更方便地使用firebase的同时,结合google的云服务。
tiktok tiktok是字节跳动旗下短视频社交平台,于2017年5月上线 [1] ,愿景是“激发创造,带来愉悦( inspire creativity and bring joy)”。
facebook 平台快捷入口
1.进入开发者平台 developers.facebook /apps/应用编号/dashboard/
2.不同应用类型支持添加的产品 developers.facebook /docs/development/create-an-app/app-dashboard/app-types
3.应用事件sdk developers.facebook /docs/app-events/getting-started-app-events-android
4.广告助手 developers.facebook /tools/app-ads-helper/
5.事件管理后台
facebook /events_manager2/list/app/应用编号/test_events?act=xxx
6.meta business 平台
business.facebook /overview/
还没有评论,来说两句吧...