OpenID Connect

OpenID Connect简介

OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议。它使用简单的REST / JSON消息流来实现,和之前任何一种身份认证协议相比,开发者可以轻松集成。
OpenID Connect允许开发者验证跨网站和应用的用户,而无需拥有和管理密码文件。OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份。

OpenID的历史是什么?

OpenID Connect是OpenID的第三代技术。首先是原始的OpenID,它不是商业应用,但让行业领导者思考什么是可能的。OpenID 2.0设计更为完善,提供良好的安全性保证。然而,其自身存在一些设计上的局限性,最致命的是其中依赖方必须是网页,但不能是本机应用程序;此外它还要依赖XML,这些都会导致一些应用问题。
OpenID Connect的目标是让更多的开发者使用,并扩大其使用范围。幸运的是,这个目标并不遥远,现在有很好的商业和开源库来帮助实现身份验证机制。

OIDC基础

简要而言,OIDC是一种安全机制,用于应用连接到身份认证服务器(Identity Service)获取用户信息,并将这些信息以安全可靠的方法返回给应用。
在最初,因为OpenID1/2经常和OAuth协议(一种授权协议)一起提及,所以二者经常被搞混。

OpenID是Authentication,即认证,对用户的身份进行认证,判断其身份是否有效,也就是让网站知道“你是你所声称的那个用户”;
OAuth是Authorization,即授权,在已知用户身份合法的情况下,经用户授权来允许某些操作,也就是让网站知道“你能被允许做那些事情”。
由此可知,授权要在认证之后进行,只有确定用户身份只有才能授权。

(身份验证)+ OAuth 2.0 = OpenID Connect

OpenID Connect是“认证”和“授权”的结合,因为其基于OAuth协议,所以OpenID-Connect协议中也包含了client_id、client_secret还有redirect_uri等字段标识。这些信息被保存在“身份认证服务器”,以确保特定的客户端收到的信息只来自于合法的应用平台。这样做是目的是为了防止client_id泄露而造成的恶意网站发起的OIDC流程。

在OAuth中,这些授权被称为scope。OpenID-Connect也有自己特殊的scope--openid ,它必须在第一次请求“身份鉴别服务器”(Identity Provider,简称IDP)时发送过去。

OpenID Connect 实现

我们的本代码实现建立在PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant) 文章的代码基础上调整

证书


# 生成私钥 private key
$ openssl genrsa -out privkey.pem 2048# 私钥生成公钥 public key
$ openssl rsa -in privkey.pem -pubout -out pubkey.pem

调整server


