之前谈的两篇《Authentication和Authrization(上)、(下)》以空谈为主,算是一个开头,原文最后有说要一一整些实现出来的。那么现在就开始吧,不过介绍的顺序则先从相对简单的OAuth 2.0开始。

foursquare 第一版的API是基于BasicAuth的,也就是基于HTTP Authentication的一种基本验证方式,这种方式的优点是非常简单,只要在HTTP Header里加一个字段就行了,但缺点是用户名密码会被直接暴露在传输过程中,虽然经过了Base64编码,但是解码它是一件非常容易的事情,除非使用 HTTPS,否则是非常不安全的。

之前因为我用的手机是智障机,跑不了官方客户端,官方网页端又被墙,用起来很不方便,所以自己参考了dabr的代码,用PHP4写过一个网页客户端程序。

不 过后来foursquare出于安全和功能考虑,完全抛弃了第一版的API,推出了全新的第二版API。这个版本的特点是:完全重新设计了API的架构, 更加符合REST规范,特别是身份验证改用了更安全的OAuth 2.0,并且使用了HTTPS。到今年8月1号的时候,foursquare关闭了对第一版API的支持,全面转到第二版API。为了让我的程序能够继续 使用,我不得不赶在这一转换之前几天,把程序完全改写了——顺便增加了一些功能。

当然,本文不打算详细讨论foursquare的API,只谈谈登录的部分。

根据foursquare的Authentication文档说明,全部的过程可以分为三大步:

1、在foursquare注册一个应用,取得一个client_id;

2、通过OAuth 2.0验证,取得access_token;

3、使用access_token调用foursquare API。

其中第一步没什么好说的,照着说明去做就是了,这里要从技术上讨论的主要是第二步,并且需要用第三步来验证第二步的结果。

单就第二步取得access_token来说,也可以分为以下步骤:

1、 先转向到foursquare的授权页面,并提交client_id和redirect_uri(其它参数见文档或代码)。redirect_uri为验 证通过后的回调链接,即在注册应用时提供的那个回调链接,通常二者需要保持一致,不过只要client_secret保管好,即使这里允许不一致(说明: 我倒没试过不一致会如何)也不会导致client_id被盗用;

2、foursquare收到请求后根据以下情况作出判断:如果你还未登录foursquare,则提示你登录;如果你已经登录,但未授权此应用,则提示你是否要授权;如果已经授权,则重向到redirect_uri,并同时提交一个code;

3、 应用收到转来的请求后就可以向foursquare请求获取access_token了,请求参数包括 client_id,client_secret(相当于应用密码,这个一定要保管好),code等(其它参数见文档或代码),只要这个code没错,就 可以取得access_token。

之后就可以用这个access_token去调用foursquare API了。

需要注意的是:这个access_token是一个用户对一个应用授权的唯一标识,一定要保管好,不可泄露。当然,如果万一泄露,应用的开发者应该及时到foursquare的应用管理页面重新生成client_id/client_secret。

具体的登录代码如下:

function login_foursquare() {session_start();$GLOBALS['user']['type'] = 'oauth';$oauth_code = $_GET['code'];if (isset($oauth_code)) { // 来自foursquare的回调请求含有code参数$params = array('client_id'     => OAUTH2_CLIENT_ID,'client_secret' => OAUTH2_CLIENT_SECRET,'grant_type'    => 'authorization_code','redirect_uri'  => CALLBACK_URL,'code'          => $oauth_code);$result = do_sf_process(SF_OAUTH2.'access_token?'.http_build_query($params)); // 向foursquare请求access_token$access_token = $result->access_token;$redir = $_SESSION['redir'];unset($_SESSION['redir']);$GLOBALS['user']['password'] = $access_token;sf_user_info();_user_save_cookie(1);header('Location: '. $redir);exit();} else { // 来自用户的登录访问,不含code参数_user_decrypt_cookie($_COOKIE['USER_AUTH']);$redir = isset($_GET['redir']) ? $_GET['redir'] : $_SERVER['HTTP_REFERER'];$_SESSION['redir'] = $redir;$authorise_url = SF_OAUTH2.'authenticate?'.http_build_query(array(  'client_id'     => OAUTH2_CLIENT_ID,'response_type' => 'code','redirect_uri'  => CALLBACK_URL));header("Location: $authorise_url"); //  重定向到foursquare的授权页面}
}

至于取得access_token以后的API调用,所要做的事情就只是把access_token附加到每次调用的参数里即可。

function user_oauth_sign(&$url, &$args) {$method = $args !== false ? 'POST' : 'GET';if (preg_match_all('#[?&]([^=]+)=([^&]+)#', $url, $matches, PREG_SET_ORDER)) {foreach ($matches as $match) {$args[$match[1]] = $match[2];}$url = substr($url, 0, strpos($url, '?'));}$args['oauth_token'] = $GLOBALS['user']['password'];if ($method == 'GET'){$url  = $url."?".http_build_query($args);$args = false;}
}function sf_process($url, $post_data = false) {if (user_type() == 'oauth' && (strpos($url, SF_API) !== false)) {user_oauth_sign($url, $post_data);}$result = do_sf_process($url, $post_data);return $result->response;
}

整个客户端代码下载在Google Code。

推送到[go4pro.org]

OAuth2.0实践之foursquare客户端登录相关推荐

  1. OAuth1.0实践之foursquare客户端同步到饭否

    上回说完了<OAuth2.0实践之foursquare客户端登录>这回还是要回来说OAuth1.0. 还是我写的那个foursquare的web客户端程序.其中加上了同步到饭否的功能,原来 ...

  2. OAuth2.0授权协议与客户端授权码模式详解

    本文来重点讲解下OAuth2.0授权协议与客户端授权码模式 文章目录 什么是OAuth协议 交互过程 客户端授权模式 授权码模式 简化模式 密码模式 客户端模式 接入公司内部系统 后台管理系统 前台业 ...

  3. SpringBoot OAuth2.0 使用短信验证码登录授权

    SpringBoot OAuth2.0 使用短信验证码登录授权 实现步骤: 自定义授权器,继承 AbstractTokenGranter 类: 重写 getOAuth2Authentication 函 ...

  4. OAuth2.0 原理流程及其单点登录和权限控制

    作者:王克锋 kefeng.wang/2018/04/06/oauth2-sso 单点登录是多域名企业站点流行的登录方式.本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理 ...

  5. Spring Boot + OAuth2.0 实现微信扫码登录,这才叫优雅

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc ...

  6. Spring Boot + OAuth2.0 实现微信扫码登录,这才叫优雅!!

    微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_ ...

  7. 认证服务---OAuth2.0基本介绍,微博登录测试【上篇】

    前言 比如说你要使用一个从来未注册过的软件,一般来讲你需要先注册成为这个软件的用户,然后登录后才可以使用该软件.但是为了方便起见,现在的大部分软件会允许你第三方登录.比如说.你可以通过微信.微博.QQ ...

  8. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  9. Oauth2.0的使用QQ互联登录

    1.根据appid拼接授权链接 参数 是否必须 含义 response_type 必须 授权类型,此值固定为"code". client_id 必须 申请QQ登录成功后,分配给应用 ...

最新文章

  1. 编程难学?3点解答你的疑惑
  2. 大学录取通知书也越来越科技范儿
  3. python 基础命令-Python unittest第一篇:基础入门+命令行编译
  4. IO流之过滤流介绍:
  5. 开源的ResearchKit:苹果将如何颠覆未来医疗?
  6. 160个Crackme026之六段式注册码详解
  7. 【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍
  8. spring 注入bean的两种方式
  9. localStorage.getItem 往浏览器里面储存数据到本地localStorage
  10. [转载] 【Python】Python3 字典 fromkeys()方法
  11. String和StringBuffer、StringBuilder的区别
  12. Spring学习笔记(三十六)——SpringBoot 实现大文件分片上传、断点续传及秒传
  13. PIN/PAD Design in SoC - 1 (待续)
  14. 《腾讯传》四、从寄生虫到蜕变上市—企鹅的成人礼
  15. php 在文本域中添加qq表情 createelement,仿微信在对话框文字中插入Emoji表情包
  16. [数论] EXBSGS(拔山盖世算法)
  17. Synopsys全系列工具简介
  18. SpringMVC04:数据处理及跳转
  19. 架构 对话架构师:亿级短视频社交美拍架构实战
  20. rapidxml操作XML

热门文章

  1. keycloak项目代码
  2. 16个很好的在线教育网站
  3. 某金融机构分布式数据库架构方案与运维方案设计分享
  4. CloudCompare 插件调试
  5. 中专计算机技术自我鉴定,中专计算机毕业自我鉴定
  6. QQ群成员提取器, 也可以关键字搜索群
  7. 使用管道流压缩和 解压缩文件
  8. 求解非约束优化问题的拟牛顿方法(BFGS、DFP)
  9. Promise原理浅析
  10. word中只能输入英文,不能切换中文