关于我的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-对第二节的代 ...
随机推荐
- Android常用的物理按键及其触发事件
Activity和View都能接收触摸和按键,如果响应事件只需要在继承类里复写事件函数即可:当一个视图(如一个按钮)被触摸时,该对象上的 onTouchEvent() 方法会被调用.不过,为了侦听这个 ...
- Java内部类实现伪方法级多线程
最近碰到一个问题,就是用户在填写相关信息提交后,后台需要将一些文件同步到另外一台服务器,而这个时候,由于用的是spring的框架,导致前端页面需要等待文件同步完成,才能弹出提示信息.相信大家在很多时候 ...
- android PreferenceScreen使用笔记
preference.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen ...
- linux boost 安装
sudo apt-get install libboost-dev 但是,我这样安装以后,编译程序时出现了很多错误,而且都是系统文件的错误.我开始以为是我的boost库版本不对,后来换了好几个版本,都 ...
- yii 删除内容时增加ajax提示
环境 : 后台有新闻分类和新闻的文章,在分类下有文章存在的时候,不想用户删除分类 代码 controller public function actionDelete($id) { $data = C ...
- https加密
对称加密 客户端和服务器使用同一把钥匙,加密算法公开 非对称加密 不同钥匙,公钥加密的私钥可以打开 私钥加密的公钥可以打开 HTTPS关键: 1. 要传输的业务数据,使用对称加密. 客户端生成私钥 ...
- 使用shiro标签遇到的部分问题的解决思路
最近几天,在shiro进行系统权限控制.在处理JSP页面的时候,遇到几个问题,纠结好几天,终于成功解决这些问题. 1.使用<shiro:principal>的时候,如何得到整个类的信息? ...
- 自定义异常throw
简单自定义一个年龄小于等于0,或者大于120会出现的异常 首先继承父类Exception,调用父类的构造器,这样才可以报出自己想要的异常 public class AgeException exten ...
- 转自:http://blog.sina.com.cn/s/blog_86e874d30101e3d8.html(谢谢原文作者),Win7下安装CentOS 6.5双系统
经过一下午的折腾,终于在64位的Windows 7上面成功安装了CentOS 6.5(64bit)系统,中途因为硬盘分区的问题失败了一次.下面是安装过程: 在安装过程中借助了这篇文章的内容:http: ...
- 不在界面上用控件 动态创建idhttp,IdAntiFreeze来用
不在界面上用控件 动态创建idhttp,IdAntiFreeze来用 var IdHTTP: Tidhttp; IdAntiFreeze: TidAntiFreeze; begin IdAntiFre ...