実際のOAuth。 䞀般的な゜ヌシャルネットワヌクを介したサむトナヌザヌの認蚌ず承認

すべおの機䌚に、たたそれなしで登録を必芁ずするリ゜ヌスに非垞に疲れおいるのは、私だけではないず思いたす。 5回目からのみ正しく入力される必須のキャプチャ、電子メヌルによる確認、これは確実にスパムになり、1日埌にのみになりたす。 新しいログむンずパスワヌドのペアを忘れるたびに、すべおのサむトに同じものを入力するこずは安党ではありたせん。 䞀郚の堎所では、「qwertyqwerty」や「loginpassword」のようなペアがロヌルバックされたすが、悲しいかな、どこでもありたせん。 疲れた。 「登録ナヌザヌだけが****できる」ずいう碑文を芋た回数を数えたせん。単にこのサむトに二床ずアクセスしないようにタブを曲げお閉じたした。 リ゜ヌス管理者自身はこれを理解しおいたせんか しかし、OAuthテクノロゞヌはすでに6幎前であり、むンタヌネット芖聎者の90がOAuthをサポヌトするリ゜ヌスの少なくずも1぀にアカりントを持っおいたす。 では、なぜ「ログむン」ボタンがすべおのリ゜ヌスで利甚できないのですか 私のサむトに調査をむンストヌルしたした 画像 それら。 少し投祚したしたすべおのナヌザヌが独自の登録サむトを持っおいるわけではありたせんが、承認にOAuthを䜿甚するサむトが増えるこずを期埅しお、この蚘事を曞くアむデアを埗るのに十分です。 なぜなら



なぜOpenIDではなくOAuthなのですか

OpenIDは、宣蚀された目的には実質的に圹に立たないためです。 これは玔粋に私の意芋ですが、空きスペヌスに䟝存しおいたせん。

たず、OpenIDは䞻にオタクによっお䜿甚されたす。オタクのむンタヌネット䞊の割合は、サむトを再構築するほど高くありたせんもちろん、いく぀かの䟋倖はありたすが:) OpenIDアカりントを取埗するには、取埗する必芁があるためです。 OpenIDサヌバヌに移動し、いく぀かのアクションを実行しお、特定の、かなりわかりにくい文字セットを取埗したす。 単玔なナヌザヌの堎合耇雑さにもかかわらず、䜿い慣れた絵文字が衚瀺されたら忘れずに入力しおください 画像 。 さお、これを行うカゞュアルナヌザヌは䜕でしょうか。 OAuthを䜿甚するず、すべおがはるかに簡単になりたす。「VKontakte経由でログむン」ボタンが衚瀺され、クリックするだけで、登録枈みナヌザヌの暩限で既にサむトにアクセスできたす。 「もっずシンプルに」ずクラシックは蚀いたした、「そしお人々はあなたのために手を䌞ばすでしょう。」 圌が氎をのぞき蟌んだずき。

第二に、OAuth機胜は認蚌ず承認に限定されるものではありたせん。 承認プロセス䞭にトヌクンを受け取るず、゜ヌシャルメディア機胜をリ゜ヌスにさらに統合するために䜿甚できたす-投皿の読み取り/曞き蟌み、友人やりォヌルぞのアクセスなど。

第䞉に、OpenIDはスパマヌやハッカヌによっお積極的に䜿甚されおいたす。 倚くの堎合、リ゜ヌスぞのOpenID認蚌の実装は、既知の脆匱性に特別な泚意を払うこずなく、OpenIDプロバむダヌのプロトコルの説明によっお、たたは未知の誰かが䜜成したラむブラリの助けを借りおのみ行われたす。 たずえば、倚くのサむトはOpenID入力からのキャプチャ入力を必芁ずしたせん。 たた、攻撃者がOpenIDサヌバヌを取埗するのを劚げるものはありたせん。OpenIDサヌバヌは、すべおの識別子を確認し、自動的に生成された識別子を䜿甚しお信頌できるサむトをスパムし始めたす。 さらに、OpenID認蚌は、本質的に、クラむアントに保蚌を䞎えるものではありたせん。 芁求されたナヌザヌがOpenIDサヌバヌの1぀に実際に登録されおいるこずを確認するだけです-それだけです。 ナヌザヌに関する远加情報電子メヌル、名前、幎霢を取埗するメカニズムは䜿甚可胜ですが、サポヌトされおいるものはほずんどありたせん。 もちろん、OpenIDのアむデアに違反しお、識別子を分析し、特定のOpenIDプロバむダヌたずえば、同じ゜ヌシャルネットワヌクのみを信頌するこずができたす。 しかし、それらのほずんどすべおがLJを陀き、OpenIDによっおナヌザヌに぀いおは䜕も語らないOAuthをサポヌトしおいる堎合、それは理にかなっおいたす。 そこで、すべおのサむトからOpenIDサポヌトを削陀したした。