private function server()
{$pdo = new \PDO('mysql:host=ip;dbname=oauth_test', "user", "123456");$storage = new \OAuth2\Storage\Pdo($pdo);$config = ['use_openid_connect' => true, //openid 必须设置'issuer' => 'sxx.qkl.local'];$server = new \OAuth2\Server($storage, $config);// 第二个参数,必须设置值为public_key$server->addStorage($this->getKeyStorage(), 'public_key');// 添加 Authorization Code 授予类型$server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($storage));// 添加 Client Credentials 授予类型  一般三方应用都是直接通过client_id & client_secret直接请求获取access_token$server->addGrantType(new \OAuth2\GrantType\ClientCredentials($storage));return $server;
}private function getKeyStorage()
{$rootCache = dirname(APP_PATH) . "/cert/oauth/";$publicKey  = file_get_contents($rootCache.'pubkey.pem');$privateKey = file_get_contents($rootCache.'privkey.pem');// create storage$keyStorage = new \OAuth2\Storage\Memory(array('keys' => array('public_key'  => $publicKey,'private_key' => $privateKey,)));return $keyStorage;
}

授权


public function authorize()
{// scope增加openid// 该页面请求地址类似:// http://sxx.qkl.local/v2/oauth/authorize?response_type=code&client_id=testclient&state=xyz&redirect_uri=http://sxx.qkl.local/v2/oauth/cb&scope=basic%20get_user_info%20upload_pic%20openid//获取server对象$server = $this->server();$request = \OAuth2\Request::createFromGlobals();$response = new \OAuth2\Response();// 验证 authorize request// 这里会验证client_id,redirect_uri等参数和client是否有scopeif (!$server->validateAuthorizeRequest($request, $response)) {$response->send();die;}// 显示授权登录页面if (empty($_POST)) {//获取client类型的storage//不过这里我们在server里设置了storage,其实都是一样的storage->pdo.mysql$pdo = $server->getStorage('client');//获取oauth_clients表的对应的client应用的数据$clientInfo = $pdo->getClientDetails($request->query('client_id'));$this->assign('clientInfo', $clientInfo);$this->display('authorize');die();}$is_authorized = true;// 当然这部分常规是基于自己现有的帐号系统验证if (!$uid = $this->checkLogin($request)) {$is_authorized = false;}// 这里是授权获取code,并拼接Location地址返回相应// Location的地址类似:http://sxx.qkl.local/v2/oauth/cb?code=69d78ea06b5ee41acbb9dfb90500823c8ac0241d&state=xyz$server->handleAuthorizeRequest($request, $response, $is_authorized, $uid);if ($is_authorized) {// 这里会创建Location跳转,你可以直接获取相关的跳转url,用于debug$parts = parse_url($response->getHttpHeader('Location'));var_dump($parts);parse_str($parts['query'], $query);// 拉取oauth_authorization_codes记录的信息,包含id_token$code = $server->getStorage('authorization_code')->getAuthorizationCode($query['code']);var_dump($code);}
//        $response->send();
}

curl获取


# 使用 HTTP Basic Authentication
$ curl -u testclient:123456 http://sxx.qkl.local/v2/oauth/token -d 'grant_type=client_credentials'# 使用 POST Body 请求
$ curl http://sxx.qkl.local/v2/oauth/token -d 'grant_type=client_credentials&client_id=testclient&client_secret=123456'

postman获取access_token

总结


access_token 用于授权
id_token(通常为JWT) 用于认证通常我们
首先,需要使用id_token登录
然后,你会得到一个access_token
最后,使用access_token来访问授权相关接口。

原文地址:https://segmentfault.com/a/1190000016539242

转载于:https://www.cnblogs.com/lalalagq/p/9969846.html

PHP下的Oauth2.0尝试 - OpenID Connect相关推荐

  1. PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)

    OAuth 2.0 不太熟悉什么是OAuth2.0的同学可以参考阮大神的文章, 理解OAuth 2.0 - 阮一峰 授权码模式(Authorization Code) # 授权代码授予类型用于获得访问 ...

  2. 【One by One系列】IdentityServer4(一)OAuth2.0与OpenID Connect 1.0

    在微服务场景中,身份认证通常是集中处理,这也是有别于单体应用一把梭哈的模式,其中,在微软微服务白皮书中,提供了两种身份认证模式: 网关,没错,原话是If you're using an API Gat ...

  3. jws webservice 跳过https认证_基于OAuth2的OIDC (OpenId Connect)身份认证

    OIDC协议 OIDC(OpenID Connect)是在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议. OAuth2协议 OAuth2是一个授权协议,它无法提供完善的 ...

  4. OpenID Connect:OAuth 2.0协议之上的简单身份层

    OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 A ...

  5. 通过Keycloak API理解OAuth2与OpenID Connect

    文章目录 通过Keycloak API理解OAuth2与OpenID Connect 前言 OAuth2 介绍 OAuth2核心概念 OAuth2 核心数据 JWT OAuth2 flow Autho ...

  6. OpenID Connect 1.0 / 总览

    OpenID Connect 是什么 OpenID Connect 1.0 是一个建立在 OAuth 2.0 协议上的身分层 允许 Client 确认终端用户基于授权服务器鉴权的身份 还可以让 Cli ...

  7. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息

    1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面w ...

  8. OAuth2.0(及OIDC 1.0)选型建议及SSO、SLO方案

    目录 1. 关于认证 2. OAuth 2.0 3. OIDC 1.0 4. OIDC选型建议 4.1 PKCE 5. SSO方案 5.1 SSO SPA 5.2 SSO WEB 6. SLO方案 6 ...

  9. Identity Server 4 预备知识 -- OpenID Connect 简介

    我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全. 这篇文章我要介绍一下 OpenID Connect. ...

最新文章

  1. 每个优秀程序员必须具备的技能
  2. 用数学方式打开Facebook新Logo,真的和视频号Logo来自同一方程
  3. 要在某一房间中两台计算机之间实现网络通信,大学计算机计算思维导论期末考试综述.doc...
  4. MFC CListCtrl 取消选中
  5. Spark 中 File,Block,Split,Task,Partition,RDD概念的理解
  6. mac安装热更新插件
  7. android 遥控器方向,最简单DIY基于Android系统的万能蓝牙设备智能遥控器
  8. 兴趣 程序猿宅必备超级好看的动漫
  9. html怎么在手机打不开,手机的浏览器打不开网页怎么办
  10. java计算税率例子
  11. 【微信小程序】---授权登陆---【巷子】
  12. (MySQL)Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'readerName' at row 1
  13. SEO的职业发展规划及SEO优化未来的发展方向是什么?
  14. 法国学术会议申根签证办理(因私)
  15. 用MATLAB画圣诞树的源代码
  16. php mysql 别名_php和mysql的一些奇怪之处
  17. 测试行业的发展趋势和看法
  18. 数学建模算法与应用:预测算法(6)预测习题练习
  19. 未来10年,美国47%的工作岗位将被人工智能取代?深入剖析ChatGPT
  20. python实现直方图均衡化(CLAHE、HE)

热门文章

  1. MVC下HtmlHelper自带BeginForm表单提交与异步Ajax请求
  2. 堆栈中的EIP EBP ESP
  3. LPTSTR、LPCSTR、LPCTSTR、LPSTR的含义
  4. nginx服务器安装及配置文件详解
  5. iOS/OS X内存管理(一):基本概念与原理
  6. iOS iOS-System-Services(系统信息)
  7. 使用SharePoint 2007 Web Service上传文件到文档库
  8. Ehcache的基本概念
  9. 兼容IE,chrome 等所有浏览器 回到顶部代码
  10. cocos2dx 大地图分块加载的研究(初)