Ранее на этой неделе я обсуждал, как
интегрировать ColdFusion и Facebook с помощью OAuth2. Я упомянул, что это было частью набора примеров, которые я сделал для Facebook, LinkedIn и Google. В сегодняшней статье я собираюсь обсудить API-интерфейс LinkedIn.
К счастью, или я должен сказать, очевидно, так как это также протокол OAuth2, код почти такой же. Я буквально взял демо-версию Facebook, скопировал ее и использовал в качестве отправной точки. Как и Facebook, LinkedIn имеет портал для разработчиков ( developer.linkedin.com ), который включает в себя документацию, а также место для регистрации приложений. Это может быть причиной путаницы для некоторых. Вы можете подумать: «Я не создаю приложение, я просто хочу подключиться к LinkedIn», но в целом и Facebook, и LinkedIn рассматривают эти «приложения» как способ определения вашего соединения с вашим сайтом к его собственному. данные.
Найти место для добавления приложения немного странно. Зайдя на портал разработчиков и войдя в систему, обратите внимание, что вы можете нажать стрелку вниз рядом с вашим именем в правом верхнем углу:
Нажмите на нее, а затем выберите API Keys.
На следующей странице нажмите «Добавить новое приложение». Форма здесь несколько пугающая. LinkedIn действительно мог бы работать лучше, особенно с использованием некоторых значений по умолчанию, так как мне не нужно было бы повторно вводить одни и те же данные каждый раз. Я бы просто занялся обязательными полями. После настройки вы захотите записать свои ключи OAuth. Все, что вас волнует, это ключ API и секретный ключ:
Теперь мы можем перейти к коду. Как и прежде, наш процесс будет одним из следующих: представить ссылку. Пользователи переходят на LinkedIn. Пользователь отправляется обратно с секретными жетонами добра. Мы получили еще один токен. Тогда у нас есть возможность совершать вызовы API. (Напомним, что и это, и предыдущее демо были написаны для ColdFusion 8. Отсюда и компоненты на основе тегов.)
Во-первых, Application.cfc — относительно точное зеркало кода Facebook.
<cfcomponent output="false">
<cfset this.name = "cfb8linkedin">
<cfset this.sessionManagement = true>
<cffunction name="onApplicationStart" output="false">
<cfset application.linkedin = structNew()>
<cfset application.linkedin.apikey = "beer">
<cfset application.linkedin.secretkey = "isreallygood">
</cffunction>
<cffunction name="onRequestStart" output="false">
<cfif isDefined("url.init")>
<cfset onApplicationStart()>
</cfif>
</cffunction>
</cfcomponent>
Далее код index.cfm. Опять же, я представляю ссылку, которую, я предполагаю, мой пользователь нажмет. Это основано на проверке переменной сеанса, которая будет определена, когда пользователь завершит процесс OAuth.
<cfif not isDefined("session.licode")>
<cfif isDefined("url.startli")>
<cfset session.state = createUUID()>
<cfset redirurl = urlEncodedFormat("http://localhost/testingzone/cf8linkedin/redir.cfm")>
<cfset liURL = "https://www.linkedin.com/uas/oauth2/authorization?response_type=code" &
"&client_id=#application.linkedin.apikey#&scope=r_basicprofile%20r_network%20w_messages" &
"&state=#session.state#&redirect_uri=#redirurl#">
<cflocation url="#liURL#" addToken="false">
</cfif>
<a href="?startli=1">Login with LinkedIn</a>
<cfelse>
This is a LI user.
<cfset session.liAPI = createObject("component","linkedin").init(session.liaccesstoken)>
<cfdump var="#session.liAPI.getMe()#" label="me" expand="false">
<cfdump var="#session.liAPI.getFriends(count=40)#" label="friends">
</cfif>
Как и прежде, наши ссылки содержат часть наших данных доступа, список разрешений, а также URL-адрес, указывающий, куда пользователь отправляется обратно. Вероятно, единственная интересная вещь здесь — это сфера. Это отражает разрешения и изменит подсказку, которую видит пользователь. Вы хотите изменить это в зависимости от ваших потребностей.
Как только ссылка нажата, пользователь увидит что-то вроде этого:
Теперь давайте посмотрим на redir.cfm. Опять же, это практически идентично коду Facebook, за исключением того, что их результат для токена доступа красиво отформатирован в JSON, а не в виде строки, которую нужно анализировать вручную.
<cfif isDefined("url.code") and url.state is session.state>
<cfset session.licode = url.code>
<cfset redirurl = urlEncodedFormat("http://localhost/testingzone/cf8linkedin/redir.cfm")>
<cfset liAccessTokenURL = "https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code" &
"&code=#session.licode#&redirect_uri=#redirurl#" &
"&client_id=#application.linkedin.apikey#" &
"&client_secret=#application.linkedin.secretkey#">
<cfhttp url="#liAccessTokenURL#">
<cfif isJSON(cfhttp.filecontent)>
<cfset res = deserializeJSON(cfhttp.filecontent)>
<cfset session.liaccesstoken = res.access_token>
<cflocation url="index.cfm" addtoken="false">
<cfelse>
<!---
This is an error case.
--->
<cfdump var="#cfhttp#">
</cfif>
<cfelseif isDefined("url.error_reason")>
<!--- Handle error here. Variables are:
url.error_reason and error_description
--->
</cfif>
Если все работает, пользователь отправляется обратно на страницу index.cfm. Если вы помните, я вызвал компонент linkedin, который инициализирован с моим токеном доступа. Я построил три метода для этого ХФУ. Один для получения пользовательских данных, один для друзей и один для отправки сообщений. Чтобы было ясно, их API поддерживает больше, но это все, что хотел мой друг, так что это все, что я построил. Вот этот компонент.
<cfcomponent output="false"> <cffunction name="init" access="public" returnType="linkedin" output="false"> <cfargument name="accesstoken" type="string" required="true"> <cfset variables.accesstoken = arguments.accesstoken> <cfreturn this> </cffunction> <cffunction name="getFriends" access="public" returnType="struct" output="false"> <cfargument name="start" type="numeric"> <cfargument name="count" type="numeric"> <cfset var httpResult = ""> <cfset var theURL = "https://api.linkedin.com/v1/people/~/connections?oauth2_access_token=#session.liaccesstoken#"> <cfif structKeyExists(arguments,"start") and isNumeric(arguments.start)> <cfset theURL &= "&start=#arguments.start#"> </cfif> <cfif structKeyExists(arguments,"count") and isNumeric(arguments.count)> <cfset theURL &= "&count=#arguments.count#"> </cfif> <cfhttp url="#theURL#" result="httpResult"> <cfhttpparam type="header" name="x-li-format" value="json"> </cfhttp> <cfreturn deserializeJSON(httpResult.fileContent)> </cffunction> <cffunction name="getMe" access="public" returnType="struct" output="false"> <cfset var httpResult = ""> <cfhttp url="https://api.linkedin.com/v1/people/~?oauth2_access_token=#variables.accesstoken#" result="httpResult"> <cfhttpparam type="header" name="x-li-format" value="json"> </cfhttp> <cfreturn deserializeJSON(httpResult.fileContent)> </cffunction> <cffunction name="sendMessage" access="public" returnType="boolean" output="false"> <cfargument name="recipients" type="any" required="true"> <cfargument name="subject" type="string" required="true"> <cfargument name="body" type="string" required="true"> <cfset var httpResult = ""> <cfset var x = ""> <cfset var m = structNew()> <cfset var recips = arrayNew(1)> <cfif not isArray(recipients)> <cfset arrayAppend(recips, recipients)> <cfelse> <cfset recips = recipients> </cfif> <cfset m["recipients"] = structNew()> <cfset m["recipients"]["values"] = arrayNew(1)> <cfloop index="x" from="1" to="#arrayLen(recips)#"> <cfset m["recipients"]["values"][x] = structNew()> <cfset m["recipients"]["values"][x]["person"] = structNew()> <cfset m["recipients"]["values"][x]["person"]["_path"] = "/people/#recips[x]#"> </cfloop> <cfset m["subject"] = arguments.subject> <cfset m["body"] = arguments.body> <cfhttp url="https://api.linkedin.com/v1/people/~/mailbox?oauth2_access_token=#session.liaccesstoken#" method="post" result="httpResult"> <cfhttpparam type="header" name="x-li-format" value="json"> <cfhttpparam type="body" value="#serializeJSON(m)#"> </cfhttp> <cfreturn httpResult.responseHeader["Status_Code"] eq 201> </cffunction> </cfcomponent>
Наслаждаться. Дайте знать, если у вас появятся вопросы. Завтра я напишу третью запись в серии. В этой записи будет рассказано, как аутентифицировать пользователей с помощью Google.



