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

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

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

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

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

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

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

<?php
include_once "templates/base.php";
session_start(); require_once realpath(dirname(__FILE__) . '/../autoload.php'); /************************************************
ATTENTION: Fill in these values! Make sure
the redirect URI is to this page, e.g:
http://localhost:8080/user-example.php
************************************************/
$client_id = '<YOUR_CLIENT_ID>';
$client_secret = '<YOUR_CLIENT_SECRET>';
$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是什么呢?是当用户认证登陆之后重定向的那个网页,也就是你的工作网页啊!

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

/************************************************
Make an API request on behalf of a user. In
this case we need to have a valid OAuth 2.0
token for the user, so we need to send them
through a login flow. To do this we need some
information from our API console project.
************************************************/
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$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”喽。

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

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

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

/************************************************
If we have a code back from the OAuth 2.0 flow,
we need to exchange that with the authenticate()
function. We store the resultant access token
bundle in the session, and redirect to ourself.
************************************************/
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
} /************************************************
If we have an access token, we can make
requests, else we generate an authentication URL.
************************************************/
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
} else {
$authUrl = $client->createAuthUrl();
} /************************************************
If we're signed in and have a request to shorten
a URL, then we create a new URL object, set the
unshortened URL, and call the 'insert' method on
the 'url' resource. Note that we re-store the
access_token bundle, just in case anything
changed during the request - the main thing that
might happen here is the access token itself is
refreshed if the application has offline access.
************************************************/
if ($client->getAccessToken() && isset($_GET['url'])) {
$url = new Google_Service_Urlshortener_Url();
$url->longUrl = $_GET['url'];
$short = $service->url->insert($url);
$_SESSION['access_token'] = $client->getAccessToken();
} echo pageHeader("User Query - URL Shortener");
if (
$client_id == '<YOUR_CLIENT_ID>'
|| $client_secret == '<YOUR_CLIENT_SECRET>'
|| $redirect_uri == '<YOUR_REDIRECT_URI>') {
echo missingClientSecretsWarning();
}

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

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

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

嘿嘿……吓尿了吧。

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

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

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

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

我们看最后一段代码:

<div class="box">
<div class="request">
<?php
if (isset($authUrl)) {
echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
} else {
echo <<<END
<form id="url" method="GET" action="{$_SERVER['PHP_SELF']}">
<input name="url" class="url" type="text">
<input type="submit" value="Shorten">
</form>
<a class='logout' href='?logout'>Logout</a>
END;
}
?>
</div> <div class="shortened">
<?php
if (isset($short)) {
var_dump($short);
}
?>
</div>
</div>
<?php
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. RMAN-00554: initialization of internal recovery manager package failed RMAN-04005

    [oracle@rac11g1 ~]$ rman target haha/haha@rac11g Recovery Manager: Release 11.2.0.3.0 - Production o ...

  2. VS2008 动态库和静态库的生成和加载

    第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\V ...

  3. Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码--转载

    在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码——使用 Apache Byte Code Engineering Library (BC ...

  4. Servlet的PrintWriter out = response.getWriter()使用

    一直以来,只知道out可以向客户端浏览器页面输入数据(html.txt等类型),今天在和php程序联调时发现自己的理解出现了偏差. out是输出字符流,即servlet接受到request请求后,se ...

  5. Java基础知识强化97:final、finally、finally区别

    1. final修饰符(关键字)     如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此,一个类不能既被声明为abstract,又被声明为final.     将 ...

  6. Blade和其他构建工具有什么不同

    大部分人都至少接触过不止一种构建工具,比如make,autotools.而我们开发了Blade,为什么那么多现成的工具不用,而又再造了一个轮子,相对于传统的make等工具,Blade的好处在又哪里呢? ...

  7. 画年利率 画图 自定义 View

    使用 SlbSyView slbView; slbView = (SlbSyView) findViewById(R.id.slbView); slbView.setHeights(new float ...

  8. 阿里巴巴iconfont使用方式

    IconFont的作用就是用字体的格式来取代图片.特殊字体的展示,用得比较多的就是一些纯色的图标,具体主要由当前css3属性里的自定义字体(@font-face)来实现. 1.首先在Iconfont- ...

  9. Flash与DIV的层叠顺序问题

    很多人在写页面代码时都会遇到过这样一个问题,那就是当Flash与页面中的其它HTML结构有重叠的时候,默认情况下Flash总是显示在最上 面,从而遮挡住了与它有重叠部分的HTML结构,就算为该Flas ...

  10. nosqlunit开源框架

    import com.lordofthejars.nosqlunit.annotation.UsingDataSet;import com.lordofthejars.nosqlunit.core.L ...