lib/omniauth/strategies/feishu.rb in omniauth-feishu-0.1.7 vs lib/omniauth/strategies/feishu.rb in omniauth-feishu-0.1.8

- old
+ new

@@ -1,22 +1,25 @@ require 'omniauth-oauth2' module OmniAuth module Strategies + + # 飞书登录 + # + # 飞书要求请求采用 json 格式主体,很多都需要自定义 + # 官方文档: https://open.feishu.cn/document/ukTMukTMukTM/uETOwYjLxkDM24SM5AjN class Feishu < OmniAuth::Strategies::OAuth2 class NoAppAccessTokenError < StandardError; end - attr_reader :app_access_token - option :name, 'feishu' option :client_options, { - site: 'https://open.feishu.cn', - authorize_url: "/open-apis/authen/v1/user_auth_page_beta", - token_url: "https://open.feishu.cn/open-apis/authen/v1/access_token", - app_access_token_url: "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal", - user_info_url: "https://open.feishu.cn/open-apis/authen/v1/user_info" + site: 'https://open.feishu.cn/open-apis/authen/v1/', + authorize_url: 'user_auth_page_beta', + token_url: 'access_token', + app_access_token_url: 'https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal', + user_info_url: 'user_info' } uid { raw_info['user_id'] } info do @@ -29,61 +32,66 @@ avatar_middle: raw_info['avatar_middle'], avatar_big: raw_info['avatar_big'], user_id: raw_info['user_id'], union_id: raw_info['union_id'], open_id: raw_info['open_id'], - en_name: raw_info['en_name'], - app_access_token: @app_access_token + en_name: raw_info['en_name'] } end def raw_info - @raw_info ||= begin - response = Faraday.get( - options.client_options.user_info_url, - nil, - content_type: 'application/json', authorization: "Bearer #{access_token.token}" - ) - response_body = JSON.parse(response.body) - response_body['data'] - end + @raw_info ||= client.request(:get, options.client_options.user_info_url, + { headers: { + 'Content-Type' => 'application/json; charset=utf-8', + 'Authorization' => "Bearer #{access_token.token}" + } + }) + .parsed['data'] end def authorize_params super.tap do |params| params[:app_id] = options.client_id end end + # 飞书采用非标准 OAuth 2 请求体和返回结构体,需要自定义 def build_access_token - resp = Faraday.post( - options.client_options.token_url, - { code: request.params["code"], app_access_token: app_access_token, grant_type: "authorization_code" }.to_json, - content_type: "application/json" - ) - data = JSON.parse(resp.body)['data'] + code = request.params['code'] + data = client.request(:post, options.client_options.token_url, + { body: { + code: code, + grant_type: 'authorization_code' + }.to_json, + headers: { + 'Content-Type' => 'application/json; charset=utf-8', + 'Authorization' => "Bearer #{app_access_token}" + } + }) + .parsed['data'] + ::OAuth2::AccessToken.from_hash(client, data) end - def callback_phase - get_app_access_token - super - end - private - def get_app_access_token - resp = Faraday.post( - options.client_options.app_access_token_url, - { app_id: options.client_id, app_secret: options.client_secret }.to_json, - content_type: "application/json" - ) - response_body = JSON.parse(resp.body) - if response_body.key?('app_access_token') - @app_access_token = response_body['app_access_token'] - else - raise NoAppAccessTokenError, "cannot get app_access_token." - end + def app_access_token + return @app_access_token if @app_access_token + + @app_access_token ||= client.request(:post, options.client_options.app_access_token_url, + { body: { + app_id: options.client_id, + app_secret: options.client_secret + }.to_json, + headers: { + 'Content-Type' => 'application/json; charset=utf-8' + } + }) + .parsed['app_access_token'] + + raise NoAppAccessTokenError, 'No app access token' unless @app_access_token + + @app_access_token end end end end