3

grails oauth プラグインを使用して Google に接続しようとしています。以下は私のコードです

Config.groovy

oauth {
  providers {
    google {
        api = org.scribe.builder.api.GoogleApi
        key = 'XXX.apps.googleusercontent.com'
        secret = 'XXXXXXX'

        scope = 'https://www.googleapis.com/auth/userinfo.profile'
        callback = "${grails.serverURL}/oauth/google/callback"
        successUri = "${grails.serverURL}/oauthCallBack/google"
    }
  }
}

grails.google.api.url = "https://accounts.google.com/o/oauth2/auth"

OauthCallBackController.groovy

class OauthCallBackController {

  def oauthService

  def google() {
    Token googleAccessToken = (Token) session[oauthService.findSessionKeyForAccessToken('google')]
    def googleResource = oauthService.getGoogleResource(googleAccessToken, grailsApplication.config.grails.google.api.url)
    def googleResponse = JSON.parse(googleResource?.getBody())

    log.info "googleAccessToken = ${googleAccessToken}"
    log.info "googleResponse = ${googleResponse}"
    log.info "accesstoken = ${googleAccessToken.token}"

    def googleResourceDetailed = oauthService.getGoogleResource(googleAccessToken, "https://www.googleapis.com/oauth2/v1/userinfo?access_token=${googleAccessToken.token}")
    def googleResponseDetailed = JSON.parse(googleResourceDetailed?.getBody())

    log.info "googleResourceDetailed = ${googleResourceDetailed}"
    log.info "googleResponseDetailed = ${googleResponseDetailed}"

    render params
  }
}

接続しようとすると、アプリケーションが資格情報にアクセスすることを許可するように Google から求められます。コールバック アクションの実行を許可した後 (oauthCallBack/google)、アカウントのデータを取得していません。

以下は私のログの私の出力です

INFO  example.OauthCallBackController  - googleAccessToken = Token[1/xxx , yyy]
INFO  example.OauthCallBackController  - googleResponse = [:]
INFO  example.OauthCallBackController  - accesstoken = 1/xxx
INFO  example.OauthCallBackController  - googleResourceDetailed = org.scribe.model.Response@2a088ca
INFO  example.OauthCallBackController  - googleResponseDetailed = [error:[message:Invalid Credentials, errors:[[message:Invalid Credentials, location:Authorization, reason:authError, locationType:header, domain:global]], code:401]]

どこが間違っているのか、なぜ応答としてエラーが発生するのかわかりません。

Google からデータを取得するにはどうすればよいですか?

4

1 に答える 1

4

ついに..、。

たくさんのグーグル検索の後、私はついに自分の問題を理解し、グーグルからデータを正常に取得しました。

問題は、grails.google.api.url構成ファイルのエントリにあります。

正しい値は

grails.google.api.url = "https://www.googleapis.com/oauth2/v1/userinfo"

今私のコードは

Config.groovy

oauth {
  providers {
    google {
      api = org.scribe.builder.api.GoogleApi
      key = 'XXX.apps.googleusercontent.com'
      secret = 'XXXXXXX'

      scope = 'https://www.googleapis.com/auth/userinfo.profile'
      callback = "${grails.serverURL}/oauth/google/callback"
      successUri = "${grails.serverURL}/oauthCallBack/google"
    }
  }
}

grails.google.api.url = "https://www.googleapis.com/oauth2/v1/userinfo"

OauthCallBackController.groovy

def google() {
    Token googleAccessToken = (Token) session[oauthService.findSessionKeyForAccessToken('google')]
    def googleResource = oauthService.getGoogleResource(googleAccessToken, grailsApplication.config.grails.google.api.url)
    def googleResponse = JSON.parse(googleResource?.getBody())

    log.info "googleAccessToken = ${googleAccessToken}"
    log.info "googleResponse = ${googleResponse}"
    log.info "accesstoken = ${googleAccessToken.token}"
    log.info "id = ${googleResponse.id}"
    log.info "name = ${googleResponse.name}"

    render params
}

そして、私のログアウトは

INFO  example.OauthCallBackController  - googleAccessToken = Token[1/xxx , yyy]
INFO  example.OauthCallBackController  - googleResponse = [id:xxxxx, locale:en, link:yyyyy, name:MKB, gender:male, family_name:B, given_name:M]
INFO  example.OauthCallBackController  - accesstoken = 1/xxx
INFO  example.OauthCallBackController  - id = xxxxx
INFO  example.OauthCallBackController  - name = MKB

Grails Oauth Plugin Demo

于 2013-09-17T17:04:50.507 に答える