首页 > 解决方案 > 尝试在 ios 中使用 Firebase Twitter 身份验证获取 Twitter 的访问令牌

问题描述

这是用于登录 Twitter 帐户的代码。我能够登录并被重定向到应用程序,但我无法检索正确的访问令牌(如 twitter api 页面上所说的不记名令牌)。我得到一个包含访问令牌的 AuthDataResult,但是当用于进行 api 调用时它不起作用。

final class AuthManager{


var isSignedIn:Bool{
    return firebase.currentUser != nil
}

static let shared = AuthManager()
var provider:OAuthProvider? 
let firebase = Auth.auth()

public func handleAuthentication(){
    provider = OAuthProvider(providerID: "twitter.com")
    provider?.getCredentialWith(nil) { (credential, err) in
        if err != nil {
            
        }
       
            guard let cred  = credential else {return}

            self.firebase.signIn(with: cred) { (data, err) in
                
                if err != nil {
                    print(err?.localizedDescription as Any)
                }
                
                if data != nil {
                    let newCred:OAuthCredential = data?.credential as! OAuthCredential

                    print(newCred.accessToken)
                    print(newCred.idToken) //-> nil
                    print(newCred.secret)
                

                
                }
                
            }
        
    }
    

我使用访问令牌进行 api 调用,但收到错误消息,提示未经授权的调用。

func getTweet(accessToken:String){
        guard let apiUrl = URL(string: "https://api.twitter.com/2/tweets/1261326399320715264") else {return}
        var request = URLRequest(url: apiUrl)
        request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        request.httpMethod = "GET"
        request.timeoutInterval = 30
        
        let task = URLSession.shared.dataTask(with: request) { (data, res, err) in
            
            guard let data  = data else {return}
            do{
                let resutl = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                print(resutl)
            }
            catch{
                print(error.localizedDescription)
            }
        }
        
        task.resume()
    }

标签: swiftfirebasetwitterfirebase-authenticationtwitter-oauth

解决方案


不记名令牌不同于用户访问令牌。当前版本的 Twitter API 中的不记名令牌用于验证应用程序上下文,其生成方式与用户访问令牌不同。Firebase 登录通常用于获取用户访问令牌,该令牌对用户进行身份验证。您不能互换使用这些值,这就是您在尝试调用 API 时遇到身份验证错误的原因。

您可以通过将使用者密钥和秘密(也称为 API 密钥和秘密)传递给 Twitter API 来获取不记名令牌,如下所示(使用 curl 的示例)

curl -u "$CONSUMER_KEY:$CONSUMER_SECRET" --data 'grant_type=client_credentials' 'https://api.twitter.com/oauth2/token'


推荐阅读