如何使用Omniauth gem实现Power BI API的OAuth授权并获取用户信息
Ruby on Rails + Omniauth 接入Power BI API的解决方案
问题背景
我们基于Ruby on Rails框架,使用Omniauth gem搭建了多API的OAuth授权机制(已接入Microsoft Graph API),现在需要新增Power BI API的接入。
常规做法是使用对应API的专属Omniauth插件gem来简化对接,但Power BI暂无此类插件。Omniauth的标准OAuth流程需要:
- 获取access token
- 用token获取用户信息
- 创建包含uid、用户基础信息及token的用户记录
但我们遇到了核心问题:Power BI API没有直接获取用户信息的接口,尝试用Graph API的https://graph.microsoft.com/v1.0/me接口时又出现两个障碍:
- 同时配置Graph和Power BI的scope后,调用Power BI API会触发异常
- 仅用Power BI scope生成的token,无权限调用Graph API的用户信息接口
可行解决方案
方案一:从Power BI API间接获取用户标识信息
Power BI API提供了可间接提取用户信息的接口,完全能满足Omniauth的需求:
- 调用
GET https://api.powerbi.com/v1.0/myorg/profiles/me:直接返回当前授权用户的基础信息,包括id(可作为uid)、userPrincipalName(邮箱)、displayName(姓名) - 备选接口
GET https://api.powerbi.com/v1.0/myorg/groups:返回用户的工作区列表,每个工作区的createdBy字段包含用户的ID和邮箱,可提取作为用户标识
方案二:拆分授权流程,获取双令牌
若必须依赖Graph API的用户信息,可通过拆分授权步骤避免scope冲突:
- 第一步仅请求Power BI专属scope,获取用于Power BI API调用的token
- 第二步引导用户单独授权Graph API的
User.Readscope,获取可调用/me接口的token,提取用户信息后合并到用户记录中
注意:需在Azure AAD应用中分别配置两类scope,授权时分开请求,禁止合并scope
方案三:自定义Omniauth策略适配Power BI
直接编写自定义Omniauth策略,替换默认的用户信息获取逻辑,改用Power BI API的接口:
- 创建自定义策略类:
require 'omniauth-oauth2' module OmniAuth module Strategies class PowerBI < OmniAuth::Strategies::OAuth2 option :name, :power_bi option :client_options, { site: 'https://login.microsoftonline.com', authorize_url: '/common/oauth2/v2.0/authorize', token_url: '/common/oauth2/v2.0/token' } def raw_info @raw_info ||= access_token.get('https://api.powerbi.com/v1.0/myorg/profiles/me').parsed end def uid raw_info['id'] end def info { email: raw_info['userPrincipalName'], name: raw_info['displayName'] } end end end end
- 在Rails初始化文件中注册策略:
# config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :power_bi, ENV['POWER_BI_CLIENT_ID'], ENV['POWER_BI_CLIENT_SECRET'], scope: 'https://analysis.windows.net/powerbi/api/Workspace.Read.All https://analysis.windows.net/powerbi/api/Report.Read.All' end
内容的提问来源于stack exchange,提问作者Bob Groeneveld
相关产品推荐
相关产品推荐

