简体   繁体   English

如何在Parse的ios本机应用程序中集成第三方身份验证(facebook和twitter除外)?

[英]How to integrate third-party authentication(except facebook and twitter) in ios native app in Parse?

I'm using Parse.com, I'd like to integrate third-party authentication( except facebook and twitter), Sina weibo for example, I found no way to achieve this: 我正在使用Parse.com,我想集成第三方身份验证(除了Facebook和Twitter),例如新浪微博,我发现没有办法实现此目标:

After my app authenticated by Sina Weibo App, I got an uid and an access token, First I query the uid in Parse data, if not found, I signup with a random username and password, then my PFUser.currentUser() is not nil 我的应用程序通过新浪微博应用程序验证后,我得到了一个uid和一个访问令牌,首先我在Parse数据中查询uid,如果找不到,我使用随机的用户名和密码进行注册,那么我的PFUser.currentUser()不为nil

while what if the uid exist? 而如果uid存在怎么办? how to become a user now? 现在如何成为用户?

Here is my code: 这是我的代码:

func upsertUser(userInfo: ISSPlatformUser!){


    var query = PFQuery(className: "TokenStorage")
    query.whereKey("wb_uid", equalTo: userInfo.uid())
    query.findObjectsInBackgroundWithBlock({
        (objects: [AnyObject]!, error: NSError!) in

        println(objects)

        if( objects.count == 0 ){
            println("this account not register ")

            self.newUser(userInfo)
        }else{

            println("already register")

            var tokenData = objects[0] as PFObject
            var user = tokenData.objectForKey("user") as PFUser
            var accessToken = userInfo.credential().token()

            println("accessToken:" + accessToken)
            println("user:")
            println(user)


            if  accessToken != tokenData.objectForKey("accessToken") as NSString {
                tokenData.setObject(accessToken, forKey: "accessToken")
            }
            tokenData.saveInBackgroundWithBlock({
                (succeed: Bool!, error: NSError!) in
                if succeed! {
                    var sessionToken = user.sessionToken

                    println("sessionToken:")
                    println(sessionToken)

                    println("currentUser:")
                    println(PFUser.currentUser() )

                    PFUser.becomeInBackground(sessionToken, block: nil)



                }

            })



        }
    })

}

func newUser(userInfo: ISSPlatformUser!){
    println("new user ")
    var user = PFUser()

    var s = NSMutableData(length: 24)!
    SecRandomCopyBytes(kSecRandomDefault, UInt(s.length), UnsafeMutablePointer<UInt8>(s.mutableBytes))
    let base64str = s.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros)

    user.username = "wb_" + userInfo.uid()
    user.password = base64str
    user.signUpInBackgroundWithBlock({
        (succeed: Bool!, error: NSError!) in
        if succeed! {
            var ts = PFObject(className: "TokenStorage")
            ts.setObject(userInfo.uid(), forKey: "wb_uid")
            ts.setObject(userInfo.credential().token(), forKey: "accessToken")
            ts.setObject(user, forKey: "user")
            var acl = PFACL()
            acl.setPublicReadAccess(true)
            acl.setPublicWriteAccess(false)

            ts.ACL = acl


            ts.saveInBackgroundWithBlock(nil)
        }
    })


}

The session token is nil that can not become a user, which make me frustrated. 会话令牌为nil,无法成为用户,这使我感到沮丧。

One solution could be to sign up your user with a password you know. 一种解决方案是用您知道的密码注册用户。 For instance, to create a unique password per user, you can encode the userInfo.uid() with a constant string you keep safe. 例如,要为每个用户创建唯一的密码,可以使用安全的常量字符串对userInfo.uid()进行编码。

This way, if you find that a user is already registered, you can log in with username/password. 这样,如果您发现用户已经注册,则可以使用用户名/密码登录。

Let us know if you found a better solution. 让我们知道您是否找到了更好的解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM