如何让第三方Ruby客户端无密码认证Azure AD OAuth2.0 Web API
Azure Function App 服务对服务无密码认证的Ruby实现方案
要实现第三方Ruby应用对Azure Function App的服务对服务无密码认证,直接使用Azure AD的**客户端凭证流(Client Credentials Flow)**即可,该流程无需用户名密码、无用户交互,完全基于应用身份完成认证。
前置Azure AD配置确认
- 确保你的Function App对应的Azure AD应用注册(API端)已暴露API范围,且为第三方Ruby应用的AD注册授予了应用权限(注意不是委托权限,服务对服务场景必须用应用权限),权限需经管理员同意(租户级权限需全局管理员操作)。
- 第三方Ruby应用的Azure AD注册需生成并保存Client Secret(或使用证书,安全性更高)。
Ruby客户端实现步骤
1. 安装依赖gem
使用oauth2 gem处理OAuth2令牌流程,执行安装命令:
gem install oauth2
2. 认证并调用API的代码示例
require 'oauth2' require 'net/http' # 替换为你的实际配置信息 tenant_id = "你的Azure AD租户ID" client_id = "第三方Ruby应用的Client ID" client_secret = "第三方Ruby应用的Client Secret" # Scope格式:API应用的标识符 + .default,对应应用权限的默认范围 scope = "https://ph-bde-uat-ptsocfunapp.azurewebsites.net/.default" # 初始化OAuth2客户端 oauth_client = OAuth2::Client.new( client_id, client_secret, site: "https://login.microsoftonline.com/#{tenant_id}", token_url: "/oauth2/v2.0/token" ) # 通过客户端凭证流获取访问令牌 access_token = oauth_client.client_credentials.get_token(scope: scope) # 调用Azure Function API api_uri = URI("https://ph-bde-uat-ptsocfunapp.azurewebsites.net/api/Quote") http = Net::HTTP.new(api_uri.host, api_uri.port) http.use_ssl = true request = Net::HTTP::Get.new(api_uri) request["Authorization"] = "Bearer #{access_token.token}" response = http.request(request) puts "API响应状态: #{response.code}" puts "API响应内容: #{response.body}"
关键注意事项
- Scope规则:必须使用API应用注册的标识符拼接
.default,这是客户端凭证流中应用权限的固定格式。 - 安全最佳实践:禁止硬编码Client Secret,建议通过环境变量(如
ENV['AZURE_CLIENT_SECRET'])或密钥管理服务读取敏感信息。 - 可选安全升级:可用证书认证替代Client Secret,
oauth2gem支持通过加载证书文件完成令牌获取,避免Secret泄露风险。
内容的提问来源于stack exchange,提问作者user2516240
相关产品推荐
相关产品推荐

