通过AzureAD实现Laravel应用到第三方网站的SSO流程咨询
流程问题与修正方案
你的现有流程存在关键逻辑错误和安全隐患,以下是问题拆解与正确实现方案:
核心问题点
- 步骤2的用户同步逻辑冗余:不需要给同步到Azure AD的用户生成随机密码,Azure AD支持无密码的用户身份关联(可通过SCIM API或手动创建用户,标记为禁用交互式登录),第三方OIDC网站仅需确认用户在Azure AD租户中存在并关联到对应应用即可。
- 步骤3的ID Token获取方式错误:服务账户(客户端凭证模式)仅能获取自身的访问令牌,无法直接生成其他用户的ID Token。ID Token是用户身份的专属凭证,必须通过代表用户的授权流程获取,而非服务端直接代生成。
- 步骤4的令牌传递方式不安全:直接通过表单POST传递ID Token易被拦截,且不符合OIDC标准流程。
正确实现流程
前置准备
- 在Azure AD中为你的Laravel应用注册企业应用,获取客户端ID、客户端密钥,配置重定向URI(指向Laravel应用的回调地址)。
- 确保第三方网站的Azure AD应用已将你的Laravel应用配置为可信身份提供者,或两个应用处于同一Azure AD租户下(若第三方允许),完成跨租户访问配置。
- 将自有数据库中的用户核心信息(邮箱、姓名等)同步到Azure AD租户,保存用户的Azure Object ID到自有数据库(此步骤保留,但无需生成密码)。
执行流程
已登录的Laravel用户点击SSO按钮后,Laravel应用构造授权请求,跳转至Azure AD授权端点,携带以下参数:
client_id:Laravel应用在Azure AD的客户端IDresponse_type=code:采用OIDC标准推荐的授权码流程redirect_uri:预先配置的Laravel回调地址scope=openid email profile:获取用户身份所需的权限范围state:随机生成的防CSRF字符串,存储到用户会话中login_hint:用户的Azure AD邮箱(从自有数据库关联信息中获取),让Azure AD自动跳过登录账户选择界面
Azure AD验证用户身份(若用户此前登录过Azure AD,可通过无缝SSO自动完成验证,无需重复输入密码),随后将授权码返回至Laravel的回调地址。
Laravel应用使用授权码、客户端ID、客户端密钥,调用Azure AD令牌端点,获取用户的ID Token和访问令牌。
Laravel应用通过OIDC标准方式传递ID Token至第三方网站:
- 跳转至第三方网站的OIDC回调地址,携带
id_token_hint参数传递ID Token;或让第三方网站直接通过授权码流程从Azure AD获取令牌(更安全)。
- 跳转至第三方网站的OIDC回调地址,携带
第三方网站验证ID Token的签名、有效期、受众(
aud)、发行方(iss)等字段,确认用户身份后完成登录。
额外注意事项
- 全程启用HTTPS:所有OIDC流程请求必须通过HTTPS传输,防止令牌被拦截篡改。
- 严格验证令牌:Laravel应用和第三方网站都要对ID Token的有效性进行全面校验,避免身份伪造。
- 会话状态管控:Laravel应用需维护用户会话,确保仅已登录用户可发起SSO请求。
内容的提问来源于stack exchange,提问作者adaba
相关产品推荐
相关产品推荐

