AWSCognito Facebook登录Swift

时间:2018-03-21 16:29:31

标签: swift amazon-web-services facebook-login aws-cognito

我尝试使用AWSCognito登录Facebook Access令牌。

我的身份库已设置&我有Facebook Access Token。

不幸的是,文档对此非常有限。有没有人成功让Facebook用户使用AWSCognito登录?

到目前为止,我有;

let provider: Dictionary = [AWSIdentityProviderFacebook : accessToken.authenticationToken]
let credentialProvider = AWSCognitoCredentialsProvider(regionType: .EUWest2, identityPoolId: POOL_IDENTITY_STRING)

我假设我需要在某个地方传递提供者。

我试图这样做;

credentialProvider.identityProvider.logins() = provider

但我得到:"无法分配值:函数调用返回不可变值"

1 个答案:

答案 0 :(得分:0)

是的,我最近做了这样的事情。

您需要使用身份提供程序管理器初始化凭据提供程序。

const cont = x =>
  k => k (x)

const infix = f => x =>
  cont (f (x))

const apply = x => f =>
  cont (f (x))

const identity = x =>
  x

const empty =
  Symbol ()
  
const evaluate = ([ token = empty, ...rest], then = cont (identity)) => {
  if (token === empty) {
    return then
  }
  else {
    switch (token) {
      case "+":
        return evaluate (rest, then (infix (x => y => x + y)))
      case "x":
        return evaluate (rest, then (infix (x => y => x * y)))
      case "/":
        return evaluate (rest, then (infix (x => y => x / y >> 0)))
      default:
        return evaluate (rest, then (apply (Number (token))))
    }
  }
}

const parse = program =>
  program.split (/(\D+)/)
  
const exec = program =>
  evaluate (parse (program)) (console.log)

exec ('')             // 0
exec ('1')            // 1
exec ('1+2')          // 3
exec ('1+2+3')        // 6
exec ('1+2+3x4')      // 24
exec ('1+2+3x4/2')    // 12
exec ('12+345x6/789') // 2

但是,您不能只将字典credentialsProvider = AWSCognitoCredentialsProvider( regionType: xxx, identityPoolId: yyy, identityProviderManager: idpm) 作为第三个参数传入。

您需要符合AWSIdentityProviderManager协议的东西,它基本上只返回返回字典的任务。

我最终为此制作了一个简单的包装类,见下文。

["graph.facebook.com" : <access token>]

那么,您的代码将被重写:

import AWSCognito
class myIdentityProvider: NSObject, AWSIdentityProviderManager {

var keytokens: [String:String]?

init (logins: [String:String]) {
    keytokens = logins
}

func logins () -> AWSTask<NSDictionary> {

    let task = AWSTask(result: keytokens as AnyObject?)
    return task as! AWSTask<NSDictionary>
}

}