谈谈自己对于Auth2.0的见解
Auth的原理网上有很多,我这里就不在赘述了。
这里有张时序图我个人觉得是比较合理而且直观的,(感谢这篇博文:http://justcoding.iteye.com/blog/1950270)
参照这个流程,模拟了下部分代码,当然是尽可能的以简单的形式去表达下自己的见解
模拟了配置文件去掉数据库处理的部分
config.php 定义了公司及对应的操作用户的权限
<?php
return array(
'app'=>array(
'a1'=>array(
'accesskey'=>'123456',//凭证
'type'=>0,//聚合这里规定type对应的请求权限
'appname'=>'gavinjun',
),
),
'type'=>array(
array(
'获取用户的信息','获取用户的金钱',
),
),
);
user_config.php 用户表的模拟
<?php
return array(
'admin'=>'123456',
);
<?php //权限2.0的主程
class Auto{
private $vession=2.0;
private $notic=null;
public function __construct(){
$notic = require 'config.php';
$this->notic = $notic;
}
//校验商户
public function check($_param=array()){
if(empty($_param)){
return false;
}
//获取传过来的accesskey appid
$appid = !empty($_param['appid'])?$_param['appid']:0;
$accesskey=!empty($_param['accesskey'])?$_param['accesskey']:'';
if(!$appid||!$accesskey)
return false;
//校验开始
$notic = $this->notic;
return $notic['app'][$appid]?$notic['app'][$appid]['accesskey']==$accesskey:false;
}
//用户发起登录请求
public function getLoginCallBack($_param){
if($this->check($_param)){
//校验通过返回临时的token 以下都是不安全的方式只是模拟auto的流程
//这里可以用加密 请求时间|请求完成后跳转地址|用户的md5(accesskey)
return time().'|'.$_param['redirect'].'|'.md5($_param['accesskey']).'|'.$_param['appid'];
}else{
echo '商户未注册';
return false;
}
} //用户输入完用户名和密码之后
public function inLogin($name,$pwd){
$user = require("user_config.php");
return $user[$name]?$user[$name]==$pwd:false;
}
//用户登录完成后带着token值来请求我们的令牌
public function getAceess($_param){
$token = $_param['access_token'];
if(!$token)
return false;
list($time,$redirect,$authkey,$appid) = explode('|',$token);
//请求$appid 获取他的accesskey
$notic = $this->notic;
$accesskey = $notic['app'][$appid]['accesskey'];
if(time()>$time+5*60){
//超过5分钟才请求默认失败
return false;
}
if(md5($accesskey)!=$authkey){
//链接不安全
return false;
}
//返回正式的key
//这个key可以保存在数据库中设置这个key的失效时间 //我这里随便固定了他的accesskey
//给跳转的页面发送一个key 用post的应该,不过模拟就算了
$access = 'success';
return $redirect.'?access='.$access;
} public function doSomeByaccess($access){
//和数据库中做比对 这里不写了,就全部默认成功
if($access){
$appid = 'a1';
}
$notic = $this->notic;
$type = $notic['app'][$appid]['type'];
foreach($notic['type'][$type] as $v){
echo '用户权限:'.$v.'<br>';
} }
}
这里是模拟下这段程序的流程
<?php
//模拟流程
require 'auth2.php';
$auth2= new Auto(); //step 1: 用户点击平台上的登录按钮
//该商户的信息 appid=a1,accesskey=123456
$step1=$auth2->getLoginCallBack(array('appid'=>'a1','accesskey'=>'123456','redirect'=>'http://www.baidu.com'));
//系统内部跳转到登录界面拿到临时token 让用户去登录授权
$access_token = $step1;
/**系统内部的处理流程***/
//系统跳到登录地址?access_token=$step1 用户输入用户名和密码
//模拟用户授权
if($auth2->inLogin('admin','123456')){
//用户同意登录返回了一个令牌$access_token是用户登录请求的时候带上的
$arr['access_token']=$access_token;
$url = $auth2->getAceess($arr);
//这个url会发送给平台,平台拿到这个 令牌可以去访问用户信息
echo $url;
}
/****系统内部处理结束跳转到用户平台地址,发送post信息****/
//假设平台接到这个信息他保存下来了这个accesskey,去读取一遍用户的信息
$url = parse_url($url);
list($access,$accesskey)=explode('=',$url['query']);
$auth2->doSomeByaccess($accesskey);
结果:
aaarticlea/png;base64,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" alt="" />
谈谈自己对于Auth2.0的见解的更多相关文章
- 谈谈基于OAuth 2.0的第三方认证 [下篇]
从安全的角度来讲,<中篇>介绍的Implicit类型的Authorization Grant存在这样的两个问题:其一,授权服务器没有对客户端应用进行认证,因为获取Access Token的 ...
- 谈谈基于OAuth 2.0的第三方认证 [中篇]
虽然我们在<上篇>分别讨论了4种预定义的Authorization Grant类型以及它们各自的适用场景的获取Access Token的方式,我想很多之前没有接触过OAuth 2.0的读者 ...
- 谈谈基于OAuth 2.0的第三方认证 [上篇]
对于目前大部分Web应用来说,用户认证基本上都由应用自身来完成.具体来说,Web应用利用自身存储的用户凭证(基本上是用户名/密码)与用户提供的凭证进行比较进而确认其真实身份.但是这种由Web应用全权负 ...
- .NET Core中JWT+Auth2.0实现SSO,附完整源码(.NET6)
一.简介 单点登录(SingleSignOn,SSO) 指的是在多个应用系统中,只需登录一次,就可以访问其他相互信任的应用系统. JWT Json Web Token,这里不详细描述,简单说是一种认证 ...
- 谈谈localhost与127.0.0.1
localhost意为本地主机,指这台计算机,是给回路网络接口的标准主机名,对应的IP地址为127.0.0.1,可访问本地服务器的web项目(http://localhost). 那么它们有什么区别呢 ...
- 从密码到token, 一个授权的故事 auth2.0
1 美好的旧时光 我经常怀念三十年前那美好的旧时光, 工作很轻松, 生活很悠闲. 上班的时候偶尔有些HTTP的请求发到我这里, 我简单的看一下, 取出相对应的html文档,图片,发回去就可以了, 然后 ...
- Auth2.0 例子【转载】
本文转载自:https://www.cnblogs.com/flashsun/p/7424071.html 1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的 ...
- 微信Auth2.0授权的时候出现两次回调
在获取用户OpenID的时候 $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".WX_APPID. ...
- 1.2 auth2.0
多个应用 入sina qq msn 豆瓣 等 在手机登录时或终端登录时如果统一可以根据硬件做 gettid()-为了保证唯一性:方案一: 事先生成唯一验证码:使用一个isue 设置为1 ...
随机推荐
- python保留指定文件、删除目录其他文件的功能(1)
由于给客户的发布版本上客户改动了些代码和图片,我们这边给他们更新publish都是增量更新(开发提供更新指定的文件,我们提取出来给客户进行覆盖更新),但有时需要更新的文件较多导致不得不一个一个的进行查 ...
- python文件_批量改名
#! /usr/bin/env python #coding=gbk #文件操作实例--将文件夹下所有图片名称加上'_test' import re,os,time #str.split(path) ...
- LeetCode_Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- PADSPOWERPCB中怎样去隐藏一些PIN脚
由于一些板,尤其是U盘等面积很小的板,FLASH中只使用了为数不多的几个PIN,为了可以让其它PIN下面可以走线,增加GND网络的面积,所以实际操作中要隐藏一些PIN.这就需要怎么操作呢! 我们要做的 ...
- POJ 2752 Seek the Name, Seek the Fame (KMP next 数组 变形)
题意:给一个字符串S,判断在什么下标的时候,前缀和后缀相等,输出前缀和后缀相等的点. 分析:next数组的一种很巧妙的用法 next数组表示的意义是当前下标前面k字符和开头的前面k个字符相等 所以就会 ...
- UVa10653.Prince and Princess
题目连接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- QString转换为char*
QString在Qt里相当于C++里的std::string,或者是C里的c style string.不过,QString跟编码相关,在低层想把一个QString发送出去相当麻烦,尤其对方用的不是Q ...
- GCD 延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_ ...
- 如何在cmd窗口启动Tomcat
平时,一般使用tomcat/bin/startup.bat目录在windows环境启动Tomcat,或者使用IDE配置后启动. 下面来简单介绍下如果在cmd窗口直接输入命令启动Tomcat: 1.将t ...
- Arithmetic Sequence(dp)
Arithmetic Sequence Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 51 Solved: 19[Submit][Status][We ...