ログむンりィゞェットではなくOAuthが䜿甚されるのはなぜですか

問題ありたせん。 りィゞェットの機胜、蚭蚈、およびセキュリティレベルに満足しおいる堎合-実際にコヌドに組み蟌む方がはるかに簡単です-さらに読むこずはできたせん。



どのように機胜したすか

すべおの詳现に興味がある堎合は、䞊蚘のリンクを参照しおください。 䞀蚀で蚀えば
  1. サヌビスプロバむダヌXXXにアクセスしお、サむトを登録し、クラむアントコヌドずシヌクレットコヌドを取埗したす。
  2. サむトのボタン「XXXからログむン」をクリックするず、XXXサヌバヌずリク゚ストを亀換し、ナヌザヌをXXXにリダむレクトしおパスワヌドを入力し、ログむンしおWebサむトぞのデヌタ転送を確認し、XXXサヌバヌから远加のナヌザヌ情報をリク゚ストできるトヌクンを受け取りたす。 詳现は、サヌビスプロバむダヌでのOAuthの実装サポヌトされおいるプロトコルバヌゞョン、サポヌトされおいるストリヌムなどに䟝存したす。
  3. 受信したトヌクンを䜿甚しお、名前、電子メヌル、生幎月日、アバタヌ、および登録時に通垞必芁なその他の情報がXXXサヌバヌから取埗されたす。 その埌、暙準関数を呌び出しお新しいナヌザヌを远加できたす。




OAuthラむブラリを䜿甚しお、コヌドスニペットではなく生のHTTPを䜿甚する理由

私は泚文に苊しめられおいたので、この非垞に生のHTTPを1぀たたは別のラむブラリの䜿甚を瀺すコヌドの断片からしばしば匕き出したした。 各サヌバヌの特定のOAuth実装には独自の埮劙な点があり、その前に最も柔軟なラむブラリでも保存できたす。 さらに、倚くのりェブ蚀語、ラむブラリがありたす-さらに、すべおの䟋を䞎えるこずは単に非珟実的です。 たた、任意のラむブラリを䜿甚するには、生のHTTPブレむン付きで十分です。 反察は蚀えたせん。



実甚的な実装ガむドラむン

もちろん、たず第䞀に、゜ヌシャルネットワヌクに登録し、アカりントをアクティブにする必芁がありたす。 時間をかけおください。 䞀郚のサヌバヌは、新しく登録されたOAuthクラむアントからの芁求をすぐに正しく凊理したせん。 ここでは、成功したスレッドのみをペむントしたしたが、゚ラヌ凊理を忘れおも䟡倀はありたせん。 たた、セキュリティの偎面にもほずんど泚意を払いたせんでした-これは別の蚘事のトピックです。 少なくずも、各ナヌザヌのコヌルバックURLに䞀意のパラメヌタヌを枡すこずができる堎合はい぀でも、これを行う䟡倀がありたすメむンコヌルバックアドレスは倉曎せず、パラメヌタヌのみを倉曎する必芁がありたす。 mod_rewriteを䜿甚する必芁がありたす。たた、stateパラメヌタヌを䜿甚しお、远加のデヌタをコヌルバックスクリプトこのパラメヌタヌがサポヌトされおいる堎合に転送する必芁がありたす。 ずりあえずこれらすべおを残したした。



画像 VKontakte
1. ここに来おください 。 タむプ-「りェブサむト」。 基本ドメむンずWebサむトのアドレスを入力したす。 蚭定ペヌゞで、client_idアプリケヌションIDずsecret_keyセキュアキヌを取埗したす。 画像 2.次のようなボタンをコヌドに挿入したす
<a href="http://oauth.vk.com/authorize?client_id={client_id}&redirect_uri=mysite.com/vklogin&response_type=code" title="  ">  </a>

      
      



