这个名字估计很冷门,估计不会有人看到吧,我猜测的。

(阅读以下全文之前请先搞定翻^#$%@#墙这件事。昨天看了一个笑话说墙之父方校长说自己有六个VPN账号,只是为了测试自己的墙好用还是VPN好用。哈哈,方校长是好人,下令造墙的是sb。)

事情是这样的,软件工程课需要写一个登录到谷歌日历上去添加时间的应用。好的,我们首先要搞定谷歌授权,但是一开始我太navie了,认为我们可以简简单单的写一个登陆界面然后得到账号和密码的数据再送到一个谷歌的登陆接口就可以简单地登录到谷歌上啦!

说什么来着,还是太navie……谷歌是不会把自己的用户数据简简单单地就被第三方插件使用的。

那么下面就来到了授权认证这个环节。(PHP版本,其余的都类似)

下面是几个谷歌自己为开发者写的英文的文档大家可以看看:(反正我是没看懂)就在我一个头两个大的时候,我突然发现PHP库里有一个叫做“example”的文件夹!嗯good,这就是这个库的作者自己写的实例啊!千万不能够辜负,打开看看先:

里面对我们有用的文件叫做“usr-example.php”,里面讲得很清楚,我们借用这个文件的顺序来讲解一下我是怎么实现登陆的。

  1. <?php
  1. include_once "templates/base.php";
  2. session_start();
  3.  
  4. require_once realpath(dirname(__FILE__) . '/../autoload.php');
  5.  
  6. /************************************************
  7. ATTENTION: Fill in these values! Make sure
  8. the redirect URI is to this page, e.g:
  9. http://localhost:8080/user-example.php
  10. ************************************************/
  11. $client_id = '<YOUR_CLIENT_ID>';
  12. $client_secret = '<YOUR_CLIENT_SECRET>';
  13. $redirect_uri = '<YOUR_REDIRECT_URI>';

先说这一部分吧,要开发一个Google的应用,需要一个谷歌账号,然后去申请一个谷歌应用,地址在这里。

https://console.developers.google.com/project

在这里先创建一个Project,“Create Project”,然后改填啥填啥就行了。创建完之后,需要到左边去打开几个东西:

看到这个没?先去APIs那里打开你要使用的API……我就打开了Calendar的API,为啥是Calendar?因为我们的组名就是这个啊!(F**K Google Calendar啊!)

然后去Consent screen进行一下编辑,这个界面是当谷歌询问用户是否允许你这个应用来更改他的个人信息是显示给客户的,尽量好看一点点吧。

最后去Credentials里面去Create这个……Client Key。以下这几个是重点的东西啊!(见代码)

client id     client secret     redirect  uri

这几个要填写在代码里的东西都要放在这里的!(前两个不用讲,都很简单啦,是你的应用的id的密钥吧类似。然后redirect uri是什么呢?是当用户认证登陆之后重定向的那个网页,也就是你的工作网页啊!

把这个设定好之后我们看后面的代码:

  1. /************************************************
  2. Make an API request on behalf of a user. In
  3. this case we need to have a valid OAuth 2.0
  4. token for the user, so we need to send them
  5. through a login flow. To do this we need some
  6. information from our API console project.
  7. ************************************************/
  8. $client = new Google_Client();
  9. $client->setClientId($client_id);
  10. $client->setClientSecret($client_secret);
  11. $client->setRedirectUri($redirect_uri);
  12. $client->addScope(https://www.googleapis.com/auth/urlshortener);

这一部分代码(当然我把原作者的注释留下来了,大家也可以看看昂么么哒)

首先,new一个 Google_Client()出来,这个东西是谷歌用户端的类,原文照抄设置id,设置secret,设置redirect uri等等,然后注意最后一步:

https://www.googleapis.com/auth/urlshortener这个东西,整理有一个部分是要改成你要接入的api的名字的,就是那个“urlshortener”改成“Calendar”的,当然如果你要开发地图的应用的话,就是“map”喽。

  1. /************************************************
  2. When we create the service here, we pass the
  3. client to it. The client then queries the service
  4. for the required scopes, and uses that when
  5. generating the authentication URL later.
  6. ************************************************/
  7. $service = new Google_Service_Urlshortener($client);
  8.  
  9. /************************************************
  10. If we're logging out we just need to clear our
  11. local access token in this case
  12. ************************************************/
  13. if (isset($_REQUEST['logout'])) {
  14. unset($_SESSION['access_token']);
  15. }

然后是这部分啦:service类这个是每一次调用客户端程序时可以调用的服务,这个借口也将从这里实现。

后面那部分是关于logout的,抄上就行

  1. /************************************************
  2. If we have a code back from the OAuth 2.0 flow,
  3. we need to exchange that with the authenticate()
  4. function. We store the resultant access token
  5. bundle in the session, and redirect to ourself.
  6. ************************************************/
  7. if (isset($_GET['code'])) {
  8. $client->authenticate($_GET['code']);
  9. $_SESSION['access_token'] = $client->getAccessToken();
  10. $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  11. header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
  12. }
  13.  
  14. /************************************************
  15. If we have an access token, we can make
  16. requests, else we generate an authentication URL.
  17. ************************************************/
  18. if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  19. $client->setAccessToken($_SESSION['access_token']);
  20. } else {
  21. $authUrl = $client->createAuthUrl();
  22. }
  23.  
  24. /************************************************
  25. If we're signed in and have a request to shorten
  26. a URL, then we create a new URL object, set the
  27. unshortened URL, and call the 'insert' method on
  28. the 'url' resource. Note that we re-store the
  29. access_token bundle, just in case anything
  30. changed during the request - the main thing that
  31. might happen here is the access token itself is
  32. refreshed if the application has offline access.
  33. ************************************************/
  34. if ($client->getAccessToken() && isset($_GET['url'])) {
  35. $url = new Google_Service_Urlshortener_Url();
  36. $url->longUrl = $_GET['url'];
  37. $short = $service->url->insert($url);
  38. $_SESSION['access_token'] = $client->getAccessToken();
  39. }
  40.  
  41. echo pageHeader("User Query - URL Shortener");
  42. if (
  43. $client_id == '<YOUR_CLIENT_ID>'
  44. || $client_secret == '<YOUR_CLIENT_SECRET>'
  45. || $redirect_uri == '<YOUR_REDIRECT_URI>') {
  46. echo missingClientSecretsWarning();
  47. }

这一部分的内容就比较多啦:

在讲解这部分代码之前呢,我们先来看看这个图:

看这个图!首先,你的APP会发送Request的token(音:头肯。意思是令牌)到谷歌的服务器,然后用户自己来登陆,同意服务。然后服务器会发送认证code回来。接收到这个code后,你的代码会把这个code换成头肯,再发送回去,谷歌服务器再返回来这个头肯的response,这时你的app就可以用这个返回的头肯来对用户的数据进行一番读写啦!

嘿嘿……吓尿了吧。

其实没有那么麻烦,看代码:

第一段就是get这个code的,然后发回去认证,下面这个redirect变量是干啥用的我还没搞明白,最后这个header函数的意思是把这个当成HTTP文件的报头。(什么是报头?别管了!)

然后!第二段,先看看有没有头肯了,有了就去get那个access头肯,没有的话用户去登录。

最后一个是本库的作者留的帮助啦,他会告诉你如果你的id secret和redirect uri还没有改的话就去这个地方去设置一下,改一下不拉不拉的。恩。

我们看最后一段代码:

  1. <div class="box">
  2. <div class="request">
  3. <?php
  4. if (isset($authUrl)) {
  5. echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
  6. } else {
  7. echo <<<END
  8. <form id="url" method="GET" action="{$_SERVER['PHP_SELF']}">
  9. <input name="url" class="url" type="text">
  10. <input type="submit" value="Shorten">
  11. </form>
  12. <a class='logout' href='?logout'>Logout</a>
  13. END;
  14. }
  15. ?>
  16. </div>
  17.  
  18. <div class="shortened">
  19. <?php
  20. if (isset($short)) {
  21. var_dump($short);
  22. }
  23. ?>
  24. </div>
  25. </div>
  26. <?php
  27. echo pageFooter(__FILE__);

这个是最后的代码,其中几个函数都是在”base.php”这个文件里定义的。

ok,大功告成,运行一下这个就能看到“Connect Me”然后就能看到你刚刚设置的啦consent screen啦!

关于我的FGC的OAuth2.0认证。的更多相关文章

  1. .Net WebApi 实现OAuth2.0认证

    现在多数公众平台提供的api都使用OAuth2.0认证模式,最近在搞Android方面的开发,身份认证和权限控制的各方面比较来说,使用OAuth认证的还是比较靠谱,OAuth2.0的协议可以参考htt ...

  2. Owin中间件搭建OAuth2.0认证授权服务体会

    继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...

  3. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  4. C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决

            近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...

  5. OAuth2.0认证介绍

    OAuth2.0鉴权 返回 目录 [隐藏] 1 腾讯微博OAuth2.0认证介绍 2 获取accesstoken的两种方式 2.1 1.Authorization code grant 2.1.1 第 ...

  6. OAuth2.0认证详解

    目录 什么是OAuth协议 OAuth2.0是为了解决什么问题? OAuth2.0成员和授权基本流程 OAuth2.0成员 OAuth2.0基本流程 什么是OAuth协议 OAuth 协议为用户资源的 ...

  7. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  8. Oauth2.0 认证的Web api例子

    Oauth2.0的解释 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容.OA ...

  9. QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录

    ---------------------------------目录------------------------------------- QQ登录整合/oauth2.0认证-03-对第二节的代 ...

随机推荐

  1. 573 The Snail(蜗牛)

      The Snail  A snail is at the bottom of a 6-foot well and wants to climb to the top. The snail can ...

  2. VelocityTracker简单介绍

    翻译自:http://developer.android.com/reference/android/view/VelocityTracker.html 參照自: http://blog.jrj.co ...

  3. Android app内语言环境切换

    逻辑很简单: 1  app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创 ...

  4. Android TabActivity之感叹

    (一)前言 在以前一篇帖子讲ams的时候,提了一下TabActivity.当时说它比较特殊就没有下文了,今天重发一篇帖子,跟大家探讨一下TabActivity. 做个假定先: 比如我们最外面的Acti ...

  5. wpf异常:指定的 Visual 不是此 Visual 的上级问题处理解析

    WPF在画线的时候,调用Control0.TransformToAncestor(Control1).Transform(new System.Windows.Point(0, 0))方法转换坐标的时 ...

  6. Android自定义属性、控件三步法

    第二步中layout-activity_main.xml 中自命名控件: xmlns:android="http://schemas.android.com/apk/res/android& ...

  7. CentOS6.3 Firefox安装FlashPlayer

    这段时间搞搞CentOS,我自己用的版本是CentOS6.3,基本上都差不多,过程都一样,主要说一下步骤 1.从Adoble官网下载FlashPlayer插件,下载地址:http://get.adob ...

  8. SOA

    面向服务架构Service-Oriented Architecture 4个特性 1每个服务具有明确的边界 2服务是独立的 3采用标准的契约定义和通信协议 4服务是自解释的

  9. apache添加php支持

    在php编译安装好后,需要在apache中添加对php的支持,方法:找到“#AddType application/x-gzip .gz .tgz”并在后面加入AddType application/ ...

  10. 洛谷 P1305 新二叉树

    P1305 新二叉树 题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...