Brian F爱
Learn from a Google Developer Expert focused on Angular, Web Technologies, and Node.js from Portland, OR.
广告 ·UL.timatecourses.com
Learn Angular the right way with Ultimate Courses“></a>
          </div>
          <article class=

Twitter登录使用OAuth和ColdFusion

Enabling your users to authenticate to your website using a popular social media service such as Facebook or Twitter can increase your sign-up conversion rates.已被证明减少了太多的选择可以减少转换率,因为它为您的用户提供了太多选择,可以导致复杂性或混乱。但是,在您的注册页面上有一个或两个社交媒体注册链接是一件好事。

那么,我们如何使用Twitter按钮添加登录到我们的网站?这并不难。我们将使用我在Github上共享的OAuth 1.0包,使其更轻松。OAuth身份验证遵循三步认证过程:

  • 获取申请请求令牌。
  • 使用提供请求令牌重定向用户到Twitter身份验证页面。Twitter处理身份验证和应用程序批准步骤,然后在成功登录后将用户发送回我们的网站。
  • 使用Request令牌和另一个数据(oauth_verifier),我们可以获取可用于后续API请求的访问令牌。

创建Twitter应用程序

本教程的先决条件是您拥有拨出并配置的Twitter应用程序,并且您已获得消费者钥匙消费者秘密价值观。

我已经有了一个推特申请

如果您已创建了Twitter应用程序,则应意识到这两个可能的问题。

  • You must enter the Callback URL. It is just a placeholder, so it doesn't really matter what you enter here. But, you must enter something, and not "localhost".
  • 你必须检查一下允许使用此应用程序使用Twitter登录checkbox.
  • You must copy and paste the消费者钥匙消费者秘密值s from theAPI键P.age into the example files located in the examples folder: twitter.cfm, twitterCallback.cfm和Twitter.verify_credentials.cfm.

我没有创建推特申请

如果您尚未创建Twitter应用程序,则需要在继续之前创建一个。以下是创建和配置新应用程序所需的步骤。

  • Sign into theTwitter开发人员网站
  • Application Management然后点击Create New App
  • 注意,你必须提供一个Callback URL。Don't worry about getting it right, it's just a placeholder. We will customize our request to specify the callback URL. Further, it will not let you enterlocalhost,只需输入一个有效域的东西。这里提供的回调URL非常毫无意义,但需要。
  • After your application is created, copy and paste the消费者钥匙消费者秘密值s from theAPI键P.age into the example files located in the examples folder: twitter.cfm, twitterCallback.cfm和Twitter.verify_credentials.cfm.
  • Next, go to theSettingsfor your application and check the允许使用此应用程序使用Twitter登录复选框,然后单击更新设置
  • 最后,重新加载此页面,然后单击“使用Twitter”按钮登录。

Obtain Request Token

既然我们拥有一切设置,让我们走过必要的代码来设置我们的请求并从Twitter API获取请求令牌。

<cfsilent.><cfset.消费者=><cfset.消费者_秘书=><cfset.打回来=http://localhost/oauth/examples/twitter_callback.cfm.>cfsilent.>

在上面的代码中,我们已宣布三个常量来持有我们OAuth请求所需的信息。应根据Twitter应用程序API键和本地环境设置基于Twitter应用程序的定制。该打回来constant is the URL that will receive the user authentication information after the user has logged into Twitter.

<cfset.oAuthRequest=newcom.brianflove.oauth.request()><cfset.oAuthConsumer=newcom.brianflove.oauth.consumer()><cfset.oauthtoken.=newcom.brianflove.oauth.Token()><cfset.oauthConsumer.setSecret(CONSUMER_SECRET)><cfset.oauthconsumer.setKey(Confumer_Key)><cfset.oAuthRequest.setMethod("POST")><cfset.oAuthRequest.setCallback(CALLBACK)><cfset.oauthrequest.setConsumer(OAuthConsumer)><cfset.oAuthRequest.setToken(oAuthToken)>

接下来,我们创建OAuth请求对象,并配置它以使POST请求/ oauth / request_token服务。I am not diving too much into the details of this code, as I explained this in my使用OAuth 1.0发布我创建的项目。

<cfset.signatureMethod=newcom.brianflove.oauth.methods.hmacsha1signaturemethod()><cfset.oauthrequest.signwithsignaturemethod(signaturemethod.=signatureMethod)>

Next, we sign the request using the HMAC-SHA1 signing method. We are now ready to make our HTTP request to the Twitter API.

<cfset.httprequest=newhttp()><cfset.httprequest。setUrl(oAuthRequest.toUrl())><cfset.httprequest.setmethod(oauthrequest.getmethod())><cfset.httprequest。addParam(type=标题名称=Authorization=oAuthRequest.toHeader())><cfset.httprequest.setcharset(“UTF-8”)><cfset.httpResult=httprequest.send()。getPrefix()>