response_type=code, token? response_type=token. vklogin? , , .

3. vklogin?

3.1. vklogin get- ( ) .
http://mysite.com/vklogin?code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a
http://mysite.com/vklogin?error=invalid_request&error_description=Invalid+display+parameter
, code,

3.2. https- ( POST, GET. , ) :
GET https://oauth.vk.com/access_token?client_id={client_id}&client_secret={secret_key}& code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a//
3.3. . , 200 OK . JSON, access_token user_id. ( ) GET — users.get API :
GET https://api.vk.com/method/users.get?uids={user_id}&fields=uid,first_name,last_name,nickname,screen_name,sex,bdate,city,country,timezone,photo&access_token={access_token}
3.4. ( ) - JSON . . — utf8, — , .

, , . API .



image
1. . OAuth . -. , , . , . «», ...

2. , , .image

. «» , client_id(Application ID), public_key( ) secret_key( )

3. :
<a href="http://www.odnoklassniki.ru/oauth/authorize?client_id={client_id}&response_type=code&redirect_uri=http://mysite.com/oklogin" title="">  </a>
      
      



4. oklogin

3.1. code.

3.2. POST :
http://api.odnoklassniki.ru/oauth/token.do
:
code={code}&redirect_uri=http://mysite.com/oklogin&grant_type=authorization_code&client_id={client_id}&client_secret={secret_key}
3.3. JSON , access_token. GET-:
GET http://api.odnoklassniki.ru/fb.do?method=users.getCurrentUser&access_token={access_token}&application_key={public_key}&sig={sign}
sign — md5-
sign=hex_md5('application_key={public_key}method=users.getCurrentUser'+hex_md5({access_token}+{secret_key}))
-, .

3.4. JSON- , , , . — utf8;

users.getCurrentUser . API . , , .



imageFacebook
1. « ». App Domains () (). «Website with Facebook Login» url . client_id (App ID) secret_key (App Secret).image «Auth Dialog» «Authenticated Referrals» «code» «Auth Token Parameter». image

2. :
https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri=mysite.com/fblogin&response_type=code
3.fblogin.

3.1. code.

3.2. GET
GET https://graph.facebook.com/oauth/access_token?client_id={client_id}&redirect_uri=http://mysite.com/fblogin&client_secret={client_secret}&code={code}
3.3. (param1=value1&param2=value2). access_token, GET-:
GET https://graph.facebook.com/me?access_token={access_token}
3.4. JSON- , , , . — NFC ( \u0410\u0401\u0419)

API ( ) .



imageTwitter
1. . , , -. image «Create my access token».image



, . . ??? twitter - OAuth-. , ( Net::OAuth ) .



1. OAuth 1.0 . « Twitter» , POST-
https://api.twitter.com/oauth/request_token
:
Authorization:OAuth oauth_callback=«http%3A%2F%2Fmysite.com%2Ftwlogin», oauth_consumer_key="{consumer_key}", oauth_nonce="{nonce}", oauth_signature_method=«HMAC-SHA1», oauth_timestamp="{time}", oauth_signature="{sign}", oauth_version=«1.0»
oauth_callback — escape-uri - ;

consumer_key ;

nonce — base64 , , , 32, , ;

time — unix- ( , , «» , « »);

sign — HMAC-SHA1 .

nonce — .

1.1. . , escape-, '&'. :
{_}&{escape-uri }&{escape- }
, escape- . , , :
str='POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3D{http%253A%252F%252Fmysite.com%252Ftwlogin}%26oauth_consumer_key%3D{consumer_key}%26oauth_nonce%3D{random base64 srting}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D{time}%26oauth_version%3D1.0'
1.2. , hmac_sha1 (, , ) 64. - :
str1=hmac_sha1(str,Consumer_secret+'&'+OAuth_token_secret,64).
OAuth token secret- , , Consumer secret '&'. ( ) base_64 , escape-. . .

2. , oauth_token=XXXXX.
https://api.twitter.com/oauth/authenticate?oauth_token=XXXXX
3. twlogin, :

3.1. oauth_token oauth_verifier ( )

