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

(阅读以下全文之前请先搞定翻^#$%@#墙这件事。昨天看了一个笑话说墙之父方校长说自己有六个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. SKAction类

    继承自 NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framewo ...

  2. [置顶] 【SQL】查询重复人名的次数并列出

    select count(姓名) as 重复次数,姓名from 某表 group by 姓名order by 重复次数 asc 首先,group by 姓名,可以将所有相同姓名的项集合在一起.然后,c ...

  3. Php面向对象 – 单例模式

    Php面向对象 – 单例模式 保证类仅仅有一个实例 1.    怎样能够解决一个类能够被无限地实例化? New,就能实例化一次,怎么去限制,用户不能无限次地new? 将构造方法私有化.全部外部的new ...

  4. TinyXml快速入门(一)

    对于xml文件,目前的工作只是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这种重量级的xml解析器,特别是使用msxml解析xml涉及到复杂的com类型转换,更是令人感觉繁琐. ...

  5. hdu_1875_畅通工程再续 prim和kruskal

    这个题是个典型的最小生成树的题目,但是刚开始怎么都过不了,后来发现两种写法都有疏忽,但是prim的到目前为止不懂为什么刚开始的不对,kruskal算法,并查集的初始条件从0开始写成从1开始了,所以已知 ...

  6. js进制转换

    var n = 17; var n2 = n.toString(2); var n8 = "0" + n.toString(8); var n16 = "0x" ...

  7. 软键盘 输入法管理器 InputMethodManager

     基本介绍 软键盘的显示原理 软键盘其实是一个Dialog.InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示.当我们点击输 ...

  8. C#中的序列化与反序列化

    眼看XX鸟的课程关于C#的知识点就要学完了,翻看网络中流传的教程还是发现了一个课程中没有讲到的知识点:序列化与反序列化 无奈还是了解一下并操作一番,以备后用吧 介绍:就是将对象信息转化为二进制信息以便 ...

  9. linux下查看所有用户及所有用户组

    groups 查看当前登录用户的组内成员groups gliethttp 查看gliethttp用户所在的组,以及组内成员whoami 查看当前登录用户名 /etc/group文件包含所有组/etc/ ...

  10. Shell中IFS用法

    一 .IFS的介绍    Shell 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored ...