关于我的FGC的OAuth2.0认证。
这个名字估计很冷门,估计不会有人看到吧,我猜测的。
(阅读以下全文之前请先搞定翻^#$%@#墙这件事。昨天看了一个笑话说墙之父方校长说自己有六个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认证。的更多相关文章
- .Net WebApi 实现OAuth2.0认证
现在多数公众平台提供的api都使用OAuth2.0认证模式,最近在搞Android方面的开发,身份认证和权限控制的各方面比较来说,使用OAuth认证的还是比较靠谱,OAuth2.0的协议可以参考htt ...
- Owin中间件搭建OAuth2.0认证授权服务体会
继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...
- 使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决
近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...
- OAuth2.0认证介绍
OAuth2.0鉴权 返回 目录 [隐藏] 1 腾讯微博OAuth2.0认证介绍 2 获取accesstoken的两种方式 2.1 1.Authorization code grant 2.1.1 第 ...
- OAuth2.0认证详解
目录 什么是OAuth协议 OAuth2.0是为了解决什么问题? OAuth2.0成员和授权基本流程 OAuth2.0成员 OAuth2.0基本流程 什么是OAuth协议 OAuth 协议为用户资源的 ...
- Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...
- Oauth2.0 认证的Web api例子
Oauth2.0的解释 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容.OA ...
- QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录
---------------------------------目录------------------------------------- QQ登录整合/oauth2.0认证-03-对第二节的代 ...
随机推荐
- Robotium--通过Id寻找控件
在自动化测试中,UI上经常有一些控件是没有名称的,那么此时,就可以通过id来找到这些控件. 案例:对两个EditText进行测试 package com.tangbc.tedit.test; impo ...
- 再探java基础——零碎基础知识整理
1.java是解释型语言.java虚拟机能实现一次编译多次运行. 2.JDK(java software Development kit 软件开发包),JRE(java Runtime Environ ...
- XTU1199:Number Game
题目描写叙述 给你一个有N个数的集合S和一个数X,推断是否存在S的一个子集,子集里的数的最小公倍数正好是X. 输入 第一行是数据组数T. 接下来有多组数据,每组数据包括两行: 第一行有2个数N和X,1 ...
- JDK动态代理实现简单AOP--转
JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...
- [转] When exactly does the virtual table pointer (in C++) gets set for an object?
PS: http://stackoverflow.com/questions/7934540/when-exactly-does-the-virtual-table-pointer-in-c-gets ...
- eclipse中svn版本不兼容问题
eclipse中导入本地svn管理的Android项目 使用svn时弹出以下提示: org.apache.subversion.javahl.ClientException: Unsupported ...
- Java多线程——线程池
系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...
- c#将Excel数据导入到数据库的实现代码(转载)
假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码如下: using System; using System.Collections.Generic ...
- DHCP租约时间工作原理
问题: 很多用户在使用路由器的DHCP服务器过程中都有一个疑问,DHCP有个设置项目是设置DHCP地址的租约时间,如果设置的比较短,是否会出现租约时间到了以后会重新去获取ip地址,造成用户断网? ...
- shell 中 2>&1 的使用
一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ...