0

grails アプリで Spring Security Facebook プラグインを使用しています。認証後にFacebookページから戻ると、以下のエラーメッセージが表示されます。Facebook ユーザーの詳細はデータベースに保存されません。このエラーを解決し、Facebook ユーザーを正常に認証するのを手伝ってください。前もって感謝します。

FacebookUser.groovy ドメイン クラス

class FacebookUser {

    long uid
  String accessToken
  Date accessTokenExpires

    static belongsTo = [user: User]

    static constraints = {
        uid unique: true
    }
}

spring-security-facebook アプリの Config.groovy 設定

grails.plugins.springsecurity.facebook.domain.classname='com.awnsys.gcx.FacebookUser'
grails.plugins.springsecurity.facebook.domain.appUserConnectionPropertyName = 'user'
grails.plugins.springsecurity.facebook.appId='APPID'
grails.plugins.springsecurity.facebook.secret='secretID'

grails.plugins.springsecurity.facebook.autoCreate.enabled=true
grails.plugins.springsecurity.facebook.autoCreate.roles=['ROLE_USER', 'ROLE_FACEBOOK',]

以下は、ユーザーが Facebook でアプリを受け入れた後、Facebook からリダイレクトするときにブラウザーに表示されるエラー メッセージです。

Error 500: Internal Server Error
URI : /myapp/j_spring_security_facebook_check
Class : grails.validation.ValidationException
Message : Validation Error(s) occurred during save(): - Field error in object 'com.mydomain.myapp.User' on field 'username': rejected value [facebook_100005487962357]; codes [com.mydomain.myapp.User.username.email.error.com.mydomain.myapp.User.username,com.mydomain.myapp.User.username.email.error.username,com.mydomain.myapp.User.username.email.error.java.lang.String,com.mydomain.myapp.User.username.email.error,user.username.email.error.com.mydomain.myapp.User.username,user.username.email.error.username,user.username.email.error.java.lang.String,user.username.email.error,com.mydomain.myapp.User.username.email.invalid.com.mydomain.myapp.User.username,com.mydomain.myapp.User.username.email.invalid.username,com.mydomain.myapp.User.username.email.invalid.java.lang.String,com.mydomain.myapp.User.username.email.invalid,user.username.email.invalid.com.mydomain.myapp.User.username,user.username.email.invalid.username,user.username.email.invalid.java.lang.String,user.username.email.invalid,email.invalid.com.mydomain.myapp.User.username,email.invalid.username,email.invalid.java.lang.String,email.invalid]; arguments [username,class com.mydomain.myapp.User,facebook_100005487962357]; default message [Property [{0}] of class [{1}] with value [{2}] is not a valid e-mail address]

DefaultFacebookAuthDao.groovy の 149 行目あたり

146:                    appUser.setProperty(securityConf.userLookup.passwordExpiredPropertyName, false)
147:                }
148:                AppUserDomainClazz.withTransaction {
149:                    appUser.save(flush: true, failOnError: true)
150:                }
151:            }
152:            user[appUserConnectionPropertyName] = appUser

DefaultFacebookAuthDao.groovy の 148 行目あたり

145:                    appUser.setProperty(securityConf.userLookup.accountLockedPropertyName, false)
146:                    appUser.setProperty(securityConf.userLookup.passwordExpiredPropertyName, false)
147:                }
148:                AppUserDomainClazz.withTransaction {
149:                    appUser.save(flush: true, failOnError: true)
150:                }
151:            }

FacebookAuthProvider.groovy の 67 行目あたり

64:                    log.error("Can't create user w/o access_token")
65:                    throw new CredentialsExpiredException("Can't receive access_token from Facebook")
66:                }
67:                user = facebookAuthDao.create(token)
68:                justCreated = true
69:            } else {
70:                log.error "User $token.uid doesn't exist, and creation of a new user is disabled."

FacebookAuthProvider.groovy の 67 行目あたり

64:                    log.error("Can't create user w/o access_token")
65:                    throw new CredentialsExpiredException("Can't receive access_token from Facebook")
66:                }
67:                user = facebookAuthDao.create(token)
68:                justCreated = true69:            } else {
70:                log.error "User $token.uid doesn't exist, and creation of a new user is disabled."

痕跡

Line | Method
->>  149 | doCall                in DefaultFacebookAuthDao.groovy
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    687 | withTransaction       in org.grails.datastore.gorm.GormStaticApi
|    148 | create . . . . . . .  in DefaultFacebookAuthDao.groovy
|     67 | authenticate          in FacebookAuthProvider.groovy
|     40 | attemptAuthentication in FacebookAuthRedirectFilter.groovy
|   1145 | runWorker             in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    724 | run                   in java.lang.Thread
4

2 に答える 2

0

デフォルトでは、プラグインはfacebook_%UID%(facebook_100005487962357スタックトレースから) のようなユーザー名を生成します。あなたのUserドメインは.usernameフィールドに電子メールを必要とする (そしてそのような制約がある) ようです。そのため、保存できません。

この場合、FacebookAuthService.createAppUserメソッドを実装することにより、User オブジェクトを満たすための独自のロジックを実装することをお勧めします。ドキュメントを参照してください: http://splix.github.io/grails-spring-security-facebook/guide/5%20Customization.html#5.1%20Using%20FacebookAuthService

また、Facebook 認証プラグインはユーザーの電子メールを認識しません (デフォルトでは Facebook ログインでは提供されません)。Facebook API から取得する必要があります。例を参照してください: https://github.com/splix/grails-facebook-authentication -example/blob/master/grails-app/services/FacebookAuthService.groovy#L51

于 2013-09-30T16:47:21.743 に答える
0

FacebookAuthService を実装していて、Facebook および FacebookProfile クラスがエラーでマークされるという問題がある場合は、必ず BuildConfig.groovy ファイルに 2 つのプラグインを追加してください。

compile ":spring-social-core:0.1.31"
compile ":spring-social-facebook:0.1.32"

注: Spring Social Facebook は、Spring Security Facebook と同じプラグインではありません。したがって、上記の行がある場合でも、Spring Social プラグインをコンパイルする必要があります。

compile ':spring-security-core:2.0-RC2'
compile ':spring-security-facebook:0.15.2-CORE2'
于 2014-02-02T13:58:01.660 に答える