You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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流程需要:

  1. 获取access token
  2. 用token获取用户信息
  3. 创建包含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冲突:

  1. 第一步仅请求Power BI专属scope,获取用于Power BI API调用的token
  2. 第二步引导用户单独授权Graph API的User.Read scope,获取可调用/me接口的token,提取用户信息后合并到用户记录中
    注意:需在Azure AAD应用中分别配置两类scope,授权时分开请求,禁止合并scope

方案三:自定义Omniauth策略适配Power BI

直接编写自定义Omniauth策略,替换默认的用户信息获取逻辑,改用Power BI API的接口:

  1. 创建自定义策略类:
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
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:16:02