首页 > 其他分享 >OpenID 和 OAuth 的区别及第三方登录的安全隐患分析

OpenID 和 OAuth 的区别及第三方登录的安全隐患分析

时间:2023-05-17 19:37:56浏览次数:44  
标签:OpenID 网站 com 用户 OAuth 安全隐患 example


不知道什么时候开始,我们已经习惯了点击“用XX帐号登录”或者 "Login with XX" 来访问网站,但是大多数人可能都不知道这背后涉及的事有多复杂。

OpenID 和OAuth 完全是为了两种不同的需求而生

OpenID 的目标是为了帮助网站确认一个用户的身份 OAuth 的目标是为了授权第三方在可控范围下访问用户资源

OpenID 是怎么认证用户的?

一个网站如果想要接入 OpenID 认证是非常简单的,不需要创建应用,不需要 App Key ,不需要 Secret ,只需要将用户导向 OpenID Provider 的 Entry 并带上 Callback ,用户只要同意提供信息,你就可以拿到这个用户的“唯一标识”。

请注意这里我使用了“唯一标识”这种说法,因为对于网站来说,OpenID Provider 提供的既不是用户的 UID ,也不是用户的 E-Mail ,比如 Google 在默认情况下提供的就是一个几十位长的字符串,这个字符串是随机生成的,第三方网站无法从中获得用户的任何私人信息。这么说可能很抽象,举个例子:

比如我用 Google 的 OpenID 服务登录 example.com , example.com 先把我导向 Google 的授权页面,我使用 Google 帐号 [email protected] 登录并同意后,页面跳回 example.comexample.com 拿到了我的“唯一标识”,这个唯一标识可能是 cd5f2126c2b2f97ca2d446e52c6ff4baea56fd4bcfcea30afcaaf6b73bcb04a1example.com 从这个字符串里无法获得任何 [email protected] 的个人信息(甚至连邮箱地址也不知道), example.com 只知道以后只要使用谷歌登录并返回 cd5f2126c2b2f97ca2d446e52c6ff4baea56fd4bcfcea30afcaaf6b73bcb04a1 这个标识符,那就是我在登录。

显而易见,OpenID 是专为登录认证而生,它使用简单,门槛很低,但是如果你想在认证过程中获得用户的其他信息(比如 E-Mail )就得多做一步了。

如何在 OpenID 认证的过程中获得用户的部分信息?

传统的 OpenID 是做不到这一点的,你只能拿到“唯一标识”。不过新版的 OpenID 引入了 "OpenID attribute exchange" 这个概念,这样第三方可以在用户的许可范围内获得用户的部分具体信息。

还是上面的例子,如果 example.com 告诉 Google ,我想知道这个用户的 E-Mail 地址,谷歌就会在授权页面告诉用户:“example.com 想要你的 E-Mail 地址”,这时如果用户点击同意,example.com 就能在回调请求中拿到 [email protected] 这个地址。

对于网站能拿到的信息,不同 Provider 有不同的规定,一般来说包括

aim, blog, country, dob (date of birth), email, fullname, gender, icq, image, jabber, language, msn, nickname, phone, postcode, skype, timezone, website, yahoo

等等。

那么,OAuth 又是怎么认证用户的?

与 OpenID 相比,网站想接入 OAuth 要稍微麻烦点,网站需要先创建应用,拿到 Key 和 Secret ,才能接入 Provider 。

OAuth 的授权过程并不是身份认证的过程,这一点需要特别清楚,网站走完OAuth 流程并拿到用户的授权 token 后还需要通过 token 调用相应的用户信息接口才能获得“唯一标识”,举个例子:

我想通过新浪微博登录 example.comexample.com 要先把我 redirect 到新浪微博的授权页面,我通过微博帐号登录并授权后,页面跳回 example.comexample.com 拿到我的访问 token 后还要再调用一个接口来获得我的新浪会员 UID ,这个 UID 就是新浪用户的“唯一标识”了。

可以看出,OAuth 相对于 OpenID 最大的区别就是,网站实际上是拿到了你的帐户访问权限继而确认你的身份,这是一个安全隐患,因为网站在拿到你的“唯一标识”的同时还拿到了一把你的账户的 “临时钥匙”。至于网站会不会拿这把钥匙“干坏事”,这个只有站长心里清楚。同时 OAuth 还比 OpenID 多了几个额外的请求步骤,登录所费时间一定是长于 OpenID 的。

大多数的网民是没有这种意识的,他们对“通过XX登录”的认证过程中的提示早已视而不见:

有多少人真正注意过左边的文字?

豆瓣写的更清楚,XXX应用“希望操作你在豆瓣上的数据”而不是“希望使用你的豆瓣账号来登录XXX”

国内外主要服务商认证方式对比

提供商

认证方式

认证后网站获得的权限

安全程度

Google

OpenID + OAuth

如果使用OpenID,网站无法获得任何额外权限(包括获得你的Google账户名称),如果使用OAuth,网站须明确说明需要访问哪些服务的权限并经过用户逐项同意

Facebook

OAuth

默认授权情况下只能读取你的公开信息(不包含E-Mail地址),如果网站需要更高级权限需要明确声明并经过用户逐项同意

QQ空间

OAuth

默认授权情况下只能读取你的公开信息(不包含QQ号),如果网站需要更高级权限需要明确声明并经过用户逐项同意

新浪微博

OAuth

默认授权情况下可以获得你的所有信息(私信及身份证号、姓名等除外),并可以你的身份操作绝大多数微博功能

Windows Live

OAuth

默认授权情况下只能读取你的“唯一标识”,如果网站需要更高级权限需要明确声明并经过用户逐项同意,默认情况下基本类似于OpenID

腾讯微博

OpenID + OAuth

如果使用OpenID,网站无法获得任何额外权限,如果使用OAuth,默认会获得用户所有操作的权限,除非应用明确声明只需要部分权限

使用OpenID时,使用OAuth时,

搜狐微博

OAuth

默认授权情况下可以获得你的绝大多数信息,并可以你的身份操作绝大多数微博功能

网易微博

OAuth

默认授权情况下可以获得你的绝大多数信息,并可以你的身份操作绝大多数微博功能

百度

OAuth

默认授权情况下只能读取你的公开信息(UID、百度帐户名),如果网站需要更高级权限需要明确声明并经过用户逐项同意

人人

OAuth

默认授权情况下只能读取你的公开信息(UID、好友关系等),如果网站需要更高级权限需要明确声明并经过用户逐项同意

开心网

OAuth

默认授权情况下只能读取你的公开信息,如果网站需要更高级权限需要明确声明并经过用户逐项同意

总结

总体来说,国外的网站都比较正规,第三方网站几乎无法获得任何私人信息,而国内网站对个人信息的保护水平高低不齐,某些网站甚至没有任何保护,新浪微博等网站的“第三方接入”,用一句话来说,不管你敢不敢用,我反正是不敢用。

 


 

 

 

标签:OpenID,网站,com,用户,OAuth,安全隐患,example
From: https://blog.51cto.com/u_8895844/6293309

相关文章

  • OpenIddict token expiration
    @@OpenIddicttokenexpiration https://nwb.one/blog/openid-connect-dotnet-5在.NET5中使用OpenIddict设置令牌身份验证什么是OpenIddict?OpenIddict是OpenIDConnect服务器中间件的.NETCore实现,允许您在任何.NETCore/.NET5应用程序中轻松设置OpenIDCo......
  • openiddict add customer claims
    @@openid自定义claim@@customclaims@@openiddictcustomclaimshttps://stackoverflow.com/questions/38060192/asp-core-add-custom-claim-to-auth-token#ASPCoreAddCustomClaimtoAuthToken##publicoverrideasyncTask<ClaimsPrincipal>CreateAsync(Applicati......
  • 8-1 OAuth2的主要角色和流程
         ......
  • idea微服务续_OAuth2
    一、OAuth2微服务权限校验Session先导入依赖 三个服务都导入<!--SpringSessionRedis支持--><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>......
  • 腾讯、新浪微博 oauth安全认证
    在做一个需要调用微博接口的项目中.发现了一些问题1.腾讯微博sdk的封装粒度不够,需要在其上做二次开发2.新浪,腾讯微博没有实现统一的接口,在做项目的时候需要将它们分开来实现,代码看起来很别扭我所做的就是解决了以上两个问题,所以现在做微博应用......
  • OAuth2.0 第三方登录
    本篇内容以用户访问百度,通过新浪微博的第三方登录百度过程讲解用户:资源拥有者百度:客户端新浪微博:认证服务器前置条件:百度已经向新浪微博申请注册,分配给百度的client_id是2512457640地址流程图如下1.用户(资源拥有者)访问百度(客户端)2.点击新浪微博(认证服务器)登录,浏览......
  • 生成openId,获取凭据
    问题及解决在调用凭证access_token的时候出现的错误 当小程序出错出现代码40125,并显示:errcode:40125,errmsg:"invalidappSecret"解决办法:在mp.weixin.qq.com里面重置你的appsecret或查看你的appid是否没有对应上;或查看你的url拼接是否出现空格,换行等......
  • 从0开始构建一个Oauth2Server服务 <19> Token 编解码
    Token编解码令牌提供了一种通过在令牌字符串本身中编码所有必要信息来避免将令牌存储在数据库中的方法。这样做的主要好处是API服务器能够验证访问令牌,而无需对每个API请求进行数据库查找,从而使API更容易扩展。OAuth2.0BearerTokens的好处是应用程序不需要知道您决定如......
  • 从0开始构建一个Oauth2Server服务 <15> 安全问题
    安全问题以下是构建授权服务器时应考虑的一些已知问题。网络钓鱼Attack针对OAuth服务器的一种潜在Attack是网络钓鱼Attack。这是Attack者创建一个看起来与服务授权页面相同的网页的地方,该页面通常包含用户名和密码字段。然后,Accacker可以通过各种手段诱骗用户访问该页面。除非用......
  • sb集成SECURITY、OAUTH2实现认证鉴权、资源管理
    1、Oauth2简介OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth1.0即完全废止了OAuth1.0。2、Oauth2服......