OpenID

最近老大让研究一下OpenID,有一些心得,记下来,供以后参考。

OpenID是一种新的登陆方式,有别于以往的用户名和密码的登陆方式,OpenID是一种将用户的个人信息存储在一个中间的OpenID服务网站,利用该服务网站提供的OpenID帐号来实现登陆系统,这样可以方便,快捷,安全的登陆系统。这种登陆方式也是未来的一种趋势。

其设计原理:是利用URL作为用户的唯一的身份识别(就象域名的识别的一样),在登陆系统时,输入一个OpenID帐号(如:http://UserName.myopenid.com),页面将跳转到myopenid的网址后,该网站上的个人信息将帮助其完成其身份识别。

03-23
### OpenID Connect 在身份认证中的应用及实现方式 #### 应用场景 OpenID Connect (OIDC) 是基于 OAuth 2.0 构建的一种开放标准协议,用于解决用户身份验证问题。它允许客户端应用程序以标准化和安全的方式验证用户身份,并获取用户的个人信息[^1]。OIDC 主要应用于以下场景: - **单点登录 (SSO)**:多个应用程序共享同一套身份验证机制,用户只需一次登录即可访问所有关联的服务。 - **第三方授权登录**:用户可以通过已有的社交媒体账户(如 Google 或 Facebook)登录到其他网站或应用,而无需注册新账号。 - **微服务架构下的统一身份管理**:在分布式系统中,API 网关可以利用 OIDC 对用户进行身份验证,并将经过验证的信息传递给下游的各个微服务。 #### 核心角色 OIDC 定义了几种关键的角色参与整个流程: - **资源所有者 (Resource Owner)**:通常指最终用户,拥有受保护的数据。 - **客户端 (Client)**:发起请求的应用程序,希望获得关于用户的某些信息。 - **身份提供方 (Identity Provider, IdP)**:负责执行实际的身份验证过程并向客户端返回必要的令牌[^2]。 #### 技术细节与工作原理 当采用 OIDC 进行身份认证时,一般遵循以下几个技术要点: 1. **授权码模式 (Authorization Code Flow)**:这是推荐的标准方法之一,在该过程中,客户端先引导浏览器跳转至 IdP 提供的授权端点;如果成功,则会收到一个临时性的授权码。随后,这个授权码会被交换成 id_token 和 access_token。 ```python import requests # 请求授权码 auth_url = 'https://identityprovider.com/auth' params = { 'response_type': 'code', 'client_id': 'your_client_id', 'redirect_uri': 'http://localhost/callback', 'scope': 'openid profile email' } response = requests.get(auth_url, params=params) ``` 2. **隐式流 (Implicit Flow)**:适用于前端 JavaScript SPA 类型的应用场合下直接获取 tokens 而不涉及后端交互的情况。不过由于安全性原因,如今更倾向于使用 PKCE 扩展后的 Authorization Code Mode 来替代 Implicit Flow[^4]。 3. **混合流 (Hybrid Flow)**:结合了上述两种方式的优点,既可以获得 immediate token 又能拿到 authorization code 以便后续刷新或其他用途。 4. **Token 验证** - `id_token` 是 JWT 形式的字符串,包含了有关当前登录状态的重要声明项(claims),例如 iss(issuer), sub(subject/user identifier), aud(audience/client app ID)等等。开发者需解析并校验这些签名的有效性和合法性。 ```javascript function verifyJwt(token){ const base64Url = token.split('.')[1]; const jsonPayload = decodeURIComponent(atob(base64Url).split('').map(function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); console.log(JSON.parse(jsonPayload)); } let sampleIdToken="..."; // Your actual id_token here verifyJwt(sampleIdToken); ``` - 同样地对于 `access_token`, 如果也是作为 JWS 发布的话也需要做类似的处理步骤来确认它的可信度。 #### 开发实践建议 为了更好地实施 OIDC 解决方案,这里给出几点开发指导原则: - 始终优先选用支持最新版本规范的产品和服务供应商; - 将敏感操作限定于服务器一侧完成而非暴露于公共网络环境之中; - 正确配置 CORS 政策防止跨域攻击风险发生; - 使用 HTTPS 加密通信链路保障传输层的安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值