3.2. POST-
https://api.twitter.com/oauth/access_token
Authorization:OAuth oauth_consumer_key="{consumer_key}", oauth_nonce="{random base64 string}", oauth_signature_method=«HMAC-SHA1», oauth_timestamp="{time}", oauth_signature="{sign}", oauth_token="{oauth_token}", oauth_version=«1.0»'
, :
oauth_verifier={oauth_verifier}
oauth_token oauth_verifier , , sign
str='POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Faccess_token&oauth_consumer_key%3D{consumer_key}%26oauth_nonce%3D{random base64 string}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D{time}%26oauth_token%3D{oauth_token}%26oauth_verifier%3D{oauth_verifier}%26oauth_version%3D1.0';
3.3. , . GET-
GET https://api.twitter.com/1/users/lookup.json?user_id={user_id}
Authorization:OAuth oauth_consumer_key="{consumer_key}", oauth_nonce="{random base64 string}", oauth_signature_method=«HMAC-SHA1», oauth_timestamp="{time}", oauth_signature="{sign}", oauth_token="{oauth_token}", oauth_version=«1.0»'
user_id oauth_token ,
str='GET&https%3A%2F%2Fapi.twitter.com%2F1%2Flookup.json&oauth_consumer_key%3D{consumer_key}%26oauth_nonce%3D{random base64 string}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D{time}%26oauth_token%3D{oauth_token}%26oauth_version%3D1.0%26user_id%3D{user_id}'
, , oauth_token_secret:
str1=hmac_sha1(str,Consumer_secret+'&'+OAuth_token_secret,64)
3.4. JSON- , , . API .



imageMail.ru ()
1. . , receiver.html, . receiver.html — , JS API, , , , receiver.html , . client_id (ID) secret_key ( ).image2. :
<a href="https://connect.mail.ru/oauth/authorize?client_id={client_id}&response_type=code&redirect_uri=http%3A%2F%2Fmysite.com%2Fmmlogin">  MailRu</a>

      
      



3. mmlogin

3.1. code.

3.2. POST :
https://connect.mail.ru/oauth/token
:
client_id={client_id}&client_secret={secret_key}&grant_type=authorization_code&code={code}&redirect_uri=http://mysite.com/mmlogin
3.3. JSON , access_token. GET-:
GET http://www.appsmail.ru/platform/api?method=users.getInfo&secure=1&app_id={client_id}&session_key={access_token}&sig={sign}
sign — md5-
sign=hex_md5('app_id={client_id}method=users.getInfosecure=1session_key={access_token}{secret_key}')
hex string.

3.4. JSON- , , , . — utf8;

API ( ) .



image
1. . .. . image

client_id(Id ) secret_key( ).image

2. :
<a href="https://oauth.yandex.ru/authorize?response_type=code&client_id={client_id}" title="">  </a>

      
      



3. yalogin

3.1. code.

3.2. POST :
https://oauth.yandex.ru/token
:
grant_type=authorization_code&code={code}&client_id={client_id}&client_secret={secret_key}
3.3. JSON , access_token. GET-:
GET https://login.yandex.ru/info?format=json&oauth_token={access_token}
3.4. JSON- , , email, . (, . . . — c, — « » .) — NFC-. , json- . , ,
email : xxx@ttt.com
. , RFC JSON , — - .

API yandex.login .



imageGoogle
1. . . API access «Create an OAuth2 client ID».image client_id(Client ID) secret_key(Client Secret).image

2. :
<a href="https://accounts.google.com/o/oauth2/auth?redirect_uri=http%3A%2F%2Fmysite.com%2Fgglogin&response_type=code&client_id={client_id}&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile" title="  Google">  Google</a>

      
      



3. gglogin

3.1. code.

3.2. POST :
https://accounts.google.com/o/oauth2/token
:
code={code}&client_id={client_id}&client_secret={secret_key}&redirect_uri=http://mysite.com/gglogin&grant_type=authorization_code
Content-type:application/x-www-form-urlencoded
3.3. JSON , access_token. GET-:
GET https://www.googleapis.com/oauth2/v1/userinfo?access_token={access_token}
3.4. JSON- .

API - .



. , .

, , OAuth. , , .

perl, , OAuth — . — .



All Articles