How to get email id from facebook using Grails social plugin

此生再无相见时 提交于 2019-12-10 17:04:54

问题


I am using spring-security-oauth-facebook:0.1 grails plugin in my application.Now i want to access person's email id but i am not able each time facebook server respond 1829812989120 for socialId ,Username, profileId and there is no option of email in returning Map object.Why it is happening.

     oauth {
        debug = true
           providers {
    facebook {
        api = org.scribe.builder.api.FacebookApi
        key = 'my-app-key'
        secret = 'secret-key'
        successUri = '/oauth/facebook/success'
        failureUri = '/oauth/facebook/failure'
        callback = "${baseURL}/oauth/facebook/callback"
        scopes = "['public_profile','email','name','user']"

      } 

    def sessionKey = oauthService.findSessionKeyForAccessToken(provider)

    if (!session[sessionKey]) {
        log.warn "No OAuth token in the session for provider '${provider}'"
        throw new OAuthLoginException("Authentication error for provider '${provider}'")
    }
    // Create the relevant authentication token and attempt to log in.

    OAuthToken oAuthToken = springSecurityOAuthService.createAuthToken(provider, 
                                                                            session[sessionKey])
    println "oAuthToken.principal = "+oAuthToken.principal.toString();
    println "oAuthToken.socialId  = "+oAuthToken.socialId;
    println "oAuthToken.properties= "+oAuthToken.properties
    println "oAuthToken.properties= "+oAuthToken.name
    println "oAuthToken.properties= "+oAuthToken.toString();

1)I ckecked all println value email is not there. please help me how to get email address of logged in user.


回答1:


Use this code after session created

OAuthToken oAuthToken = springSecurityOAuthService.createAuthToken(provider, 
                                                                        session[sessionKey])
Token facebookAccessToken = (Token) session[oauthService.findSessionKeyForAccessToken('facebook')]

println "Facebook token :"+facebookAccessToken

def facebookResource = oauthService.getFacebookResource(facebookAccessToken ,    "https://graph.facebook.com/me")

def facebookResponse = JSON.parse(facebookResource?.getBody())



回答2:


Email is not part of a Facebook public_profile. The only way to get the users e-mail address is to request extended permissions on the email field. You can do this by adding a scope to the oauth provider.

config.groovy

oauth {
   providers {
      facebook { 
          api = org.scribe.builder.api.FacebookApi
          scope = 'email'
          ...
          ...
      } 
   }
}

As an example of how to return email and various public_profile fields please see below. Take Note of: getFacebookResource params e.g. https://graph.facebook.com/me?fields=id,name,verified,age_range,email"

import grails.converters.JSON
import org.scribe.model.Token
import grails.plugin.springsecurity.oauth.OAuthToken

class SpringSecurityOAuthController {

   def oauthService

   def onSuccess = {
      // Validate the 'provider' URL. Any errors here are either misconfiguration
      // or web crawlers (or malicious users).
      if (!params.provider) {
        renderError 400, "The Spring Security OAuth callback URL must include the 'provider' URL parameter."
        return
      }

      def sessionKey = oauthService.findSessionKeyForAccessToken(params.provider)
      if (!session[sessionKey]) {
          renderError 500, "No OAuth token in the session for provider '${params.provider}'!"
          return
      }

      // Create the relevant authentication token and attempt to log in.
      OAuthToken oAuthToken = createAuthToken(params.provider, session[sessionKey])

      Token facebookAccessToken = (Token) session[oauthService.findSessionKeyForAccessToken('facebook')]

      def facebookResource = oauthService.getFacebookResource(facebookAccessToken ,    "https://graph.facebook.com/me?fields=id,name,verified,age_range,email")

      def facebookResponse = JSON.parse(facebookResource?.getBody())

      println facebookResponse

      ...
      ...
    }
}

public_profile (Default)

A person's public profile refers to the following properties on the user object by default:

  • id cover
  • name
  • first_name
  • last_name
  • age_range
  • link
  • gender
  • locale
  • picture
  • timezone
  • updated_time
  • verified


来源:https://stackoverflow.com/questions/27656681/how-to-get-email-id-from-facebook-using-grails-social-plugin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!