In setting up the HTTP request we need to ensure that we use the same HTTP method to match our请求组态。因此,我们将方法和URL参数值拉回请求目的。然后我们需要将授权标题添加到请求中。授权标题很容易从中获取请求。toHeader()method.

<!---验证状态代码---><CFIF.httpresult.responseHeader.status_code.neq200.><P.>有一个错误。状态代码表示获取请求令牌的错误。P.><cfabort.>CFIF.><CFIF.Len(httpResult.fileContent)><P.>有一个错误。没有返回响应内容。P.><cfabort.>CFIF.>

在制作HTTP请求之后,我们应该验证结果是否成功。响应的状态代码应该是200,我们应该使用OAuth_Token值接收响应正文。现在,让我们继续前进并将响应解析为可以用于存储令牌值的结构。

<!---解析结果---><cfset.参数={}><cfset.=ListToArray(httpResult.fileContent,“&")><cfloop阵列=#对#index=><cfset.参数[key]=>cfloop>

After parsing the response, again we should verify that everything is correct before storing the token value in our user's session.

<!---验证oauth_token ---><CFIF.StructKeyExists(parameters,“oauth_token”)><P.>有一个错误。Token was not returned.P.><cfabort.>CFIF.><CFIF.StructKeyExists(parameters,“oauth_callback_confirmed”)要么(SructKeyExists(参数,“oauth_callback_confirmed”)IsBoolean(parameters.ouuth_callback_confirmed))要么(SructKeyExists(参数,“oauth_callback_confirmed”)IsBoolean(parameters.oauth_callback_confirmed)参数。oauth_callback_confirmed)><P.>有一个错误。该callback was not confirmed.P.><cfabort.>CFIF.><!---商店请求令牌关键和秘密---><cfset.oauthtoken.setKey(参数.oauth_token)><CFIF.StructKeyExists(parameters,“oauth_token_secret”)><cfset.oauthtoken.setseCRET(参数.oauth_token_secret)>CFIF.><cfset.session.token.=oauthtoken.>

最后,用户被重定向到Twitter/ oauth /验证页。Twitter处理其网站上的用户身份验证和应用程序批准过程。成功验证和批准我们的应用程序后,用户将被重定向到我们的网站上我们设置的URL打回来不变。

<cflocation.url=https://api.twitter.com/oauth/authenticate?oauth_token=#parameters.oauth_token#statuscode.=302addtoken.=>

Process Callback

When the user is redirected back to our callback script, we should first verify the request to ensure it is a valid request from our user. I am going first verify that I have the token stored in the user's session. Next, I will verify that theoauth_token.URL parameter was passed back to the callback. Then we verify that the token provided as a URL parameter matches what I have stored in the user's session. Last, we verify that theoauth_verifierURL parameter was also provided.

<!---验证我们在用户的会话中有令牌对象 - ><CFIF.structkeyexists(会议,“令牌”)><P.>有一个错误。在会话范围内找不到令牌对象。P.><cfabort.>CFIF.><CFIF.StructKeyExists(url,“oauth_token”)要么(structkeyexists(URL,“oauth_token”)len(url.oauth_token))><P.>有一个错误。Authentication token not returned.P.><cfabort.>CFIF.><!---验证我们拥有的令牌和所提供的令牌是相同的---><CFIF.session.token.getkey()nequrl.oauth_token><P.>有一个错误。身份验证令牌和会话令牌不匹配。P.><cfabort.>CFIF.><CFIF.StructKeyExists(url,“oauth_verifier")要么(structkeyexists(URL,“oauth_verifier")Len(URL.oauth_verifier))))><P.>有一个错误。身份验证验证程序未返回。P.><cfabort.>CFIF.>

获取访问令牌

验证后,我们都在我们的回调代码中传递,我们希望使用oauth_verifierstring to obtain the access token for the user. To do that, we will create another OAuth Request instance to send a POST HTTP request to theOAuth / Access_Token.服务。

<cfset.oAuthRequest=newcom.brianflove.oauth.request()><cfset.oAuthConsumer=newcom.brianflove.oauth.consumer()><cfset.oauthConsumer.setSecret(CONSUMER_SECRET)><cfset.oauthconsumer.setKey(Confumer_Key)><cfset.oAuthRequest.setMethod("POST")><cfset.oauthrequest.setConsumer(OAuthConsumer)><cfset.oauthrequest.settoken(session.token)><cfset.oAuthRequest.addParameter(key=oauth_verifier=url.oauth_verifier)><cfset.signatureMethod=newcom.brianflove.oauth.methods.hmacsha1signaturemethod()><cfset.oauthrequest.signwithsignaturemethod(signaturemethod.=signatureMethod)>

请注意,我使用向回调脚本提供的值添加了附加的oauth_verifier参数。再次,我们使用HMAC-SHA1签名方法签署了请求。现在,让我们继续发送请求。

<cfset.httprequest=newhttp()><cfset.httprequest。setUrl(oAuthRequest.toUrl())><cfset.httprequest.setmethod(oauthrequest.getmethod())><cfset.httprequest。addParam(type=标题名称=Authorization=oAuthRequest.toHeader())><cfset.httprequest。addParam(type=标题名称=内容类型=application/x-www-form-urlencoded><cfset.httprequest。addParam(type=body=oauth_verifier =#url.oauth_verifier#><cfset.httprequest.setcharset(“UTF-8”)><cfset.httpResult=httprequest.send()。getPrefix()>

在上面的代码中我设定了内容类型标题值以根据需要匹配表单帖子。我也包括oauth_verifierP.arameter as the body of the request. Next, we verify the request response and parse the values returned.

<!---验证状态代码---><CFIF.httpresult.responseHeader.status_code.neq200.><P.>有一个错误。状态代码表示获取请求令牌的错误。P.><cfabort.>CFIF.><CFIF.Len(httpResult.fileContent)><P.>有一个错误。没有返回响应内容。P.><cfabort.>CFIF.><!---解析结果---><cfset.参数={}><cfset.=ListToArray(httpResult.fileContent,“&")><cfloop阵列=#对#index=><cfset.参数[key]=>cfloop>

解析后验证的值oauth_token.oauth_token_secret.提供了值。剩下的所有这些都是将这些值存储到用户的会话令牌对象中,以便我们可以将它们在后续请求中使用它们到Twitter API。

<!---验证oauth_token ---><CFIF.StructKeyExists(parameters,“oauth_token”)><P.>有一个错误。Token key was not returned.P.><cfabort.>CFIF.><!---验证oauth_token_secret ---><CFIF.StructKeyExists(parameters,“oauth_token_secret”)><P.>有一个错误。令牌秘密没有退回。P.><cfabort.>CFIF.><cfset.session.token.setKey(parameters.oauth_token)><cfset.session.token.。setSecret(parameters.oauth_token_secret)>

Verify User Credentials

用户现在使用Twitter进行身份验证,我们已准备好向他们展示我们的应用程序的UI。但是,在打电话完成之前,我们可能希望获取有关我们新用户的一些信息,例如他们的名称和Twitter用户名。

要验证用户凭据,我们将获得一个要求请求/1.1/account/verify_credentials.json服务。此服务将使用JSON返回数据,我们可以轻松消耗。此最终步骤假定您已完成上一步,并将存储在用户会话中的令牌对象。

首先,我们设置了我们的请求实例并签名请求。现在应该开始非常熟悉。:)

<cfset.oAuthRequest=newcom.brianflove.oauth.request()><cfset.oAuthConsumer=newcom.brianflove.oauth.consumer()><cfset.oauthtoken.=newcom.brianflove.oauth.Token()><cfset.oauthConsumer.setSecret(CONSUMER_SECRET)><cfset.oauthconsumer.setKey(Confumer_Key)><cfset.oauthrequest.setmethod(“get”)><cfset.oauthrequest.setConsumer(OAuthConsumer)><cfset.oauthrequest.settoken(session.token)><cfset.signatureMethod=newcom.brianflove.oauth.methods.hmacsha1signaturemethod()><cfset.oauthrequest.signwithsignaturemethod(signaturemethod.=signatureMethod)>

接下来,我们将HTTP请求发送到Twitter API并解析JSON响应。

<cfset.httprequest=newhttp()><cfset.httprequest。setUrl(oAuthRequest.toUrl())><cfset.httprequest.setmethod(oauthrequest.getmethod())><cfset.httprequest。addParam(type=标题名称=Authorization=oAuthRequest.toHeader())><cfset.httprequest.setcharset(“UTF-8”)><cfset.httpResult=httprequest.send()。getPrefix()><!---解析JSON响应---><cfset.证书=desializeJson(httpResult.fileContent)>

现在我们有数据,这取决于你该怎么办。最有可能您希望将此数据持续到您的数据库。目前,我只是将输出推特提供的一些值。

<CFOUTPUT.><H1.>hello#credentials.name#H1.><P.>这是一些关于你的数据。P.><UL.><li>您的Twitter ID:#cyrentials.id#li><li>Your Twitter username: #credentials.screen_name#li><li>你有#cyrentials.followers_count#粉丝li><li>You have tweeted #credentials.statuses_count# timesli>UL.>CFOUTPUT.>

下载

You can read more about using my OAuth 1.0 package with ColdFusion, which might explain some more of this code in greater detail. The complete source code for this tutorial is available in theexamplesfolder of the project download.

Don't forget to configure your application and paste in theConsumer_KeyConsumer_Secretstrings.

Brian F爱

Hi, I'm Brian. I am interested in TypeScript, Angular and Node.js. I'm married to my best friend Bonnie, I live in Portland and I ski (a lot).